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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3925|回復: 2
打印 上一主題 下一主題
收起左側

單片機矩陣鍵盤模擬手機鍵盤輸入西文字符和數字源程序分享

[復制鏈接]
跳轉到指定樓層
樓主
ID:312553 發表于 2018-4-20 17:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大三的時候做的單片機課程設計源代碼
STC89C52單片機,用的LCD1602液晶顯示屏和4*4的矩陣鍵盤
功能大致就是選定9個按鍵進行a~z 0~9的輸入,并能通過兩個按鍵移動光標選擇輸入的位置。
本貼分享的是源代碼

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define LCD1602_DB P0
  6. sbit RS = P1^0;   
  7. sbit RW = P1^1;
  8. sbit EN = P1^5;

  9. #define RS_CLR RS=0
  10. #define RS_SET RS=1

  11. #define RW_CLR RW=0
  12. #define RW_SET RW=1

  13. #define EN_CLR EN=0
  14. #define EN_SET EN=1

  15. #define DataPort P0

  16. uchar code table[]={'A','B','C'};
  17. uchar code table1[]={'D','E','F'};        //
  18. uchar code table2[]={'G','H','I'};
  19. uchar code table3[]={'J','K','L'};
  20. uchar code table4[]={'M','N','O'}; //
  21. uchar code table5[]={'P','Q','R'};
  22. uchar code table6[]={'S','T','U'};
  23. uchar code table7[]={'V','W','X'};
  24. uchar code table8[]={'Y','Z','!'};//
  25. unsigned char code KeyCode[] = {  //4*4矩陣鍵盤按鍵編碼
  26.         0xE7, 0xD7, 0xB7, 0x77, 0xEB, 0xDB, 0xBB, 0x7B,
  27.         0xED, 0xDD, 0xBD, 0x7D, 0xEE, 0xDE, 0xBE, 0x7E,      
  28.         };
  29. uchar num1,num2,num3,num4,num5,num6,num7,num8,num9,key=15;\
  30. char j,k;
  31. void light(uchar x,uchar y);
  32. void delayms(uint xms)
  33. {
  34.      uint i,j;
  35.          for(i=xms;i>0;i--)
  36.             for(j=110;j>0;j--);
  37. }

  38.   
  39. void LCD_Write_Com(uchar com)
  40. {  
  41. delayms(5);
  42. RS_CLR;
  43. RW_CLR;
  44. EN_SET;
  45. DataPort= com;
  46. _nop_();
  47. EN_CLR;
  48. }


  49. void LCD_Write_Data(uchar Data)
  50. {
  51. delayms(5);
  52. RS_SET;
  53. RW_CLR;
  54. EN_SET;
  55. DataPort= Data;
  56. _nop_();
  57. EN_CLR;
  58. }
  59. void LCD_Clear(void)
  60. {
  61. LCD_Write_Com(0x01);
  62. delayms(5);
  63. }
  64. void light(uchar x,uchar y)          //光標位置
  65. {
  66.   if (y == 0)
  67.     {     
  68.     LCD_Write_Com(0x80 + x);     
  69.     }   
  70. else
  71.     {     
  72.     LCD_Write_Com(0xC0 + x);     
  73.     }

  74. }
  75. void LCD_Write_Char(uchar x,uchar y,uchar Data) //LCD 寫
  76. {     
  77. light( x,y);      
  78. LCD_Write_Data( Data);
  79. light(x, y);  
  80. }
  81. void LCD_Init(void)  //lcd初始化
  82. {
  83.    LCD_Write_Com(0x38);   
  84.    delayms(5);
  85.    LCD_Write_Com(0x38);
  86.    delayms(5);
  87.    LCD_Write_Com(0x38);
  88.    delayms(5);
  89.    LCD_Write_Com(0x38);  
  90.    LCD_Write_Com(0x08);   
  91.    LCD_Write_Com(0x01);   
  92.    LCD_Write_Com(0x06);   
  93.    delayms(5);
  94.    LCD_Write_Com(0x0C);
  95.    LCD_Write_Com(0x0F); //顯示光標以及光標閃爍
  96.    }
  97.   
  98. void ScanKeyboard()                    //鍵盤掃描程序
  99. {
  100.         unsigned char scan1,scan2,keyboard;
  101.         unsigned char i;
  102.         P2 = 0xf0;                 //4條行線輸出低電平,4條列線作為輸出
  103.         scan1 = P2;                 //讀取列線狀態
  104.         if((scan1&0xf0)!=0xf0)   //判斷是否有鍵按下
  105.         {
  106.                 delayms(10);                 //延時去抖
  107.                 scan1 = P2;                 //再次讀取列線狀態       
  108.                 if((scan1&0xf0)!=0xf0)  //再次判斷是否有鍵按下
  109.                 {
  110.                         P2 = 0x0f;        //4條列線輸出低電平,4條行線作為輸出
  111.                         scan2 = P2;   //讀取行線狀態
  112.                         keyboard = scan1 | scan2;  //組合鍵值
  113.                         while((P2&0x0f)!=0x0f);  //等待按鍵釋放
  114.                         for(i=0;i<=15;i++)                  //根據按鍵編碼得出按鍵編號
  115.                         {
  116.                                 if(keyboard == KeyCode[i])//判斷對應的鍵值 以及按下次數
  117.                                 {
  118.                                         key = i;
  119.                                         switch(key)
  120.                          {
  121.                          case 0:num1++;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
  122.                          case 1:num2++;num1=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
  123.                          case 2:num3++;num1=0;num2=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
  124.                          case 4:num4++;num1=0;num2=0;num3=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
  125.                          case 5:num5++;num1=0;num2=0;num3=0;num4=0;num6=0;num7=0;num8=0;num9=0;break;
  126.                          case 6:num6++;num1=0;num2=0;num3=0;num4=0;num5=0;num7=0;num8=0;num9=0;break;
  127.                                          case 8:num7++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num8=0;num9=0;break;
  128.                          case 9:num8++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num9=0;break;
  129.                          case 10:num9++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;break;
  130.                                          case 15:k++;            
  131.                                          if(k==16)
  132.                              {
  133.                                 k=0;j++;
  134.                                 if(j==2)
  135.                                     {
  136.                                          j=0;
  137.                                     }
  138.                              }
  139.                              light( k,j);break;
  140.                                          case 7:k--;
  141.                                          if(k==-1)
  142.                              {
  143.                                 k=15;j++;
  144.                                 if(j==2)
  145.                                     {
  146.                                          j=0;
  147.                                     }
  148.                              }
  149.                              light( k,j);break;
  150.                          default:break;
  151.                          }
  152.                                  }

  153.                         }
  154.                 }
  155.         }
  156. }


  157. uchar  jianzhi()        //按下次數所顯示的字母
  158. {
  159.             
  160.                  switch(key)
  161.                  {
  162.                          case 0:return table[(num1-1)%3];break;
  163.                          case 1:return table1[(num2-1)%3];break;
  164.                          case 2:return table2[(num3-1)%3];break;
  165.                          case 4:return table3[(num4-1)%3];break;
  166.                          case 5:return table4[(num5-1)%3];break;
  167.                          case 6:return table5[(num6-1)%3];break;
  168.                                          case 8:return table6[(num7-1)%3];break;
  169.                          case 9:return table7[(num8-1)%3];break;
  170.                          case 10:return table8[(num9-1)%3];break;
  171.                          default:return 0xff;break;
  172.                      }
  173.                  if(key==0||key==1||key==2||key==4||key==5||key==6||key==8||key==9||key==10) return table[key];
  174.                  else return 0xff;
  175.                   
  176.             

  177. }
  178. void xianshi()
  179. {
  180.         static uchar str;
  181.         str=jianzhi();
  182.         if(str!=0xff)
  183.         {
  184.         if((k==0)&&(j==0))
  185.         LCD_Clear();
  186.         LCD_Write_Char(0+k,0+j,str);
  187.         key=15;                        
  188.         }
  189.        
  190.        
  191. }
  192. void main()
  193. {

  194.          LCD_Init();                   //LCD1602初始化
  195.          while(1)
  196.         {               
  197.                         ScanKeyboard(); //鍵盤掃描
  198.                         xianshi();                 //顯示所按下字母以及光標的移動
  199.                 }
  200. }
