LCD动态显示汉字
单片机LCD12864驱动源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define Dataport P0 //LCD数据线
- sbit RS=P2^2; // 数据\指令 选择
- sbit RW=P2^1; // 读\写 选择
- sbit EN=P2^0; // 读\写使能
- sbit cs1=P2^4; // 片选1
- sbit cs2=P2^3; // 片选2
-
- #define uint unsigned int
- #define uchar unsigned uchar
- /********************************/
- /* 定义中文字库 */
- /********************************/
- unsigned char code Hzk[]={
- /*-- 文字: 中 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
- 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
- /*-- 文字: 国 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
- 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00,
- /*-- 文字: 人 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x01,0x06,0x0C,0x18,0x30,0x60,0x20,0x00,
- /*-- 文字: 民 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x9E,0x80,0x80,0x00,0x00,
- 0x00,0x00,0xFF,0x40,0x20,0x10,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0xF0,0x00,0x00,
- /*-- 文字: 解 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08,0xF4,0x57,0x54,0xFC,0x54,0xF0,0x42,0xA2,0x1E,0x02,0xA2,0x62,0x3E,0x00,0x00,
- 0x80,0x7F,0x02,0x02,0x5F,0x82,0x7F,0x0A,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x00,
- /*-- 文字: 放 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08,0x08,0xF8,0x49,0x4E,0xC8,0x88,0x40,0x38,0xCF,0x0A,0x08,0x88,0x78,0x08,0x00,
- 0x40,0x30,0x0F,0x40,0x80,0x7F,0x00,0x40,0x20,0x10,0x0B,0x0E,0x31,0x60,0x20,0x00,
- /*-- 文字: 军 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x18,0x26,0x22,0xA2,0x72,0x2E,0xAA,0x22,0x22,0x22,0x32,0x22,0x0A,0x06,0x00,
- 0x00,0x10,0x10,0x12,0x13,0x12,0x12,0xFF,0x12,0x12,0x12,0x13,0x12,0x18,0x10,0x00,
- /*-- 文字: 第 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x08,0x04,0xD3,0x56,0x5A,0x52,0x5A,0xF4,0x53,0x56,0x5A,0x72,0x02,0x02,0x00,
- 0x00,0x20,0x20,0x23,0x12,0x12,0x0A,0x06,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,
- /*-- 文字: 三 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
- 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
- /*-- 文字: 三 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
- 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
- /*-- 文字: 零 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x0C,0x04,0x55,0x55,0x55,0x85,0x7F,0x85,0x55,0x55,0x55,0x05,0x0C,0x04,0x00,
- 0x04,0x04,0x04,0x0A,0x0A,0x09,0x2A,0xCC,0x28,0x19,0x09,0x02,0x06,0x02,0x02,0x00,
- /*-- 文字: 三 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
- 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
- /*-- 文字: 工 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,
- 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
- /*-- 文字: 厂 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
- 0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: 导 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x3E,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0xCA,0x4E,0x40,0x70,0x00,0x00,
- 0x02,0x02,0x02,0x02,0x06,0x3A,0x12,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x00,
- /*-- 文字: 弹 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x02,0xF2,0x12,0x12,0x1E,0x00,0xF9,0x2A,0x2C,0xF8,0x28,0x2C,0x2B,0xFA,0x00,0x00,
- 0x01,0x43,0x81,0x41,0x3F,0x08,0x0B,0x09,0x09,0xFF,0x09,0x09,0x09,0x0B,0x08,0x00,
- /*-- 文字: 中 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
- 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
- /*-- 文字: 心 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x80,0x00,0x00,0xF0,0x00,0x01,0x02,0x1C,0x08,0x00,0x40,0x80,0x00,0x00,0x00,
- 0x04,0x03,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x07,0x02,0x00,
- /*-- 文字: 胡 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x08,0x00,0xFE,0x12,0x12,0x12,0xFE,0x00,0x00,
- 0x00,0x3F,0x10,0x10,0x10,0x10,0x7F,0x80,0x40,0x3F,0x01,0x41,0x81,0x7F,0x00,0x00,
- /*-- 文字: 国 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
- 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00,
- /*-- 文字: 平 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x01,0x05,0x09,0x71,0x21,0x01,0xFF,0x01,0x41,0x21,0x1D,0x09,0x01,0x00,0x00,
- 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- /****************************************/
- /* 定义ASCII字库8列*16行 */
- /****************************************/
- unsigned char code Ezk[]={
- /*-- 文字: Q --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,
- /*-- 文字: Q --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,
- /*-- 文字: 1 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
- /*-- 文字: 3 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
- /*-- 文字: 0 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
- /*-- 文字: 8 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
- /*-- 文字: 1 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
- /*-- 文字: 3 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
- /*-- 文字: 0 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
- /*-- 文字: 4 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- void CheckState() //状态检查,LCD是否忙?
- {
- unsigned char dat;
- RS=0;
- RW=1;
- do{
- Dataport=0x00;
- EN=1;
- dat=Dataport;
- EN=0;
- dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
- }while(!(dat==0x00));
- }
- SendCommandToLCD(unsigned char command) //写命令到LCD中
- {
- CheckState();
- RS=0; //向LCD发送命令
- RW=0;
- Dataport=command; //command :命令
- EN=1;
- EN=0;
- }
- void SetLine(unsigned char page) //设置页 0xb8是页的首地址
- {
- page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页
- SendCommandToLCD(page);
- }
- void SetStartLine(unsigned char startline) //设定显示开始行,0xc0是行的首地址
- {
- startline=0xc0|startline; //1100 0000
- SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示
- }
- void SetColumn(unsigned char column) //设定列地址--Y 0-63 ,0x40是列的首地址
- {
- column=column &0x3f; //column最大值为64,越出 0=<column<=63
- column= 0x40|column; //01xx xxxx
- SendCommandToLCD(column);
- }
-
- void SetOnOff(unsigned char onoff) //开关显示,0x3f是开显示,0x3e是关显示
- {
- onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1
- SendCommandToLCD(onoff);
- }
- void WriteByte(unsigned char dat) //写显示数据
- {
- CheckState();
- RS=1;
- RW=0;
- Dataport=dat;//dat:显示数据
- EN=1;
- EN=0;
- }
- void SelectScreen(unsigned char screen) //选择屏幕screen: 0-全屏,1-左屏,2-右屏
- {
- switch(screen)
- { case 0: cs1=0;//全屏
- _nop_(); _nop_(); _nop_();
- cs2=0;
- _nop_(); _nop_(); _nop_();
- break;
- case 1: cs1=0;//左屏
- _nop_(); _nop_(); _nop_();
- cs2=1;
- _nop_(); _nop_(); _nop_();
- break;
- case 2: cs1=1;//右屏
- _nop_(); _nop_(); _nop_();
- cs2=0;
- _nop_(); _nop_(); _nop_();
- break;
- }
- }
- void ClearScreen(unsigned char screen) //清屏screen: 0-全屏,1-左屏,2-右
- {
- unsigned char i,j;
- SelectScreen(screen);
-
- for(i=0;i<8;i++) //控制页数0-7,共8页
- {
- SetLine(i);
- SetColumn(0);
- for(j=0;j<64;j++) //控制列数0-63,共64列
- {
- WriteByte(0x00); //写点内容,列地址自动加1
- }
- }
-
- }
- void delay(uint nms) //延时程序
- {
- uint i;
- for(; nms > 0; nms--)
- for(i = 0; i < 500; i++);
- }
- void lcd_rol() //向上滚屏
- {
- uint i;
- for(i = 0; i < 64; i++)
- {
- cs1=0; // 片选1
- SendCommandToLCD(0xc0+i);
- cs1=1;
-
- cs2=0;// 片选2
- SendCommandToLCD(0xc0+62-i);
- cs2=0; // 片选2
-
- delay(6);
- }
- }
- void InitLCD( ) //初始化LCD
- {
- CheckState();
- SelectScreen(0);
- SetOnOff(0); //关显示
- SelectScreen(0);
- SetOnOff(1); //开显示
- SelectScreen(0);
- ClearScreen(0);//清屏
- SetStartLine(0); //开始行:0
- }
- //显示全角汉字
- void Display(unsigned char ss,unsigned char page,unsigned char column,unsigned char number)
- {
- int i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
-
- SelectScreen(ss);
- column=column&0x3f;
- SetLine(page); //写上半页
- SetColumn(column); //控制列
- for(i=0;i<16;i++) //控制16列的数据输出
- {
- WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
-
- }
- SetLine(page+1); //写下半页
- SetColumn(column); //控制列
- for(i=0;i<16;i++) //控制16列的数据输出
- {
- WriteByte(Hzk[i+32*number+16]); //i+32*number+16汉字的后16个数据输出
- }
- }
- //显示半角汉字和数字和字母
- void Displayen(unsigned char ss,unsigned char page,unsigned char column,unsigned char number)
- {
- int i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
-
- SelectScreen(ss);
- column=column&0x3f;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
LCD动态显示汉字.rar
(92.13 KB, 下载次数: 259)
|