找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3821|回复: 3
打印 上一主题 下一主题
收起左侧

proteus仿真msp430,实现一个按键矩阵扫描和UART发送

[复制链接]
跳转到指定楼层
楼主
功能概述:
       实现一个4x4按键矩阵,通过按键扫描,当有按键按下时,识别按键值,并通过UART串口发送,同时在lcd1602显示。

功能实现:
1.    按键扫描
  1. void keyboardScan(){
  2.   P1OUT = 0xef;//P1.4 = 0
  3.   if((P1IN & 0x0f) != 0x0f){
  4.     delay_ms8M(5);//消抖
  5.     if((P1IN & 0x0f) != 0x0f){
  6.       if((P1IN & 0x01) == 0){ keyValue = '3';while((P1IN & 0x01) == 0);};
  7.       if((P1IN & 0x02) == 0){ keyValue = '7';while((P1IN & 0x02) == 0);};
  8.       if((P1IN & 0x04) == 0){ keyValue = 'B';while((P1IN & 0x04) == 0);};
  9.       if((P1IN & 0x08) == 0){ keyValue = 'F';while((P1IN & 0x08) == 0);};
  10.       keyboard_envent = ~keyboard_envent;
  11.     }
  12.   }
  13.   P1OUT = 0xdf;//P1.5 = 0
  14.   if((P1IN & 0x0f) != 0x0f){
  15.     delay_ms8M(5);//消抖
  16.     if((P1IN & 0x0f) != 0x0f){
  17.       if((P1IN & 0x01) == 0){ keyValue = '2';while((P1IN & 0x01) == 0);};
  18.       if((P1IN & 0x02) == 0){ keyValue = '6';while((P1IN & 0x02) == 0);};
  19.       if((P1IN & 0x04) == 0){ keyValue = 'A';while((P1IN & 0x04) == 0);};
  20.       if((P1IN & 0x08) == 0){ keyValue = 'E';while((P1IN & 0x08) == 0);};
  21.       keyboard_envent = ~keyboard_envent;
  22.     }
  23.   }
  24.   P1OUT = 0xbf;//P1.6 = 0
  25.   if((P1IN & 0x0f) != 0x0f){
  26.     delay_ms8M(5);//消抖
  27.     if((P1IN & 0x0f) != 0x0f){
  28.       if((P1IN & 0x01) == 0){ keyValue = '1';while((P1IN & 0x01) == 0);};
  29.       if((P1IN & 0x02) == 0){ keyValue = '5';while((P1IN & 0x02) == 0);};
  30.       if((P1IN & 0x04) == 0){ keyValue = '9';while((P1IN & 0x04) == 0);};
  31.       if((P1IN & 0x08) == 0){ keyValue = 'D';while((P1IN & 0x08) == 0);};
  32.       keyboard_envent = ~keyboard_envent;
  33.     }
  34.   }
  35.   P1OUT = 0x7f;//P1.7 = 0
  36.   if((P1IN & 0x0f) != 0x0f){
  37.     delay_ms8M(5);//消抖
  38.     if((P1IN & 0x0f) != 0x0f){
  39.       if((P1IN & 0x01) == 0){ keyValue = '0';while((P1IN & 0x01) == 0);};
  40.       if((P1IN & 0x02) == 0){ keyValue = '4';while((P1IN & 0x02) == 0);};
  41.       if((P1IN & 0x04) == 0){ keyValue = '8';while((P1IN & 0x04) == 0);};
  42.       if((P1IN & 0x08) == 0){ keyValue = 'C';while((P1IN & 0x08) == 0);};
  43.       keyboard_envent = ~keyboard_envent;
  44.     }
  45. <div>  }</div><div>}</div>
复制代码


2.    UART初始化
  1. void uartInit(){
  2.   DCOCTL = 0;                              
  3.   BCSCTL1 = CALBC1_1MHZ;                    // 选择1MHZ作为波特率发生器输入时钟频率
  4.   DCOCTL = CALDCO_1MHZ;
  5.   
  6.   P3SEL = 0X30;         // P3.4 TX    P3.5 RX
  7.   UCA0CTL1 |= UCSSEL_2;//clk = SMCLK 辅助时钟   select clock source
  8.   UCA0BR0 = 104;       // 1MHZ / 9600 = 104.17
  9.   UCA0BR1 = 0;         // baud rate 9600
  10.   UCA0MCTL = UCBRS0;//波特率调整  0.17 * 8 = 1.36 取整 1
  11.   
  12.   UCA0CTL1 &= ~UCSWRST;              // 初始化USCI,复位释放,结束初始化
  13. }
复制代码


3.    LCD1602初始化
  1. void lcd1602Init(){
  2.   P3DIR |= BIT0 + BIT1 + BIT2;
  3.   dataout;
  4.   rst_en;
  5.   P1DIR = 0X70;

  6.   write_com(0x38);//8 bit data, doule line, 5x7 point matrix
  7.   write_com(0x0c);//open display, close cusor,close blink
  8.   write_com(0x06);//auto move to next char after write or read
  9.   write_com(0x01);//clear screen
  10. }
复制代码


      
实现过程中遇到的问题:
1.    按键按下后会连续不断的发送,就算以很快的速度按下还是会发送两次。
解决办法:等待按键放开。
2.    Proteus虚拟终端关闭后再也打不开。
解决办法:感觉这是一个bug,只能重新建一个项目。

仿真图.jpg (140.32 KB, 下载次数: 144)

仿真图.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:345368 发表于 2019-5-7 21:37 | 只看该作者
IAR和proteus文件夹里是空的
回复

使用道具 举报

板凳
ID:429971 发表于 2019-5-8 14:29 | 只看该作者
jaedong 发表于 2019-5-7 21:37
IAR和proteus文件夹里是空的

不是吧,我传的时候是有的,要不你留一个邮箱我发给你吧

回复

使用道具 举报

地板
ID:304785 发表于 2020-6-18 22:00 | 只看该作者
这不是一个bug,你只要点击菜单栏debug-》virtual仪器,就可以重新打开。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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