12864串行显示中文讲解
- 格式:doc
- 大小:58.01 KB
- 文档页数:8
12864串行显示中文,按键选择显示页面,并且可调数值。
单片机P1口接矩阵按键,其它接口按程序中定义去接只需要接12864LCD上GND VCC RS RW E PSB RST A K程序如下/********************************12864.h头文件*******************************/ #ifndef _12864_h#define _12864_h/*****包含头文件**************/#include<reg51.h>/********定义I/0口**********/#define GPIO_KEY P1sbit LCD12864_SCLK = P2^7; //Esbit LCD12864_SID = P2^5; //RWsbit LCD12864_CS = P2^6; //RSsbit LCD12864_RET= P2^0;sbit LCD12864_PSB =P2^2;/*声明全局变量*/extern unsigned char keyvalue;/******声明全局函数*********/void Delay1ms(unsigned int); //声明延时函数unsigned char KeyDown(void);void LCD_sendbyte(unsigned char);void WrCom(unsigned char);void WrDat(unsigned char);void LcdInit(void);//void Print(unsigned char);void SetAddress( unsigned char,unsigned char );void DisplayString(unsigned char x ,unsigned char y,unsigned char *add);#endif/********************************12864.C*************************************/ #include"12864.h"#include<reg51.h>#include"string.h"//#define LCM_ST7920_FIRST_LINE_ADDRESS 0x80//#define LCM_ST7920_SECOND_LINE_ADDRESS 0x90//#define LCM_ST7920_THIRD_LINE_ADDRESS 0x88//#define LCM_ST7920_FOURTH_LINE_ADDRESS 0x98/*定义全局变量*/unsigned char keyvalue=0;/****************************************************************************** ** 函数名: Delay1ms* 函数功能: 延时函数,延时1ms* 输入: c* 输出 e : 无* 说名: 该函数是在12MHZ晶振下,12分频单片机的延时。
******************************************************************************/void Delay1ms(unsigned int i) //误差0us{unsigned char a;for (i; i>0; i--){for (a=199;a>0;a--);}}/****************************************************************************** ** 函数名: KeyDown()* 函数功能: 按键* 输入:* 输出: keyvalue* 说名: P1口接矩阵按键******************************************************************************/ unsigned char KeyDown(void){GPIO_KEY=0xf0;if(GPIO_KEY!=0xf0){switch(GPIO_KEY){case 0xe0: keyvalue=1;break;case 0xd0: keyvalue=2;break;case 0xb0: keyvalue=3;break;case 0x70: keyvalue=4;break;}GPIO_KEY=0x0f;switch(GPIO_KEY){case 0x0e: keyvalue=keyvalue;break;case 0x0d: keyvalue+=4;break;case 0x0b: keyvalue+=8;break;case 0x07: keyvalue+=12;break;}while(GPIO_KEY!=0x0f){Delay1ms(10);}}return keyvalue;}/****************************************************************************函数名字:SendByte(byte)函数功能:发送一个字节* 输入: byte* 输出: 无******************************************************************************/ void LCD_sendbyte(unsigned char byte){unsigned char i;for(i=0;i<8;i++){LCD12864_SCLK=0; //Delay1ms(3);LCD12864_SID=(bit)(byte&0x80); //发送最高位数据,从高位开始发送LCD12864_SCLK=1; //上升沿发送数据byte=byte<<1; //左移一位}}/****************************************************************************函数名字:void WrDat(usnigned char data)函数功能:写入数据* 输入: data* 输出: 无******************************************************************************/ void WrDat(unsigned char dat){LCD12864_CS=1; //片选信号1LCD_sendbyte(0xfa); //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(1),0 LCD_sendbyte(0xf0&dat); //取高四位,数据分两次传送,//每个字节的内容被送入两个字节//高四位放在第一个字节的高四位LCD_sendbyte(0xf0&(dat<<4)); //低四位放在第二个字节LCD12864_CS=0;Delay1ms(10);}/****************************************************************************函数名字:void WrCom(usnigned char com)函数功能:写入命令* 输入: com* 输出: 无******************************************************************************/ void WrCom(unsigned char com){LCD12864_CS=1;LCD_sendbyte(0xf8); //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(0),0 LCD_sendbyte(0xf0&com); //取高四位,数据分两次传送,//每个字节的内容被送入两个字节//高四位放在第一个字节的高四位LCD_sendbyte(0xf0&(com<<4)); //低四位放在第二个字节的高四位LCD12864_CS=0;Delay1ms(10); //串行不支持读操作,不可检测忙操作,这里用延时替代}/****************************************************************************函数名字:void LcdInit(void)函数功能:初始化* 输入: 无* 输出: 无*****************************************************************************/ void LcdInit(void){LCD12864_RET=0; //复位LCD,低电平有效Delay1ms(50);LCD12864_RET=1;LCD12864_PSB=0; //串行WrCom(0x01); //清屏WrCom(0x30); //基本指令用0x30,扩展指令用0x34Delay1ms(20);WrCom(0x0C); //显示开,光标关WrCom(0x06); //进入模式指针加1,屏幕不移动}/**************************************************************************** 函数名字:void Print(unsigned char *s)函数功能: 显示字符串* 输入: 行、数据* 输出: 无******************************************************************************/ //void Print(unsigned char *s)//{// unsigned char i;// i=strlen(s);// while(i--)// {// WrDat(*(s++));//// }//}/**************************************************************************** 函数名字:void SetAddress(unsigned char x,unsigned char y)函数功能:选择地址显示* 输入: 行、数据* 输出: 无******************************************************************************/ void SetAddress(unsigned char x,unsigned char y){unsigned char bAddress;switch(y){case 1: bAddress=0x80+x;break;case 2: bAddress=0x90+x;break;case 3: bAddress=0x88+x;break;case 4: bAddress=0x98+x;break;default: break;}WrCom(bAddress);}/**************************************************************************** 函数名字:void DisplayString(unsigned char x,unsigned char y, unsigned)函数功能:显示字符串* 输入: 行、数据* 输出: 无******************************************************************************/ void DisplayString(unsigned char x,unsigned char y,unsigned char *add){unsigned char i;i=strlen(add);SetAddress(x,y);while(i--){WrDat(*(add++));}}/********************************main.c主函数*********************************/ #include"12864.h"void main(){unsigned char bFlag=0;keyvalue=0;loop:LcdInit();DisplayString( 0,1,"1.选择上次设置");DisplayString( 0,2,"2.选择出厂设置");DisplayString( 0,3,"3.选择自定义设置");DisplayString( 0,4,"4.显示下一页");while( 1){KeyDown();if(keyvalue==4){keyvalue=0;break;}}WrCom(0x01); //清屏WrCom(0x06); //进入模式指针加1,屏幕不移动DisplayString( 0,1,"1.显示上次设置");DisplayString( 0,2,"2.显示出厂设置");DisplayString( 0,3, "3.显示自定义设置");DisplayString( 0,4, "4.显示上一页");while(1){KeyDown();if(keyvalue==2){keyvalue=0;WrCom(0x01);//清屏DisplayString(0,1,"机型: "); DisplayString(3,1,"5034"); DisplayString(0,2,"DATA1=FFFF"); DisplayString(6,2,"M=E"); DisplayString(0,3,"ChkSum1=FFFF"); DisplayString(7,3,"E");WrCom(0x80+3);WrCom(0x0e);//光标显示开while(1){KeyDown();if(keyvalue!=0&&keyvalue<=10){if(keyvalue==10)keyvalue=0;WrDat('0'+keyvalue%10);keyvalue=0;}if(keyvalue==14){keyvalue=0;WrCom(0x10);//光标左移}if(keyvalue==15){keyvalue=0;WrCom(0x14);//光标右移}if(keyvalue==13||keyvalue==16){keyvalue=0;WrCom(0x01);//清屏WrCom(0x0C);DisplayString(1,2,"是否保存设置");DisplayString(2,3,"1.Y 2.N");while(1){KeyDown();if(keyvalue==1||keyvalue==2){keyvalue=0;break;}}WrCom(0x01); //清屏DisplayString( 0,1,"1.显示上次设置");DisplayString( 0,2,"2.显示出厂设置");DisplayString( 0,3, "3.显示自定义设置");DisplayString( 0,4, "4.显示上一页");break;}}}if(keyvalue==4){keyvalue=0;goto loop;}}}。