|
#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输出扫描码显示在数码管上
}
}
}
}
|
评分
-
查看全部评分
|