按照之前的文章关于数码管说到的线与,在此之上我们将一个按键拓展为多个按键,对数码管进行控制,就需要按键扫描函数,数码管显示函数,再加上个主函数和延迟函数就可以搞定。
元器件为:7SEG-MPX6-CC、80C51、BUTTON
将原理图画好后,根据元件的连接和元件特性去写代码。
当我们按键按下时,需要判断按键是否按下,如果按下了,我们需要给一个键标志,判断它已经按下了。
按键扫描使用的方法为反转法,除此方法外,还有扫描法。
或者你也可以先固定列,再判断行是否按下,一行行去判断,如果不在此列,则继续下一列,同样判断每一行去确定按键是哪一个被按下了。【这个方法有空我会尝试写出来】
//********按键扫描函数
void Key_scan(){
if(P1!=0xf0)
{
Delay(10); //延迟10ms
if(P1!=0xf0)
{
key_value = P1;
P1 = 0x0f;
key_value += P1;
key_flag = 1;
Display(); //数码管显示函数
P1 = 0xf0;
}
}
else
{
key_flag = 0;
}
}
因为key_value是一个全局变量,所以并不需要传参给Display函数,直接拿去判断就可以了。
//********数码管显示函数
void Display(){
if(key_value==key_pad[0])
P2 = Table_cc[0];
else if(key_value==key_pad[1])
P2 = Table_cc[1];
else if(key_value==key_pad[2])
P2 = Table_cc[2];
else if(key_value==key_pad[3])
P2 = Table_cc[3];
else if(key_value==key_pad[4])
P2 = Table_cc[4];
else if(key_value==key_pad[5])
P2 = Table_cc[5];
else if(key_value==key_pad[6])
P2 = Table_cc[6];
else if(key_value==key_pad[7])
P2 = Table_cc[7];
else if(key_value==key_pad[8])
P2 = Table_cc[8];
else if(key_value==key_pad[9])
P2 = Table_cc[9];
else if(key_value==key_pad[10])
P2 = Table_cc[10];
else if(key_value==key_pad[11])
P2 = Table_cc[11];
else if(key_value==key_pad[12])
P2 = Table_cc[12];
else if(key_value==key_pad[13])
P2 = Table_cc[13];
else if(key_value==key_pad[14])
P2 = Table_cc[14];
else if(key_value==key_pad[15])
P2 = Table_cc[15];
}
假设运行一行代码,是10us
那么循环100次就是1ms。
在延迟函数中,我加入了一个参数,为了就是能得到任何我想要延迟的时间。
例如:当k被赋为1时,我们for循环总共循环了100次,延时时间time = 100 * 10 =1000us = 1ms。
PS:如果需要实际的执行时间,还需要去debug一下,去算出一行代码执行时间是多少。
//********延迟函数
void Delay(u16 k){
u16 i,j;
for(i = 0; i < k ; i++)
for(j = 0; j< 100 ;j++);
}
因为我们将实现的功能分成了各个函数去写,所以我们的主函数很简单,初始化加上我们需要调用的函数,就可以实现我们想要的功能了。
void main(){
//初始化引脚
P1 = 0xf0;
P2 = 0x00;
P3 = 0x00;
Key_scan();
}
全部0条评论
快来发表一下你的评论吧 !