久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2167|回復: 1
收起左側

單片機矩陣鍵盤輸入和液晶顯示

[復制鏈接]
ID:1050239 發表于 2022-11-3 18:26 | 顯示全部樓層 |閱讀模式
51鍵盤及數字輸入顯示
主程序
  1. #include<reg51.h>        
  2. #include"lcd.h"

  3. #define GPIO_KEY P1

  4. unsigned char KeyValue;           //用來存放讀取到的鍵值
  5. unsigned char KeyState;           //用來存放按鍵狀態

  6. unsigned char dat[]="0123456789ABCDEF";
  7. unsigned char test[]=" 51_  lcd  ";

  8. void Delay10ms();   //延時50us
  9. void KeyDown();                 //檢測按鍵函數

  10. /*******************************************************************************
  11. * 函 數 名         : main
  12. * 函數功能                       : 主函數
  13. * 輸    入         : 無
  14. * 輸    出         : 無
  15. *******************************************************************************/
  16. void main(void)
  17. {
  18.         unsigned char i;
  19.                
  20.         unsigned char cursor = '_';       //模擬光標
  21.         unsigned int cnt = 0;             //光標計數
  22.         unsigned char len = 0;            //編輯框現有字符數
  23.         
  24.         LcdInit();
  25.         KeyState=0;                 //按鍵狀態復位
  26.         for(i=0;i<16;i++)
  27.         {
  28. //                LcdWriteCom(0x80);             //設置數據指針起點為第一行,默認為第一行
  29.                 LcdWriteData(test[i]);        
  30.         }
  31.         while(1)
  32.         {
  33.                 KeyDown();                  //檢測按鍵
  34.                 if(KeyState)                //檢測到有按鍵按下
  35.                 {
  36.                         if(len < 16)                           //一行最多16個字符
  37.                         {
  38.                                 KeyState=0;                               //狀態復位
  39.                                 LcdWriteCom(0x80+0x40+len);                //設置數據指針起點為第二行,默認為第一行
  40.                           LcdWriteData(dat[KeyValue]);               //顯示數據(按鍵值)到LCD
  41.                                 LcdWriteCom(0x80 + 0x40 + (++len));        //設置數據指針起點
  42.                    }
  43.            }        
  44. /* 模擬光標閃爍--不重要 */
  45.                 cnt++;
  46.                 if(cnt == 2500)
  47.                 {
  48.                         LcdWriteCom(0x80+0x40 + len);    //光標在當前字符后面顯示
  49.                         LcdWriteData(cursor);            //顯示光標
  50.                 }
  51.                 else if(cnt == 5000)
  52.                 {
  53.                         cnt = 0;        
  54.                         LcdWriteCom(0x80+0x40 + len);    //不顯示光標,閃爍一次
  55.                         LcdWriteData(' ');
  56.                         
  57.                 }
  58.         }                                       
  59. }
  60. /*******************************************************************************
  61. * 函 數 名         : KeyDown
  62. * 函數功能                   : 檢測有按鍵按下并讀取鍵值
  63. * 輸    入         : 無
  64. * 輸    出         : 無
  65. *******************************************************************************/
  66. void KeyDown(void)
  67. {
  68.         char a;
  69.         GPIO_KEY=0x0f;
  70.         if(GPIO_KEY!=0x0f)
  71.         {
  72.                 Delay10ms();
  73.                 if(GPIO_KEY!=0x0f)
  74.                 {
  75.                         KeyState=1;
  76.                         //測試列
  77.                         GPIO_KEY=0X0F;
  78. //                         Delay10ms();
  79.                         switch(GPIO_KEY)
  80.                         {
  81.                                 case(0X07):        KeyValue=0;break;
  82.                                 case(0X0b):        KeyValue=1;break;
  83.                                 case(0X0d): KeyValue=2;break;
  84.                                 case(0X0e):        KeyValue=3;break;
  85. //                                default:        KeyValue=17;        //檢測出錯回復17意思是把數碼管全滅掉。
  86.                         }
  87.                         //測試行
  88.                         GPIO_KEY=0XF0;
  89.                         Delay10ms();
  90.                         switch(GPIO_KEY)
  91.                         {
  92.                                 case(0X70):        KeyValue=KeyValue;break;
  93.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  94.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  95.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  96. //                                default:        KeyValue=17;
  97.                         }
  98.                         while((a<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  99.                         {
  100.                                 Delay10ms();
  101.                                 a++;
  102.                         }
  103.                         a=0;
  104.                 }
  105.         }
  106. }
  107. /*******************************************************************************
  108. * 函 數 名         : Delay10ms
  109. * 函數功能                   : 延時函數,延時10ms
  110. * 輸    入         : 無
  111. * 輸    出         : 無
  112. *******************************************************************************/
  113. void Delay10ms(void)   //誤差 0us
  114. {
  115.     unsigned char a,b,c;
  116.     for(c=1;c>0;c--)
  117.         for(b=38;b>0;b--)
  118.             for(a=130;a>0;a--);
  119. }

復制代碼
LCD.C文件

  1. #include"lcd.h"

  2. /*******************************************************************************
  3. * 函 數 名         : Lcd1602_Delay1ms
  4. * 函數功能                   : 延時函數,延時1ms
  5. * 輸    入         : c
  6. * 輸    出         : 無
  7. * 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
  8. *******************************************************************************/

  9. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  10. {
  11.     uchar a,b;
  12.         for (; c>0; c--)
  13.         {
  14.                  for (b=199;b>0;b--)
  15.                  {
  16.                           for(a=1;a>0;a--);
  17.                  }      
  18.         }
  19.             
  20. }

  21. /*******************************************************************************
  22. * 函 數 名         : LcdWriteCom
  23. * 函數功能               : 向LCD寫入一個字節的命令
  24. * 輸    入          : com
  25. * 輸    出          : 無
  26. *******************************************************************************/
  27. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  28. void LcdWriteCom(uchar com)          //寫入命令
  29. {
  30.         LCD1602_E = 0;     //使能
  31.         LCD1602_RS = 0;           //選擇發送命令
  32.         LCD1602_RW = 0;           //選擇寫入
  33.         
  34.         LCD1602_DATAPINS = com;     //放入命令
  35.         Lcd1602_Delay1ms(1);                //等待數據穩定

  36.         LCD1602_E = 1;                  //寫入時序
  37.         Lcd1602_Delay1ms(5);          //保持時間
  38.         LCD1602_E = 0;
  39. }
  40. #else
  41. void LcdWriteCom(uchar com)          //寫入命令
  42. {
  43.         LCD1602_E = 0;         //使能清零
  44.         LCD1602_RS = 0;         //選擇寫入命令
  45.         LCD1602_RW = 0;         //選擇寫入

  46.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  47.         Lcd1602_Delay1ms(1);

  48.         LCD1602_E = 1;         //寫入時序
  49.         Lcd1602_Delay1ms(5);
  50.         LCD1602_E = 0;

  51. //        Lcd1602_Delay1ms(1);
  52.         LCD1602_DATAPINS = com << 4; //發送低四位
  53.         Lcd1602_Delay1ms(1);

  54.         LCD1602_E = 1;         //寫入時序
  55.         Lcd1602_Delay1ms(5);
  56.         LCD1602_E = 0;
  57. }
  58. #endif
  59. /*******************************************************************************
  60. * 函 數 名         : LcdWriteData
  61. * 函數功能                   : 向LCD寫入一個字節的數據
  62. * 輸    入         : dat
  63. * 輸    出         : 無
  64. *******************************************************************************/                  
  65. #ifndef         LCD1602_4PINS                  
  66. void LcdWriteData(uchar dat)                        //寫入數據
  67. {
  68.         LCD1602_E = 0;        //使能清零
  69.         LCD1602_RS = 1;        //選擇輸入數據
  70.         LCD1602_RW = 0;        //選擇寫入

  71.         LCD1602_DATAPINS = dat; //寫入數據
  72.         Lcd1602_Delay1ms(1);

  73.         LCD1602_E = 1;   //寫入時序
  74.         Lcd1602_Delay1ms(5);   //保持時間
  75.         LCD1602_E = 0;
  76. }
  77. #else
  78. void LcdWriteData(uchar dat)                        //寫入數據
  79. {
  80.         LCD1602_E = 0;          //使能清零
  81.         LCD1602_RS = 1;          //選擇寫入數據
  82.         LCD1602_RW = 0;          //選擇寫入

  83.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  84.         Lcd1602_Delay1ms(1);

  85.         LCD1602_E = 1;          //寫入時序
  86.         Lcd1602_Delay1ms(5);
  87.         LCD1602_E = 0;

  88.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  89.         Lcd1602_Delay1ms(1);

  90.         LCD1602_E = 1;          //寫入時序
  91.         Lcd1602_Delay1ms(5);
  92.         LCD1602_E = 0;
  93. }
  94. #endif
  95. /*******************************************************************************
  96. * 函 數 名       : LcdInit()
  97. * 函數功能                 : 初始化LCD屏
  98. * 輸    入       : 無
  99. * 輸    出       : 無
  100. *******************************************************************************/                  
  101. #ifndef                LCD1602_4PINS
  102. void LcdInit()                                                  //LCD初始化子程序
  103. {
  104.          LcdWriteCom(0x38);  //開顯示
  105.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  106.         LcdWriteCom(0x06);  //寫一個指針加1
  107.         LcdWriteCom(0x01);  //清屏
  108.         LcdWriteCom(0x80);  //設置數據指針起點
  109. }
  110. #else
  111. void LcdInit()                                                  //LCD初始化子程序
  112. {
  113.         LcdWriteCom(0x32);         //將8位總線轉為4位總線
  114.         LcdWriteCom(0x28);         //在四位線下的初始化
  115.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  116.         LcdWriteCom(0x06);  //寫一個指針加1
  117.         LcdWriteCom(0x01);  //清屏
  118.         LcdWriteCom(0x80);  //設置數據指針起點
  119. }
  120. #endif



復制代碼
LCD.H文件
  1. #ifndef __LCD_H_
  2. #define __LCD_H_
  3. /**********************************
  4. 當使用的是4位數據傳輸的時候定義,
  5. 使用8位取消這個定義
  6. **********************************/
  7. //#define LCD1602_4PINS

  8. /**********************************
  9. 包含頭文件
  10. **********************************/
  11. #include<reg51.h>

  12. //---重定義關鍵詞---//
  13. #ifndef uchar
  14. #define uchar unsigned char
  15. #endif

  16. #ifndef uint
  17. #define uint unsigned int
  18. #endif

  19. /**********************************
  20. PIN口定義
  21. **********************************/
  22. #define LCD1602_DATAPINS P0
  23. sbit LCD1602_E=P2^7;
  24. sbit LCD1602_RW=P2^5;
  25. sbit LCD1602_RS=P2^6;

  26. /**********************************
  27. 函數聲明
  28. **********************************/
  29. /*在51單片機12MHZ時鐘下的延時函數*/
  30. void Lcd1602_Delay1ms(uint c);   //誤差 0us
  31. /*LCD1602寫入8位命令子函數*/
  32. void LcdWriteCom(uchar com);
  33. /*LCD1602寫入8位數據子函數*/        
  34. void LcdWriteData(uchar dat)        ;
  35. /*LCD1602初始化子程序*/               
  36. void LcdInit();                                                  

  37. #endif
復制代碼

LM016.jpg

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1064915 發表于 2023-7-23 15:12 | 顯示全部樓層
LCD1602_4PINS如何使用?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本黄色大片免费 | 国产高清精品一区二区三区 | 欧美在线天堂 | 国产精品欧美一区二区三区 | 99久久久久久 | 免费黄色录像视频 | 亚洲午夜精品一区二区三区 | 亚洲精品欧美 | 狠狠久| 在线不卡av| 久久久久久国产精品免费 | 一级片免费在线观看 | 国产一区在线免费 | 国产精品久久久久久久久免费高清 | 亚洲精品自在在线观看 | 日韩欧美在线一区 | 综合久久综合久久 | 男女免费在线观看视频 | 国产一区二区a | 日产精品久久久一区二区福利 | 日韩在线一区二区三区 | 精品一区二区三区在线观看国产 | 狠狠操狠狠干 | 欧美亚洲在线 | 色噜噜色综合 | 久久国 | 日韩在线观看一区二区三区 | 精品国产不卡一区二区三区 | 欧美一级免费片 | 亚洲欧美日韩精品久久亚洲区 | 在线免费观看毛片 | 国产精品亚洲综合 | 中日av | 欧美成人精品一区二区男人看 | 91视频导航 | 久久久久久久一区 | 成人小视频在线免费观看 | 亚洲精品电影网在线观看 | av在线一区二区三区 | pacopacomama在线| 精品国产不卡一区二区三区 |