微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD动态显示

LCD动态显示

时间:10-02 整理:3721RD 点击:
求大神们帮忙解决一下键盘输入在LCD1602上的相应位置显示数据。附上程序,求解!

  1. /****************************************
  2. 标题:        LCD1602
  3. 实验板:        AT89c52
  4. 作者:        **
  5. 说明:        在LCD上显示一行字符
  6. ****************************************/
  7. #include<reg52.h>        //头文件
  8. #include"键盘输入电机转速在LCD上显示.h"
  9. /*********LCD定义文件****************/
  10. #define        uint        unsigned int
  11. #define        uchar        unsigned char       
  12. #define        LCDDB        P0        //定义P0口
  13. sbit        BF=  P0^7;                //用以检测LCD中的busy标识
  14. sbit        RS=  P2^0;
  15. sbit        RW=  P2^1;
  16. sbit        E=  P2^2;
  17. uchar        code table[]={"By : LinZhu"};
  18. /***********LCD函数声明**************/
  19. void LCDinit(void);                        //初始化
  20. void writeData(uchar  dat);                //写数据
  21. void writeCommand(uchar  command);        //写指令
  22. void writeDisplay(uchar  x,uchar  y,uchar  z);        //显示数据

  23. /***************延时函数********************/
  24. void delay40us(uint  n)                //40us延时
  25. {           uint i, j;
  26.         for(i = n  ;  i > 0  ;  i--)
  27.         for(j = 0  ;  j < 24  ;  j++);                       
  28. }

  29. /*******定义液晶是否忙碌的标志位******/
  30. bit BusyTest(void)
  31. {
  32.         bit result ;
  33.         RS = 0;
  34.         RW = 1;
  35.         E = 1;
  36.         delay40us(1);
  37.         result=BF;  //将忙碌标志电平赋给result
  38.         E = 0;//将E恢复至低电平写入数据
  39.         return result;
  40. }

  41. /***********写指令**************/
  42. void writeCommand(uchar  dat)
  43. {while(BusyTest()==1);//如果忙就继续等待,直至这条语句执行完毕       
  44.         LCDDB=dat;               
  45.         RS=0;                        //指令
  46.         RW=0;                        //写入
  47.         E=1;                        //允许
  48.         E=0;                        //下降沿
  49.         delay40us(1);               
  50. }
  51. /************写数据*********************/
  52. void writeData(uchar  dat)
  53. {while(BusyTest()==1);//如果忙就继续等待,直至这条语句执行完毕
  54.         LCDDB=dat;
  55.         RS=1;                        //数据
  56.         RW=0;                        //写入
  57.         E=1;                        //允许
  58.         E=0;                        //下降沿
  59.         delay40us(1);
  60. }
  61. /**************显示字符*******************/
  62. void Display(uchar  x , uchar  y , uchar  dat)
  63. {
  64.         uchar address;
  65.         if(y==1)
  66.         address=0x80+x;                //选第一行显示
  67.         else
  68.         address=0xc0+x;                //选第二行显示
  69.         writeCommand(address);
  70.         writeData(dat);
  71. }

  72. /***********初始化******************/
  73. void LCDinit(void)
  74. {        delayms(1);                 //等待LCD电源稳定
  75.         writeCommand(0x38);                //设置8行格式,2行  5*7
  76.         writeCommand(0x0e);                //体显示,开光标,不闪烁
  77.         writeCommand(0x06);                //设置输入方式,增量不移位
  78.         writeCommand(0x01);                //清除屏幕显示
  79.         delay40us(100);                //延时4ms       
  80. }

  81. /***************主函数***********************/
  82. void main(void)
  83. {       
  84.         uchar i;
  85.         key=0x0f;
  86.         i=0;       
  87.         LCDinit();
  88.         while(1)
  89.         {
  90.         while(table[i]!='\0')
  91.                 {  
  92.                 Display(i , 1 ,table[i]);
  93.                 i++;
  94.                 delayms(50);
  95.                 }
  96.        
  97.         if(key!=0x0f)
  98.                 {
  99.                 KEY();
  100.                 Display(0,0,KEY());
  101.                 }
  102.         }
  103. }
  104. /********自定义头文件和上面是分开放的***********/
  105. /****************************************
  106. 标题:        LCD1602
  107. 实验板:        AT89c52
  108. 作者:        **
  109. 说明:        键盘输入电机转速在LCD上显示
  110. ****************************************/
  111. #include<reg52.h>        //头文件
  112. /*********定义文件****************/
  113. #define        uint        unsigned int
  114. #define        uchar        unsigned char
  115. #define        key        P1                //定义p1口为key
  116. /***********键盘函数声明**************/
  117. unsigned char KEY();

  118. /***************延时函数********************
  119. void delayms(unsigned int a)         //一毫秒延时
  120. {
  121.         unsigned int i;
  122.         while(--a!=0)
  123.         {
  124.                 for(i=0;i<600;i++);
  125.         }
  126. }
  127. ****************16阵列式键盘驱动******************/
  128. unsigned char KEY()                //4*4阵列键盘处理程序
  129. {
  130.         unsigned char a,b,c;
  131.         if(key!=0x0f)        //判断键盘状态
  132.         {
  133.                 delayms(20);                //20毫秒去抖动
  134.                 if(key!=0x0f)        //重新读取电平
  135.                 {
  136.                         a=key;                 //寄存状态到a
  137.                 }
  138.                 key=0xf0;                //设定键盘反向电平状态
  139.                 c=key;                //读取反向电平到c
  140.                 a=a|c;                        //a与c相或
  141.                 switch(a){          //键盘状态查表
  142.                         case 0xee: b=0x30;break;
  143.                         case 0xed: b=0x31;break;
  144.                         case 0xeb: b=0x32;break;
  145.                         case 0xe7: b=0x33;break;
  146.                         case 0xde: b=0x34;break;
  147.                         case 0xdd: b=0x35;break;
  148.                         case 0xdb: b=0x36;break;
  149.                         case 0xd7: b=0x37;break;
  150.                         case 0xbe: b=0x38;break;
  151.                         case 0xbd: b=0x39;break;
  152.                         case 0xbb: b=0x41;break;
  153.                         case 0xb7: b=0x42;break;
  154.                         case 0x7e: b=0x43;break;
  155.                         case 0x7d: b=0x44;break;
  156.                         case 0x7b: b=0x45;break;
  157.                         case 0x77: b=0x46;break;
  158.                         default:   b=0x20;break;       
  159.                 }
  160.         }
  161.         return(b);                //将b中的键值代号送入函数返回值
  162. }

复制代码


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top