第8讲自己动手学习单片机系列键盘

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ int value ;//有键,存储键值 int state;//存储当前键状态,按下为1弹起为0
}; struct sMsg_Key msg_key;
int key_scan()
{
key_DDR = 0x00;
key_PORT |= 0xFF;// PA0输入内部上拉,PA0脚高电平,一旦按键按下,PA变 为低电平
}
}
return(value_key);
}
键盘电路的焊接
本章现在1只独立按键实现所有程序,然后由浅如深的拓展 到键盘矩阵。所用到的键盘焊接如图,左面是焊接正面图, 右面是焊接反面图。
按键消抖
为什么要消抖:通常键盘所用为机械弹性开关,在按下和弹起的瞬间伴 随一系列抖动。为确保CPU对一次闭合仅做一次处理,必须对键盘的抖 动进行消抖处理。一般来说,前沿和后沿抖动时间大约在5-10ms。
电平(0x0F);PX4-PX7输出低电平。读PX0- PX3口引 脚电平,一旦有键闭合,引脚电平不再是0x0F。
(2)行扫描法确定哪一个键闭合:
扫描第1行:PX7-PX4送出0b1110,拉低第一行电平, 其它三行电平为高,读PX3-PX0。若第1行若无键闭合,读 出的数据为0b1111。有键闭合,例如第1列闭合,读出的数 据为0b1110;同样第2列有键闭合,读出的数据为0b1101; 若读出的数据为0b1011;表示第三列有键闭合;0b0111表 示第4列有键闭合
key_PORT = value_row & 0xF0;//第i行电平拉低
_NOP();
value_col = key_PIN & 0x0F;
if((value_col) != 0x0F)//第一行各列有键按下
{
`
switch(value_col)
{
case 0b00001110:
//第一列按键
case 0b00001101:
若要扫描第2行,PX7-PX4送出0b1101,拉低第2行电 平;同样,送出0b1011和0b0111可扫描第3行和第4行。
(3)value_row高4位存储行扫描码,value_col低4位存储读 取码,做运算
value_key = ~((value_row & 0xF0) + (value_col & 0x0F));
_delay_ms(10);//延时10ms去掉抖动后沿 tmp = msg_key.value;
PA0接一只小按键到地;PB0接LED发光二极管。按下按键 松手后LED两0.2s,其它时间熄灭。来检验以上键盘处理程 序是否能用。
#define F_CPU 8000000UL #include<avr/io.h> #include<util/delay.h> //定义键盘使用的端口PA0 #define key_DDR DDRA #define key_PORT PORTA #define key_PIN PINA #define _NOP() __asm__ __volatile__("nop"::) struct sMsg_Key
_NOP();
if(key_PIN & 0x01) == 0)
//有键按下
return(1);
//返回PA0端口值
//缺省无键闭合 //高四位输出,低四位输入。 //高四位输出低电平,低四位上拉电阻能
_NOP();
value_col = key_PIN & 0x0F;
//读列
if(value_col != 0x0F)
//有按键闭合
{
value_row = 0xEF;
for(i=0;i<4;i++)
{
//扫描第i行
在只有单键闭合的情况下,
value_key的取值与键闭合
对应如图所示
扫描代码可以这样写:
unsigned char key_scan()
{
int i;
unsigned char value_key, value_row, value_col;
value_key = 0x00; key_DDR = 0xF0; key_PORT = 0x0F;
_delay_ms(10);//延时10ms去掉抖动前沿 if(key_value == key_scan())//若两次按键相等 {
msg_key.value = key_value;//返回键值 msg_key.state = 1; //标记键盘在按下状态 }
return(0);
} else if(msg_key.state == 1) //键没有释放,检测到释放;后沿消抖 {
int value ;//有键,存储键值 int state;//存储当前键状态,按
//下为1弹起为0 }; struct sMsg_Key msg_key;
int keyDelay_Dither(const int key_value) //key_value为key_scan() 返回值 {
int tmp; if(keyBiblioteka Baiduvalue) //key_value!=0,有键按下执行以下程序; 前沿消抖 {
第8讲自己动手学习单片机系列键 盘
当按键多,例如16个按键,此时采用上述连接方式会占用16 个I/O口资源。可采用矩阵方式。如图,这样只占用8个I/O口。
键盘扫描方法: 和单键扫描一致,有键闭合返回非零;无键闭合返回0。
(1)初步确定有无按键: PX0-PX3输入,上拉电阻使能,这样这4个脚是高
一般键盘消抖的思路:一旦检测到有键按下时,延时10ms,跳过前沿抖 动,再次检测,仍然检测到该键按下,则认为是有效按键;检测到该键 释放后,延时10ms,再检测,该键仍在释放状态;则认为完成了一次完 整的按键。
假定键盘扫描程序为key_scan(),有键按下返回 键值;无键按下返回0。定义一个键盘消息结构 struct sMsg_Key {
//第二列按键
case 0b00001011:
//第三列按键
case 0b00000111:
//第四列按键
value_key = ~((value_row & 0xF0) + value_col);
break;
default
value_key = 0;
break;
}
}
value_row <<= 1; //移位,扫描其余各行
相关文档
最新文档