找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3207|回复: 0
收起左侧

msp430f1612矩阵键盘源码用数码管显示键值

[复制链接]
ID:384757 发表于 2018-8-9 20:33 | 显示全部楼层 |阅读模式
#include<msp430f1612.h>
unsigned char const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管的段位
//定义共阴极数码管段选码表,无小数点
static  char key;          //定义静态变量key(用来记录键盘编码)
//系统默认时钟源dco,时钟aclk,频率800k
void delayus(unsigned int t)   //延时函数
{
       unsigned int i;
       while(t--)
         for(i=1330;i>0;i--);     //实际测得时间1ms,根据示波器
}
char keyscan(void)                //扫描模块
{
      char sccode,recode;          //定义行,列键盘编码
      P3OUT=0x00;                 //p3输出端口全部置低
      if((P3IN&0xf0)!=0xf0)          //去掉抖动模块,判断是否有键抖动,如果是返回
      {
           delayus(20);             //延时20ms
          if((P3IN&0xf0)!=0xf0)     //再次判断是否有键抖动,如果是返回
          {
             sccode=0xfe;           //将第一行置低(p3.0),用来扫描
             while((sccode&0x0f)!=0x0f)  //按位与&;尽量取0.行扫描完成   
             {
                 P3OUT=sccode;           //输出行扫描码                  
                 if((P3IN&0XF0)!=0XF0)   //当前有键闭合 ,因为in是后四位所以f0                  
                 {
                   recode=(P3IN&0XF0)|0X0F; //读取高4位列值,低四位置一(配合行码)
                   //按位或尽量取1
                   key=(sccode&recode);     //行和列组合得到键盘编码      
                   return key;              //返回静态变量key
                  
                 }
                 else                       //所扫描行没有键闭合
                  
                 {
                  
                  sccode=(sccode<<1)|0x01; //行扫描码左移一位,就换到了下一行置0
                  
                   //按位或尽量取1
                 }        
           
             }
               
          }
         
           return 0xff;//没有键闭合则返回
               
      }
      
       return 0xff;//没有键闭合则返回               ?
}
   
  
  char getkeyval(char keycode)
  {
    char keyval;
    switch(keycode)  
    {
    case 0x77:           //0b01110111
      keyval=0  ;
      break;
       case 0x7b :       //0b01111011
      keyval= 1 ;
      break;
       case 0x7d:        //0b01111101
      keyval= 2 ;
      break;
       case 0x7e:        //
      keyval=  3;
      break;
       case 0xb7:
      keyval=  4;
      break;
       case 0xbb:
      keyval=  5;
      break;
       case 0xbd:
      keyval=  6;
      break;
       case 0xbe:
      keyval=  7;
      break;
       case 0xd7:
      keyval=  8;
      break;
       case 0xdb:
      keyval=  9;
      break;
       case 0xdd:
      keyval=  10;
      break;
       case 0xde:
      keyval=  11;
      break;
       case 0xe7:
      keyval=  12;
      break;
       case 0xeb:
      keyval=  13;
      break;
       case 0xed :
      keyval=  14;
      break;
       case 0xee:
      keyval=15  ;
      break;
    default :keyval =255;
    }
    return keyval;

   
  }
      
      void main(void)
      {
      
          WDTCTL=WDTPW+WDTHOLD;//关狗
          P1DIR=0XFF;          //全部输出
          P1SEL=0X00;          //功能设置为普通i/o端口
          P1OUT=0X00;          //p1out全部置低
          P3DIR=0X0F;        //p3.4~p3.7键盘输入,p3.0~p3.3键盘扫描信号输出输出
          while(1)
          {  
             key=getkeyval(keyscan());  //key取扫描值
             if(key!=255)               //key是正常值,按键有效
             {
               P1OUT=table[key];       //p1out输出扫描码显示在数码管上
                    
             }
           

         }
   
            
              
              
      }
        
        
        
        
        
        
        
        
      }

矩阵键盘.zip

1.54 KB, 下载次数: 18, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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