LCD12864无字库
论坛有很多相关的例程
本小白利用空余时间,按照自己的重新写了一个小白都能看懂的驱动
大佬勿喷,仅供学习交流
下列是部分驱动程序靓照,请查阅
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "12864.h"
- #include "ziku.h"
- void Delay_ms(unsigned int xms) //@11.0592MHz
- {
- unsigned int i,j;
- for(i=xms;i>0;i--)
- for(j=112;j>0;j--);
- }
- static void LCD12864_Write(bit COM_Data,unsigned char dat) //12864操作函数
- {
- LCD12864_RS=COM_Data; //指令 0 数据 1
- LCDData_Pro=dat; //数据传输至P0扣
- LCD12864_EN=1; //置1
- _nop_();
- LCD12864_EN=0; //置0 产生下降沿
- }
- void LCD12864_Init(void) //12864初始化
- {
- Delay_ms(300); //等待系统上电稳定
- /******************************************************************************/
- LCD12864_EN=1;
- LCD12864_RS=1;
- LCD12864_CS1=1; //仿真 0 实物 1
- LCD12864_CS2=1; //仿真 0 实物 1
- Delay_ms(10);
- /******************************************************************************/
- LCD12864_Write(LCD12864_COM,0x3f); //开显示
- /*
- LCD12864_Write(LCD12864_COM,0xc0); //这段不写也可以正常显示
- LCD12864_Write(LCD12864_COM,0xb8);
- LCD12864_Write(LCD12864_COM,0x40);
- */
- LCD12864_Write(LCD12864_COM,0x30); //打开基本指令
- LCD_Clear(); //清屏
- }
- /*****************************************************************************
- 函数功能:清平函数
- 入口参数:空
- 说 明:清空整个屏幕数据
- 版 本:V1.0
- 时 间:2020年5月9日
- *****************************************************************************/
- void LCD_Clear(void)
- {
- unsigned char i,j;
- #if LCD_Mode
- LCD12864_CS1=1; //选中左半屏
- LCD12864_CS2=1; //选中右半屏
- #else
- LCD12864_CS1=0; //选中左半屏
- LCD12864_CS2=0; //选中右半屏
- #endif
- LCD12864_Write(LCD12864_COM,0xc0); //行
- for(i=0;i<8;i++)
- {
- LCD12864_Write(LCD12864_COM,0xb8+i); //页
- for(j=0;j<64;j++)
- {
- LCD12864_Write(LCD12864_COM,0x40+j); //列
- LCD12864_Write(LCD12864_DATA,0x00);
- Delay_ms(5); //方便看清屏效果
- }
- }
- }
- /*****************************************************************************
- 函数功能:地址写入函数
- 入口参数:X,Y
- 说 明:根据地址自动切换左、右屏
- 版 本:V1.0
- 时 间:2020年5月9日
- *****************************************************************************/
- void LCD12864_X_Y(unsigned char X,unsigned char Y)
- {
- Y=Y&0x7f; //限定范围,列不能超过127
- X=X&0x07; //限定范围,行不能超过7
- if(Y<64)
- {
- #if LCD_Mode
- LCD12864_CS1=1; //选中左半屏
- LCD12864_CS2=0; //关闭右半屏
- #else
- LCD12864_CS1=0; //选中左半屏
- LCD12864_CS2=1; //关闭右半屏
- #endif
- LCD12864_Write(LCD12864_COM,0x40+Y); //选择列基地址+Y 一共64行
- if(Y==63) Y=64;
- }
- else
- {
- #if LCD_Mode
- LCD12864_CS1=0; //关闭左半屏
- LCD12864_CS2=1; //选中右半屏
- #else
- LCD12864_CS1=1; //关闭左半屏
- LCD12864_CS2=0; //选中右半屏
- #endif
- Y&=0x3f;
- LCD12864_Write(LCD12864_COM,0x40+Y); //选择列基地址+Y 一共64列
- }
- LCD12864_Write(LCD12864_COM,0xb8+X); //选择页基地址+X 一共7页
- }
- /*****************************************************************************
- 函数功能:6*16数值写入函数
- 入口参数:X,Y,num,*dat
- 说 明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
- 版 本:V1.5
- 修改时间:2022年7月10日
- 新 增:可实现跨左右屏
- *****************************************************************************/
- void LCD12864_Write_Number(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
- {
- unsigned char i;
- for(i=0;i<6;i++)
- {
- LCD12864_X_Y(X,Y+i); //每写一个字节 更新一次Y 防止不能出现跨屏
- LCD12864_Write(LCD12864_DATA,dat[num*12+i]); //写上半字 共写6个字节
- }
- for(i=0;i<6;i++)
- {
- LCD12864_X_Y(X+1,Y+i); //同上
- LCD12864_Write(LCD12864_DATA,dat[num*12+6+i]); //写下半字 共写6个字节
- }
- }
- /*****************************************************************************
- 函数功能:变量显示函数
- 入口参数:X,Y,num,len
- 说 明:在第X行的第Y个位置显示len个num数值
- 版 本:V1.2
- 修改时间:2022年7月10日
- 新 增:自动计算变量长度 最大计数99999
- *****************************************************************************/
- void LCD12864_Num(unsigned char X,unsigned char Y,unsigned int num)
- {
- unsigned char i;
- unsigned char Len;
- unsigned char Dis[5];
- unsigned char Buf[5];
-
- sprintf(Buf,"%d",num); //将数值转换成字符串
- Len=strlen(Buf); //计算字符串长度
-
- if(Len>4)Dis[Len-5]=num/10000 ; //若数据更大 按照规律写即可
- if(Len>3)Dis[Len-4]=num%10000/1000;
- if(Len>2)Dis[Len-3]=num%1000/100 ;
- if(Len>1)Dis[Len-2]=num%100/10 ;
- if(Len>0)Dis[Len-1]=num%10 ;
-
- for(i=0;i<Len;i++) LCD12864_Write_Number(X,Y+(i*6),Dis[i],Num);
- }
- /*****************************************************************************
- 函数功能:12*16汉字写入函数
- 入口参数:X,Y,num,*dat
- 说 明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
- 版 本:V1.5
- 修改时间:2022年7月10日
- 新 增:左右跨屏
- *****************************************************************************/
- void LCD12864_Write_Chinese(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
- {
- unsigned char i;
- for(i=0;i<12;i++)
- {
- LCD12864_X_Y(X,Y+i); //跨屏重要函数 勿删除
- LCD12864_Write(LCD12864_DATA,dat[num*24+i]); //写上半字 共写12个字节
- }
- for(i=0;i<12;i++)
- {
- LCD12864_X_Y(X+1,Y+i); //同上
- LCD12864_Write(LCD12864_DATA,dat[num*24+12+i]); //写下半字 共写12个字节
- }
- }
- /*****************************************************************************
- 函数功能:英文字母显示函数
- 入口参数:X,Y,*dat
- 说 明:X_横坐标 Y_纵坐标 *dat_需要显示的英文字母
- 版 本:V1.0
- 修改时间:2022年7月10日
- 注 明:带字库索引功能
- *****************************************************************************/
- void LCD12864_Write_English(unsigned char X,unsigned char Y,unsigned char *dat)
- {
- unsigned char i,j;
- unsigned char Len;
-
- Len=strlen(dat); //获取数据长度
-
- for(j=0;j<Len;j++)
- {
- for(i=0; ;i++) if(English_Buf[i]==*dat) {dat++; break;} //查找字库索引列表
- LCD12864_Write_Number(X,Y+(j*6),i,English); //写数据
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
Keil代码与Proteus8.8仿真下载:
12864驱动.7z
(51.32 KB, 下载次数: 233)
|