LCD动态显示
时间:10-02
整理:3721RD
点击:
求大神们帮忙解决一下键盘输入在LCD1602上的相应位置显示数据。附上程序,求解!
- /****************************************
- 标题: LCD1602
- 实验板: AT89c52
- 作者: **
- 说明: 在LCD上显示一行字符
- ****************************************/
- #include<reg52.h> //头文件
- #include"键盘输入电机转速在LCD上显示.h"
- /*********LCD定义文件****************/
- #define uint unsigned int
- #define uchar unsigned char
- #define LCDDB P0 //定义P0口
- sbit BF= P0^7; //用以检测LCD中的busy标识
- sbit RS= P2^0;
- sbit RW= P2^1;
- sbit E= P2^2;
- uchar code table[]={"By : LinZhu"};
- /***********LCD函数声明**************/
- void LCDinit(void); //初始化
- void writeData(uchar dat); //写数据
- void writeCommand(uchar command); //写指令
- void writeDisplay(uchar x,uchar y,uchar z); //显示数据
- /***************延时函数********************/
- void delay40us(uint n) //40us延时
- { uint i, j;
- for(i = n ; i > 0 ; i--)
- for(j = 0 ; j < 24 ; j++);
- }
- /*******定义液晶是否忙碌的标志位******/
- bit BusyTest(void)
- {
- bit result ;
- RS = 0;
- RW = 1;
- E = 1;
- delay40us(1);
- result=BF; //将忙碌标志电平赋给result
- E = 0;//将E恢复至低电平写入数据
- return result;
- }
- /***********写指令**************/
- void writeCommand(uchar dat)
- {while(BusyTest()==1);//如果忙就继续等待,直至这条语句执行完毕
- LCDDB=dat;
- RS=0; //指令
- RW=0; //写入
- E=1; //允许
- E=0; //下降沿
- delay40us(1);
- }
- /************写数据*********************/
- void writeData(uchar dat)
- {while(BusyTest()==1);//如果忙就继续等待,直至这条语句执行完毕
- LCDDB=dat;
- RS=1; //数据
- RW=0; //写入
- E=1; //允许
- E=0; //下降沿
- delay40us(1);
- }
- /**************显示字符*******************/
- void Display(uchar x , uchar y , uchar dat)
- {
- uchar address;
- if(y==1)
- address=0x80+x; //选第一行显示
- else
- address=0xc0+x; //选第二行显示
- writeCommand(address);
- writeData(dat);
- }
- /***********初始化******************/
- void LCDinit(void)
- { delayms(1); //等待LCD电源稳定
- writeCommand(0x38); //设置8行格式,2行 5*7
- writeCommand(0x0e); //体显示,开光标,不闪烁
- writeCommand(0x06); //设置输入方式,增量不移位
- writeCommand(0x01); //清除屏幕显示
- delay40us(100); //延时4ms
- }
- /***************主函数***********************/
- void main(void)
- {
- uchar i;
- key=0x0f;
- i=0;
- LCDinit();
- while(1)
- {
- while(table[i]!='\0')
- {
- Display(i , 1 ,table[i]);
- i++;
- delayms(50);
- }
-
- if(key!=0x0f)
- {
- KEY();
- Display(0,0,KEY());
- }
- }
- }
- /********自定义头文件和上面是分开放的***********/
- /****************************************
- 标题: LCD1602
- 实验板: AT89c52
- 作者: **
- 说明: 键盘输入电机转速在LCD上显示
- ****************************************/
- #include<reg52.h> //头文件
- /*********定义文件****************/
- #define uint unsigned int
- #define uchar unsigned char
- #define key P1 //定义p1口为key
- /***********键盘函数声明**************/
- unsigned char KEY();
- /***************延时函数********************
- void delayms(unsigned int a) //一毫秒延时
- {
- unsigned int i;
- while(--a!=0)
- {
- for(i=0;i<600;i++);
- }
- }
- ****************16阵列式键盘驱动******************/
- unsigned char KEY() //4*4阵列键盘处理程序
- {
- unsigned char a,b,c;
- if(key!=0x0f) //判断键盘状态
- {
- delayms(20); //20毫秒去抖动
- if(key!=0x0f) //重新读取电平
- {
- a=key; //寄存状态到a
- }
- key=0xf0; //设定键盘反向电平状态
- c=key; //读取反向电平到c
- a=a|c; //a与c相或
- switch(a){ //键盘状态查表
- case 0xee: b=0x30;break;
- case 0xed: b=0x31;break;
- case 0xeb: b=0x32;break;
- case 0xe7: b=0x33;break;
- case 0xde: b=0x34;break;
- case 0xdd: b=0x35;break;
- case 0xdb: b=0x36;break;
- case 0xd7: b=0x37;break;
- case 0xbe: b=0x38;break;
- case 0xbd: b=0x39;break;
- case 0xbb: b=0x41;break;
- case 0xb7: b=0x42;break;
- case 0x7e: b=0x43;break;
- case 0x7d: b=0x44;break;
- case 0x7b: b=0x45;break;
- case 0x77: b=0x46;break;
- default: b=0x20;break;
- }
- }
- return(b); //将b中的键值代号送入函数返回值
- }
