首先是最底层驱动:

在这里插入代码片
void delay(u16 count)
{while(count--){}
}
void lcd_load_1byte(u8 data,u8 mode)
{u8 i=0;u8 buf;if(mode==0)//命令{for(i=0;i<8;i++){buf=data&0x01;switch(i){case 0:if(buf==1)DB0_H;elseDB0_L;break;case 1:if(buf==1)DB1_H;elseDB1_L;  break;case 2:if(buf==1)DB2_H;elseDB2_L;   break;case 3:if(buf==1)DB3_H;elseDB3_L;   break;case 4:if(buf==1)DB4_H;elseDB4_L;   break;case 5:if(buf==1)DB5_H;elseDB5_L;   break;case 6:if(buf==1)DB6_H;elseDB6_L;   break;  case 7:if(buf==1)DB7_H;elseDB7_L;                 break;default:break;}data>>=1;}
}if(mode==1)//数据{for(i=0;i<8;i++){buf=data&0x01;switch(i){case 7:if(buf==1)DB0_H;elseDB0_L;break;case 6:if(buf==1)DB1_H;elseDB1_L; break;case 5:if(buf==1)DB2_H;elseDB2_L;   break;case 4:if(buf==1)DB3_H;elseDB3_L;   break;case 3:if(buf==1)DB4_H;elseDB4_L;   break;case 2:if(buf==1)DB5_H;elseDB5_L;   break;case 1:if(buf==1)DB6_H;elseDB6_L;   break;  case 0:if(buf==1)DB7_H;elseDB7_L;                 break;      default:break;} data>>=1;    }
}
}//发送命令
void lcd_Cmd(u8 cmd)
{//Lcd_E_L;lcd_load_1byte(cmd,0);Lcd_Mode_Cmd; delay(LcdBaseDelay);Lcd_E_H;delay(LcdBaseDelay);Lcd_E_L;delay(LcdBaseDelay);
}//发送数据
void lcd_Data(u8 data)
{//Lcd_E_L;Lcd_Mode_Data; lcd_load_1byte(data,1);   delay(LcdBaseDelay);Lcd_E_H;delay(LcdBaseDelay);Lcd_E_L;delay(LcdBaseDelay);
}//屏幕关
void lcd_Off()
{lcd_Cmd(62);
}//屏幕开
void lcd_On()
{lcd_Cmd(63);
}//设置起始行
void lcd_Set_FirstLine(u8 hang)
{u8 data=0;if(hang>63)return;data=hang+192;lcd_Cmd(data);
}//设置页地址,8行为一页
void lcd_Set_X(u8 x)
{u8 data=0;if(x>7)return;data=x+184;lcd_Cmd(data);
}//设置列
void lcd_Set_Y(u8 y)
{u8 data=0;if(y>127)return;if(y>=64){lcd_Left_En;y-=64;}else{lcd_Right_En;}data=y+64;lcd_Cmd(data);
}```

然后是 应用驱动:

u16 FindWord8(char *data)
{for(u8 i = 0;i<Word8num;i++){if((*data)==Word8Ascii[i][0]){return i;}}return 0xffff;
}u16 FindWord16(char *data)
{for(u8 i = 0;i<Word16num;i++){if(((*data)==Word16Ascii[i][0])&&((*(data+1))==Word16Ascii[i][1])){return i;}}return 0xffff;
}void lcd_8x16(u8 x,u8 y,u16 num)
{u8 xdebug=0;xdebug=x;if(y==64){switch(x){case 0:xdebug=2;break;case 2:xdebug=4;break;case 4:xdebug=6;break;case 6:xdebug=0;break;default:break;}}lcd_Set_X(xdebug);lcd_Set_Y(y);for(u8 i=0;i<8;i++){if(lcd_Invert(1,x,0,y+i,0)==1){lcd_Data(~Word8[num][i]);}else{lcd_Data(Word8[num][i]);}}lcd_Set_X(x+1);lcd_Set_Y(y);for(u8 i=0;i<8;i++){if(lcd_Invert(1,x,0,y+i,0)==1){lcd_Data(~Word8[num][i+8]);}else{lcd_Data(Word8[num][i+8]);}}
}void lcd_16x16(u8 x,u8 y,u16 num)
{u8 xdebug=0;xdebug=x;if(y==64){switch(x){case 0:xdebug=2;break;case 2:xdebug=4;break;case 4:xdebug=6;break;case 6:xdebug=0;break;default:break;}}lcd_Set_X(xdebug);lcd_Set_Y(y);for(u8 i=0;i<16;i++){if(lcd_Invert(1,x,0,y+i,0)==1){lcd_Data(~Word16[num][i]);}else{lcd_Data(Word16[num][i]);}}lcd_Set_X(x+1);lcd_Set_Y(y);for(u8 i=0;i<16;i++){if(lcd_Invert(1,x,0,y+i,0)==1){lcd_Data(~Word16[num][i+15]);//字库少了2个字节的0,所以这里不是16}else{lcd_Data(Word16[num][i+15]);}}
}//x 0-7 y 0-3 str为字符串
void lcd_Write(u8 y,u8 x,char *str)
{u8 len=0;u16 side=0;u8 WordType=0;u8 Y=0;Y=8*y;char *p;p=str;if(x>3||y>7)return;x=x+x;again: side=FindWord8(p);if(side==0xffff){side=FindWord16(p);if(side==0xffff){return;}else{WordType=16;}                }else{WordType=8;} if(WordType==8){p++; len++;lcd_8x16(x,Y,side);if(Y<=119){Y+=8;}}else if(WordType==16){p+=2;  len+=2;lcd_16x16(x,Y,side);if(Y<=111){Y+=16;}} else{return;}if(len<16){if(*p=='\0') {p-=1;*p=' ';}goto again;}}//清空屏幕
void lcd_clear()
{
lcd_Write(0,0,"                ");
lcd_Write(0,1,"                ");
lcd_Write(0,2,"                ");
lcd_Write(0,3,"                ");
}//初始化屏幕
void lcd_init()
{
//  Lcd_RST_H;
//  delay(60000);Lcd_E_H;Lcd_RST_L;delay(LcdBaseDelay*25);Lcd_RST_H;delay(LcdBaseDelay*25);Lcd_CS1_H;Lcd_CS2_HLcd_Mode_Cmd;lcd_Cmd(63);lcd_Set_FirstLine(0);lcd_clear();Lcd_BCAKLIGHT_OPEN;lcd_SetInvertLine(5);//Lcd_BCAKLIGHT_CLOSE
//  lcd_Data(0xff);
}
//cmd=0,设置反显区域  cmd=1,查询是否处于反显区域,cmd=2 清除设置的区域
//返回1 查询成功
u8 lcd_Invert(u8 cmd,u8 x1,u8 x2,u8 y1,u8 y2)
{static u8 X1,X2,Y1,Y2=0;static u8 InvertEnable=0;if(cmd==2){InvertEnable=0;return 0;}if(cmd==0){X1=x1;X2=x2;Y1=y1;Y2=y2;InvertEnable=1;}if(cmd==1&&InvertEnable==1){if(x1>=X1&&x1<=X2&&y1>=Y1&&y1<=Y2){return 1;}}else{return 0;}return 0;
}//设置某行反显 x<4
void lcd_SetInvertLine(u8 x)
{switch(x){case 0:lcd_Invert(0,0,1,0,127);break;case 1:lcd_Invert(0,1,2,0,127);break;case 2:lcd_Invert(0,3,4,0,127);break;case 3:lcd_Invert(0,5,6,0,127);break;default:lcd_Invert(2,0,0,0,0);break;}
}//主菜单设置反显
void lcd_MainMenuSetInvert(u8 x)
{switch(x){case 0:lcd_Invert(0,3,4,0,63);break;case 1:lcd_Invert(0,3,4,64,127);break;case 2:lcd_Invert(0,5,6,0,63);break;case 3:lcd_Invert(0,5,6,64,127);break;default:lcd_Invert(2,0,0,0,0);break;}}

然后是字库的格式

#define Word16num 2//文字个数
#define Word8num 18 //文字个数
const char Word16Ascii[Word16num][2]={"系","统"};
const char Word8Ascii[Word8num][1]=
{"0","1","2","3","4","5","6","7","8","9"," ","A","B","C","N",":","V","W",
};
const unsigned char  Word16[Word16num][32]=
{
/*--  文字:  系  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=15x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=15x16  --*/{
0x00,0x00,0x40,0x44,0x4D,0x55,0x66,0x44,0x84,0x88,0x92,0x81,0x00,0x00,0x00,0x00,
0x00,0x88,0x90,0xA0,0x84,0x84,0xFC,0x80,0x80,0xA0,0x90,0xC8,0x00,0x00,},/*--  文字:  统  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=15x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=15x16  --*/{
0x00,0x19,0x2A,0xCC,0x18,0x00,0x11,0x13,0x9D,0x51,0x11,0x15,0x13,0x10,0x00,0x00,
0x88,0x88,0x90,0x90,0x04,0x08,0x30,0xC0,0x00,0xF8,0x04,0x84,0x1C,0x00,}
}
const unsigned char  Word8[Word8num][16]=
{
/*--  文字:  0  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,},
/*--  文字:  1  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,},/*--  文字:  2  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x0C,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x18,0x28,0x48,0x88,0x08,0x18,0x00,},/*--  文字:  3  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x0C,0x10,0x11,0x11,0x12,0x0C,0x00,0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,},/*--  文字:  4  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x01,0x02,0x04,0x1F,0x00,0x00,0x00,0x00,0xC0,0x40,0x48,0xF8,0x48,0x48,0x00,},/*--  文字:  5  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x1F,0x11,0x12,0x12,0x12,0x11,0x00,0x00,0x30,0x08,0x08,0x08,0x08,0xF0,0x00,},/*--  文字:  6  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x07,0x08,0x11,0x11,0x19,0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x08,0xF0,0x00,},/*--  文字:  7  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x1C,0x10,0x10,0x13,0x1C,0x10,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,},/*--  文字:  8  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x0E,0x11,0x11,0x11,0x11,0x0E,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,},/*--  文字:  9  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x0F,0x10,0x10,0x10,0x09,0x07,0x00,0x00,0x00,0x98,0x88,0x88,0x10,0xE0,0x00,},/*--  文字:     --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},/*--  文字:  A  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x00,0x07,0x18,0x07,0x00,0x00,0x00,0x08,0x78,0xC8,0x40,0xC8,0x78,0x08,0x00,},/*--  文字:  B  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x10,0x1F,0x11,0x11,0x11,0x12,0x0C,0x00,0x08,0xF8,0x08,0x08,0x08,0x88,0x70,0x00,},/*--  文字:  C  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x07,0x08,0x10,0x10,0x10,0x10,0x1C,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0x20,0x00,},/*--  文字:  N  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x10,0x1F,0x1C,0x03,0x10,0x1F,0x10,0x00,0x08,0xF8,0x08,0x80,0x70,0xF8,0x00,0x00,},/*--  文字:  :  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,},/*--  文字:  V  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x10,0x1E,0x11,0x00,0x11,0x1E,0x10,0x00,0x00,0x00,0xE0,0x18,0xE0,0x00,0x00,0x00,},/*--  文字:  W  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=8x15   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/{
0x10,0x1F,0x00,0x1F,0x00,0x1F,0x10,0x00,0x00,0x80,0xF8,0x00,0xF8,0x80,0x00,0x00,},};

未完待续


12864液晶屏驱动源码分享相关推荐

  1. 12864液晶驱动源码,独创中英文混合输出

    12864液晶驱动源码,独创中英文混合输出 51单片机学习笔记:ST7920控制器的12864液晶使用总结 转载于:https://www.cnblogs.com/LittleTiger/p/4724 ...

  2. 液晶屏驱动 Realtek2660H方案demo有电路板,电路图源码#Realtek2660H方案

    #Realtek2660H方案demo有电路板,电路图源码#Realtek2660H方案 有电路板,电路图,源码! 有兴趣从事液晶屏驱动的人可入手!走不错的学习资料及平台!无电子开发经验的人慎入!有r ...

  3. 怎么点亮段码屏_段码LCD液晶屏驱动方法

    TFT 液晶屏: http://www.hzjingxian.com 段码 LCD 液晶屏驱动方法 段码 LCD 液晶屏驱动方法 首先,不要以为用单片机来驱动就以为段码屏是直流驱动的,其实,段码屏是交 ...

  4. 洋桃技术支持0001:GPIO驱动12864液晶屏需要注意哪些事项?

    [提问]请问洋桃1号开发板的GPIOB端口要使用的话,硬件上和软件上需要注意什么?我想用STM32上的GPIOB端口控制点亮一个20口的12864液晶屏? 解答: [方法论] 1,解决这个问题的方法是 ...

  5. 段码液晶屏驱动IC你知道怎么选吗?

    段码液晶屏因其简易便捷的动态显示,灵便的反应速率,不用人为因素的长期的实际操作而遭受众多客户的应用.那麼,段码液晶屏的驱动IC该如何选择就由液晶屏生产厂家来给你详细介绍. ​​​​​ 段码液晶屏的驱动 ...

  6. 3D语音天气球(源码分享)——完结篇

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 由于这篇文章是本系列最后一篇,有必要进行简单的回顾和思路整理. 这个程序是由两 ...

  7. 3D语音天气球(源码分享)本文出自大苞米的博客(http://blog.csdn.net/a396901990)

    开篇废话: 由于这篇文章是本系列最后一篇,有必要进行简单的回顾和思路整理. 这个程序是由两部分组成,Android端和Unity端: 1.Unity端负责3D球的创建,显示和旋转:3D语音天气球(源码 ...

  8. 基于免费人脸识别的闸机开发及源码分享

    最近公司要开发一款人脸识别的闸机,就是在现有闸机上将一个小屏的识别装置,人脸识别成功后将闸机打开. 项目源码在 : https://gitee.com/panmingzhi/ArcSoftFace.g ...

  9. java进销存系统源码_青云源码——最新企业进销存管理系统源码分享

    基于http://Asp.Net MVC4.0 + WebAPI + Knockout 技术,采用EasyUI为前台开发展示UI,Knockout主要负责前端的逻辑交互,再结合jQuery Ajax进 ...

  10. mysql java驱动源码Connector/J编译

    最近因为工作需要,要改动mysql-java驱动Connector/J的部分源码,改动前需要先下载源码,改动后还需要编译打包生成可用jar包,本以为很简单,没想到步骤那么繁琐,为了以后使用方便,也为了 ...

最新文章

  1. 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
  2. 提示找不到include/common.h 提示No package 'minigui' found
  3. 怎样隐藏“滚动条”?
  4. 20200207_Dontla_MBTI第二步解释性报告(ISTJ(内向+感觉+思考+判断))
  5. ngrok编译和安装
  6. composer安装特别慢的解决方案
  7. centos7 yum安装ifconfig
  8. pythonmatplotlib怎么设置曲线_python – Matplotlib的“symlog”选项:如何防止曲线“回来”?...
  9. erase() 返回的是删除此元素之后的下一个元素的迭代器 .xml
  10. java常用类、最常用的包
  11. “一天搞懂深度学习”笔记
  12. 生物信息学分析 | 物种间的同源基因的批量注释
  13. 明翰英语教学系列之雅思口语篇V0.2(持续更新)
  14. Spreadsheet电子表格控件安装及用法总结
  15. 2019BNUZ_ACM国庆欢乐赛题解
  16. PostgreSQL 插入数据报错:column “xxx“ does not exist 解决方法
  17. 2021考研英语黄皮书英一英二全套加解析
  18. Unity中PICO G2 4K开发环境配置说明
  19. 【每天学点管理】——非暴力沟通
  20. RUFUS刷UBUNTU启动盘

热门文章

  1. Python 随机切换桌面背景图
  2. 熵(entropy):宇宙的终极规则
  3. ES6 import命令和import()函数区别
  4. 程序员月薪5W却发出哀叹:家庭枷锁太重,生活如同围城
  5. python 单一继承定义_python 单继承、多继承、菱形继承
  6. 简单创意的思维导图怎么画
  7. 《崩坏3》评测:游戏设计中整体性和利用率分析(下)
  8. torch.randn 方法
  9. 东南亚跨境电商ERP怎么选?萌店长ERP,含大数据分析的免费erp系统
  10. Python3 post请求上传文件