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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3791|回復(fù): 2
收起左側(cè)

單片機(jī)矩陣鍵盤模擬手機(jī)鍵盤輸入西文字符和數(shù)字源程序分享

[復(fù)制鏈接]
ID:312553 發(fā)表于 2018-4-20 17:31 | 顯示全部樓層 |閱讀模式
大三的時(shí)候做的單片機(jī)課程設(shè)計(jì)源代碼
STC89C52單片機(jī),用的LCD1602液晶顯示屏和4*4的矩陣鍵盤
功能大致就是選定9個(gè)按鍵進(jìn)行a~z 0~9的輸入,并能通過兩個(gè)按鍵移動光標(biāo)選擇輸入的位置。
本貼分享的是源代碼

單片機(jī)源程序如下:
  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)          //光標(biāo)位置
  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); //顯示光標(biāo)以及光標(biāo)閃爍
  96.    }
  97.   
  98. void ScanKeyboard()                    //鍵盤掃描程序
  99. {
  100.         unsigned char scan1,scan2,keyboard;
  101.         unsigned char i;
  102.         P2 = 0xf0;                 //4條行線輸出低電平,4條列線作為輸出
  103.         scan1 = P2;                 //讀取列線狀態(tài)
  104.         if((scan1&0xf0)!=0xf0)   //判斷是否有鍵按下
  105.         {
  106.                 delayms(10);                 //延時(shí)去抖
  107.                 scan1 = P2;                 //再次讀取列線狀態(tài)       
  108.                 if((scan1&0xf0)!=0xf0)  //再次判斷是否有鍵按下
  109.                 {
  110.                         P2 = 0x0f;        //4條列線輸出低電平,4條行線作為輸出
  111.                         scan2 = P2;   //讀取行線狀態(tài)
  112.                         keyboard = scan1 | scan2;  //組合鍵值
  113.                         while((P2&0x0f)!=0x0f);  //等待按鍵釋放
  114.                         for(i=0;i<=15;i++)                  //根據(jù)按鍵編碼得出按鍵編號
  115.                         {
  116.                                 if(keyboard == KeyCode[i])//判斷對應(yīng)的鍵值 以及按下次數(shù)
  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()        //按下次數(shù)所顯示的字母
  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();                 //顯示所按下字母以及光標(biāo)的移動
  199.                 }
  200. }
復(fù)制代碼

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

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:285380 發(fā)表于 2020-7-14 08:59 | 顯示全部樓層
這為我的設(shè)計(jì)提供了參考,感謝。
回復(fù)

使用道具 舉報(bào)

ID:285380 發(fā)表于 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);              //顯示光標(biāo)以及光標(biāo)閃爍  
}
缺少1602打開使能,引用的注意。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩和的一区二区 | 婷婷久久网 | 欧美在线一区二区三区 | 鸳鸯谱在线观看高清 | 日本综合在线观看 | 日韩av美女电影 | 亚洲国产精品久久久 | 国产精品久久亚洲7777 | 久久69精品久久久久久国产越南 | 欧洲亚洲精品久久久久 | 成人免费一区二区三区牛牛 | 福利社午夜影院 | 在线天堂免费中文字幕视频 | 欧美黄在线观看 | 一区二区三区中文字幕 | 一区二区三区四区视频 | 男人天堂色 | 亚洲色图插插插 | 男女啪啪高潮无遮挡免费动态 | 国产精品69毛片高清亚洲 | 亚洲精色| 色久五月| 久久国品片 | 久久夜色精品国产 | 久久中文免费视频 | 精品久久国产 | 殴美成人在线视频 | 国产1区2区在线观看 | 超碰在线人人干 | 欧美午夜精品 | dy天堂 | 国产精品久久久久久一级毛片 | 高清欧美性猛交xxxx黑人猛交 | 欧美日本一区 | 黑人巨大精品 | 精品一区二区三区四区 | 在线观看视频你懂得 | 成人精品 | 色视频在线免费观看 | 国产电影一区二区三区爱妃记 | 亚洲图片视频一区 |