找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3430|回复: 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 单片机教程网

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