復制代碼

所有資料51hei提供下載:
矩陣鍵盤模擬手機鍵盤.rar (1.73 KB, 下載次數: 29)


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:285380 發表于 2020-7-14 08:59 | 只看該作者
這為我的設計提供了參考,感謝。
回復

使用道具 舉報

板凳
ID:285380 發表于 2020-7-14 10:12 | 只看該作者
void LCD_Init(void)                //lcd初始化?
{
           RW=0;
              EN=0;
           LCD_Write_Com(0x38);  
           LCD_Write_Com(0x08);   
           LCD_Write_Com(0x01);   
           LCD_Write_Com(0x06);   
           LCD_Write_Com(0x0C);
           LCD_Write_Com(0x0F);              //顯示光標以及光標閃爍  
}
缺少1602打開使能,引用的注意。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性一区二区三区 | 美日韩视频 | 久久成人激情 | 2021狠狠天天天 | 美女131mm久久爽爽免费 | 国产伦精品一区二区三区精品视频 | 久久免费观看一级毛片 | 国产精品美女久久久久久久网站 | 99热首页 | 国产精品一区在线播放 | www.日韩欧美| 日韩成人免费视频 | 久久久久久综合 | 久久久久国产一区二区三区 | 成年人网站免费视频 | 中文字幕一区二区三区在线观看 | 国产精品五月天 | 视频三区 | 久久国产精品-国产精品 | 久久在线免费 | 国产一级一级国产 | 成人黄在线观看 | 日韩av成人在线 | 日韩av啪啪网站大全免费观看 | 国产三级| 精品一区二区三区四区五区 | 91丨九色丨国产在线 | 福利影院在线看 | 国产一区影院 | 国产精品一区二区免费 | 欧美a在线 | 牛牛热在线视频 | 91精品国产综合久久福利软件 | 国产精品亚洲一区二区三区在线 | 一区二区视频免费观看 | 高清免费av| 亚洲视频在线免费观看 | 亚洲欧洲精品在线 | 天天操夜夜操 | 91污在线 | 久艹av|