MSP430学习笔记7-4*4键盘的对应数码管显示
扫描二维码
随时随地手机看文章
这个例程也是开发板上面的一个经典例程,我对程序的框架进行了修改,更适合以后的调用。具体的4*4键盘扫描原理较为基础这里不再赘述,这里我认为比较重要的是要养成一个良好的写程序的习惯,想4*4键盘扫描这样的函数可以写成一个固定的C或者H文件,便于以后调用。先看看主程序:
/***********************************************
程序功能:扫描4X4键盘并将键值在数码管上显示
------------------------------------------------
测试说明:按动K1~K16按键,观察数码管显示
************************************************/
#include
#include"Keypad.C"
//数码管7位段码:0--f
unsignedcharscandata[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//记录显示位数的全局变量
unsignedcharcnt=0;
//显示缓存
unsignedcharDispbuf[2];
//引用外部变量的声明
externunsignedcharkey_Pressed;
externunsignedcharkey_val;
externunsignedcharkey_Flag;
/********************主函数********************/
voidmain(void)
{
/*下面六行程序关闭所有的IO口*/
P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
P5DIR=0XFF;P5OUT=0XFF;
P6DIR=0XFF;P6OUT=0XFF;
P6DIR|=BIT2;P6OUT|=BIT2;//关闭电平转换
WDTCTL=WDT_ADLY_1_9;//设置内部看门狗工作在定时器模式,1.9ms中断一次
IE1|=WDTIE;//使能看门狗中断
_EINT();//打开全局中断
Init_Keypad();
while(1)
{
Key_Event();
if(key_Flag==1)
{
key_Flag=0;
Dispbuf[1]=key_val/10;
Dispbuf[0]=key_val%10;
}
}
}
/*******************************************
函数名称:watchdog_timer
功能:看门狗中断服务函数,在这里输出数码管的
段选和位选信号
参数:无
返回值:无
********************************************/
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
P4OUT=0xff;
P5OUT=scandata[Dispbuf[cnt]];//输出段选信号
P4OUT&=~(1<<(cnt+2));//输出位选信号
cnt++;//位计数变量在0~1之间循环
if(cnt==2)cnt=0;
}
主程序较为简单,具体的原理参见上一个笔记,在主程序中与键盘扫描相关的函数被击中在Keypad.C中,需要说明的是在主函数中需要对Keypad.C的部分变量做声明,这样才能使用Keypad.C中的变量。Keypad.C代码如下:
/********************************************************
4*4键盘扫描函数
作者:孙浩
修改时间:2010.8.2
程序说明:
此程序以开发板的例程做部分修改,更方便程序调用。
在调用之前需要注意需要在主函数中对程序中使用的变量做外部变量声明
需要在主函数中声明的变量如下:
//引用外部变量的声明
externunsignedcharkey_Pressed;//按键是否被按下:1--是,0--否
externunsignedcharkey_val;//存放键值
externunsignedcharkey_Flag;//按键是否已放开:1--是,0--否
另外对应的键值可以在本文件的全局变量中修改,只需要对应修改
数组ucharkey_Map[]的对应的值即可。
调用示例如下:
Init_Keypad();//先进行初始化
while(1)
{
Key_Event();//在死循环中进行键值扫描
if(key_Flag==1)//用来判断有无按键按下,从而读取键值进行操作
{
key_Flag=0;//key_Flag需要手动清零
}
}
**********************************************************/
#include
//相应的函数声明
voidInit_Keypad(void);//键盘初始化
voidCheck_Key(void);
voiddelay();
voidKey_Event(void);//读取键盘函数,在使用时通过此函数进行键盘扫描
//选择对应的端口
#defineKEYOUTP1OUT
#defineKEYINP1IN
#defineKEYDIRP1DIR
typedefunsignedcharuchar;
typedefunsignedintuint;
/***************全局变量***************/
ucharkey_Pressed;//按键是否被按下:1--是,0--否
ucharkey_val;//存放键值
ucharkey_Flag;//按键是否已放开:1--是,0--否
//设置键盘逻辑键值与程序计算键值的映射
ucharkey_Map[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
/*******************************************
函数名称:Init_Keypad
功能:初始化扫描键盘的IO端口
参数:无
返回值:无
********************************************/
voidInit_Keypad(void)
{
KEYDIR=0xf0;//KEY.0~KEY.3设置为输入状态,KEY.4~KEY.7设置为输出状态
KEYOUT|=0xf0;//KEY.4~KEY.7输出高电平
key_Flag=0;
key_Pressed=0;
key_val=0;
}
/*********************************************
*Check_Key(),检查按键,确认键值
*********************************************/
/*******************************************
函数名称:Check_Key
功能:扫描键盘的IO端口,获得键值
参数:无
返回值:无
**********************************