#include "msp430f249.h"
unsigned char keynum;//定义键号
void delay(void);//延时函数申明
void display(void);//显示函数申明
unsigned char scankey(void);//扫描函数申明
main( void )
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL=0x00;P2SEL=0x00;//设功能
P1DIR=0xff;P2DIR=0xF0;//定方向,P2行线输入,列线输出
//行线有上拉电阻,列线扫描,无键则读行线必为1
//列线
P1OUT=0xFF;//初始灯灭
P2OUT=0x00;//列线初值为0,当有键按下时,行线会被拉低,便于产生下降沿中断
//注:虽然令P2OUT=0,但因为P2DIR的设定,只有高4位列线有输出,后面语句同
P2IE=0x0F;//行线开中断
P2IES=0x0F;//行线的中断属于下降沿
_BIS_SR(LPM3_bits + GIE); //最低功耗睡眠
while(1);
}
#pragma vector=PORT2_VECTOR //中断服务对象申明
__interrupt void p2int(void) //中断函数定义
{
delay(); //延迟10ms去抖
if((P2IN&0x0F)!=0x0F) //按键判断
{
keynum=scankey(); //获取键号
display(); //显示键号(静态)
}
P2IFG=0; //清除中断标志
}
unsigned char scankey(void)//扫描函数
{
unsigned char x=16;//定义键号返回值x
unsigned char i,n,m,j=0x10;//定义m列,n行,列扫描数据j,初值选中0列
for(i=0;i<4;i++)//有4列,需要扫4次
{
P2OUT=~j;//输出列扫描信号(行线不会输出)
if((P2IN&0x0F)!=0x0F)//如果行有变低的
{
m=i;//顺手记下列号
switch(P2IN&0x0F) //判断行号
{
case 0x0e:n=0;break;
case 0x0d:n=1;break;
case 0x0b:n=2;break;
case 0x07:n=3;break;
}
x=n*4+m;//算键号
}
j=j<<1;//为下一列做准备
}
P2OUT=0x00;//扫描完成,列线重新为低,为下次中断做准备
return(x);
}
void display(void) //显示对应键号0~F,无键则显示H,一共17个数
{
unsigned char number[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0X89};
P1OUT=number[keynum]; //显示
}
void delay(void)//10ms延时
{
unsigned int a;
for(a=10000;a>0;a--);
}
算了,就给你吧,今天我程序也没写出来,深知写不出来的痛苦 |