1、/*工程名:msp430_project作者:模块名称:键扫描模块(Nx(N-1)型键盘,N=5) 模块描述:通过 TIMER1A0 中断定时启动键扫描.。 - -|msp430| p10.0 |5x4keyboard|5438 | | | | | p10.4 | |版本:*/ #include “msp430x54x.h“ #DEFINE uchar unsigned char#DEFINE uint unsigned int/*定义每个按键名及对应值*/#DEFINE num0 0xf0 /*#DEFINE num0 0x00 不行, keybuff,keybufs 初始化 0x00*/#
2、DEFINE num1 0x01#DEFINE num2 0x02#DEFINE num3 0x03#DEFINE num4 0x04#DEFINE num5 0x05#DEFINE num6 0x06#DEFINE num7 0x07#DEFINE num8 0x08#DEFINE num9 0x09#DEFINE dirup 0x0a#DEFINE dirdown 0x0b#DEFINE dirleft 0x0c#DEFINE dirright 0x0d#DEFINE ctlenter 0x0e#DEFINE ctlshift 0x0f#DEFINE ctlclear 0x10#DEFIN
3、E ctlexit 0x11#DEFINE ctlreset 0x12#DEFINE ctlstop 0x13/*定义全局变量*/ uchar keybuff=0x00;uchar keybufs=0x00;uchar keyvalue=0xff;uchar keyflag=0x00;/*timerA0 初始化*/void init_timera0(void)WDTCTL=WDTPW+WDTHOLD;/*CCR0 中断允许*/TA1CCTL0 = CCIE; /*捕获/比较寄存器设 50ms 中断, (50/1000)*32768=1638*/ TA1CCR0 = 1638;/*使用 3276
4、8hz 时钟,增计数模式,ta 清零*/ TA1CTL = TASSEL_1 + MC_1 + TACLR; #progma vector=TIMER1_A0_ISR(void)_interrupt void TIMER1_A0_ISR(void)keyscan();/*每 50ms 更新一次 max7219 数据*/led_show();/*键刚按下*/*第一次扫描到电平有变化时,按键值给 keybuff,再 keybufs=keybuff*/*50ms 后扫描到电平有变化时,按键值给 keybuff,再比较 keybufs 与 keybuff 是否相等:若相等,确定有键按下,值赋给 key
5、value,keyflag=0xff,keybuff,keybufs 清零;不等 keybuff,keybufs 清零*/*健刚松开*/ /*第一次扫描到无变化时即 keybuff=0x00,keybufs,keyflag 清零,按键过程结束*/*键盘扫描模块*/void keyscan(void) /*设置 P10.0 为输出且输出高电平,p10.1-p10.4 为输入*/P10DIR | =0X01;P10OUT | =0x01;if(P10IN /*按键 9*/else if(P10IN /*按键 exit*/else if(P10IN /*按键 right*/else if(P10IN
6、 /*设置 P10.1 为输出且输出高电平,p10.0/p10.2/p10.3/p10.4 为输入*/P10DIR | =0X02;P10OUT | =0x02;if(P10IN /*按键 8*/else if(P10IN /*按键 up*/else if(P10IN /*按键 down*/else if(P10IN /*设置 P10.2 为输出且输出高电平,p10.0/p10.1/p10.3/p10.4 为输入*/P10DIR | =0X04;P10OUT | =0x04;if(P10IN /*按键 7*/else if(P10IN /*按键 shift*/else if(P10IN /*按
7、键 left*/else if(P10IN /*设置 P10.3 为输出且输出高电平,p10.0/p10.1/p10.2/p10.4 为输入*/P10DIR | =0X08;P10OUT | =0x08;if(P10IN /*按键 6*/else if(P10IN /*按键 reset*/else if(P10IN /*按键 enter*/else if(P10IN /*设置 P10.4 为输出且输出高电平,p10.0/p10.1/p10.2/p10.3 为输入*/P10DIR | =0X10;P10OUT | =0x10;if(P10IN /*按键 5*/else if(P10IN /*按键
8、 clear*/else if(P10IN /*按键 stop*/else if(P10IN /*判断是第一次还是第二次按下,做出对应动作 */*是第一次按下 或 按键进入稳定状态 */ if(keybuffs=0x00)keybuffs=keybuff;if(keybuff=0)/*没键按下 或 已经取键值(keybuff,keybufs 复位,keyflag=0xff ),再次扫描到无按键按下 */ keyflag=0x00;/*按下键中间时间段扫描时,清零 keybufs,使满足上一层 if 条件,进入本过程*/if(keyflag=0xff)keybufs=0x00;keybuff=0x00; /*是第二次按下*/else if(keybuffs ! =0) keybuff=0x00;keybufs=0x00;keyflag=0xff;