欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9407|回復: 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 單片機教程網

快速回復 返回頂部 返回列表