找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9373|回复: 0
打印 上一主题 下一主题
收起左侧

4X4矩阵键盘扫描lcd1602液晶显示

[复制链接]
跳转到指定楼层
楼主
ID:71259 发表于 2014-12-30 01:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit BEEP=P3^6;
  6. sbit RS=P2^0;
  7. sbit RW=P2^1;
  8. sbit E=P2^2;
  9. sbit BF=P0^7;
  10. uchar code digit[]="0123456789ABCDEF";
  11. uchar code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };
  12. uchar code str[]="Input Data:";
  13. uchar key;
  14. /************************************
  15. 函数功能:1ms基准延时
  16. 入口参数:n
  17. ************************************/

  18. void delay1ms(unsigned int n )
  19. {
  20. unsigned char i;
  21. while(n--)
  22.   for(i=0;i<115;i++);
  23. }

  24. /************************************
  25. 函数功能: 500us延时
  26. ************************************/
  27. void delay500us()     
  28. {

  29. uchar i;

  30.   for(i=0;i<57;i++);

  31. }
  32. /************************************
  33. 函数功能: 蜂鸣器产生1KHZ频率声音,
  34. ************************************/
  35. void beep()
  36. {
  37.   uchar i;
  38. for(i=0;i<200;i++){
  39.   BEEP=~BEEP;
  40.   delay500us();
  41. }
  42. BEEP=1;

  43. }


  44. /************************************
  45. 函数功能:判断液晶的忙碌状态
  46. 返回值:result=1,忙碌;result=0,不忙
  47. ************************************/
  48. bit BusyTest()
  49. {
  50. bit result;
  51. RS=0;  //读状态时,RS=0,RW=1,E=1
  52. RW=1;
  53. E=1;
  54. _nop_(); //延时一个时钟周期
  55. _nop_();
  56. _nop_();
  57. _nop_(); //4个周期延时,给硬件反应时间
  58. result=BF;
  59. E=0;  //将E置0,不允许读
  60. return result;
  61. }
  62. /************************************
  63. 函数功能:将模式设置指令或显示地址送入液晶
  64. 入口参数:dictate
  65. ************************************/
  66. void WriteInstruction(uchar dictate)
  67. {
  68. while(BusyTest()==1);  //如果忙就等待
  69. RS=0;      //写指令时,RS=0.RW=0,E=负跳变
  70. RW=0;
  71. E=0;   //先将E拉低
  72. _nop_();  
  73. _nop_();     //给硬件反应时间
  74. P0=dictate; //将数据送入P0口,即指令或地址
  75. _nop_();
  76. _nop_();
  77. _nop_();
  78. _nop_();    //反应时间
  79. E=1;  //上升沿读入指令或地址  
  80. _nop_();
  81. _nop_();
  82. _nop_();
  83. _nop_();
  84. E=0;     //当E由高电平跳变成低电平时,液晶模块开始执行命令
  85. }
  86. /************************************
  87. 函数功能:指定字符显示的实际地址
  88. 入口参数:x
  89. ************************************/
  90. void WriteAddress(uchar x)
  91. {
  92. WriteInstruction(x|0x80);   //显示位置的确定方法为“0x80+地址码x”
  93. }
  94. /************************************
  95. 函数功能:将数据(ASKII码)写入液晶模块
  96. 入口参数:y(字符常量)
  97. ************************************/
  98. void WriteData(unsigned char y)
  99. {
  100. while(BusyTest()==1); //如果忙碌就等待
  101. RS=1;       //写数据时RS=1,RW=0,E=负跳变
  102. RW=0;
  103. E=0;    //先将E拉低
  104. _nop_();
  105. _nop_();
  106. P0=y;
  107. _nop_();
  108. _nop_();
  109. _nop_();
  110. _nop_();  //反应时间
  111. E=1;
  112. _nop_();
  113. _nop_();
  114. _nop_();
  115. _nop_();
  116. E=0;     //当E由高电平跳变成低电平时,液晶模块开始执行命令
  117. }
  118. /************************************
  119. 函数功能:对LCD的显示模式进行初始化
  120. ************************************/
  121. void LcdInt()
  122. {
  123. delay1ms(15);    //首次写指令时给LCD一段较长的反应时间
  124. WriteInstruction(0x38);   //显示模式设置:16X2显示,5X7点阵,8位数据总线
  125. delay1ms(5);
  126. WriteInstruction(0x38);
  127. delay1ms(5);
  128. WriteInstruction(0x38);
  129. delay1ms(5);     //3次写 设置模式
  130. WriteInstruction(0x0c); //显示模式设置:显示开,有光标,光标闪烁
  131. delay1ms(5);
  132. WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
  133. delay1ms(5);
  134. WriteInstruction(0x01);  //清屏
  135. delay1ms(5);

  136. }

  137. /************************************
  138. 函数功能: 扫描键盘
  139. ************************************/
  140. void key_scan()
  141. {
  142. uchar scan1,scan2,keycode,i;
  143. P1=0xf0;
  144. scan1=P1;
  145. if((scan1&0xf0)!=0xf0){          //判断是否按键
  146.   delay1ms(15);        //延时消陡
  147.   scan1=P1;
  148.   if((P1&0xf0)!=0xf0){    //二次判断是否按键
  149.    P1=0x0f;           //线反转法德核心
  150.    scan2=P1;
  151.    keycode=scan1|scan2;       //组合成键编码
  152.   }
  153.   for(i=0;i<16;i++){
  154.    if(keycode==key_code[i]){  //查表得键值
  155.     key=i;  
  156.    }
  157.   }
  158. }
  159. else{
  160.   P1=0xff;   //P1口写1,输入状态

  161. }
  162.    

  163. }
  164. /***************************************
  165. 函数功能:显示数字
  166. ***************************************/
  167. void Display()
  168. {
  169. WriteAddress(0x47);
  170. delay1ms(5);
  171. WriteData(digit[key]);
  172. }



  173. /***********************************
  174. 函数功能:主函数
  175. ***********************************/

  176. void main()
  177. {
  178.   uchar i;
  179.   P1=0xff;   //写1,读状态
  180.   delay1ms(15);
  181.   LcdInt();
  182.   WriteInstruction(0x01);
  183.   delay1ms(5);
  184.   WriteAddress(0x02);
  185.   delay1ms(5);
  186.   for(i=0;str[i]!='\0';i++){
  187.     WriteData(str[i]);
  188.    delay1ms(10);
  189.   }



  190.   WriteAddress(0x47);
  191.   delay1ms(5);
  192.   WriteData('0');
  193.   while(1){
  194.    P1=0xf0;
  195.    if((P1&0xf0)!=0xf0){
  196.    delay1ms(15);
  197.    if((P1&0xf0)!=0xf0){
  198.             
  199.           key_scan();
  200.           Display();
  201.     beep();
  202.     delay1ms(200);
  203.    }
  204.      }
  205.      }
  206. }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表