📄 keilc.txt
字号:
定时按键扫描程序
#include <reg51.h>
#define key_1 0x0e;
#define key_2 0x0d;
#define key_3 0x0b;
#define key_4 0x07;
bit key_enable = 0;
unsigned int current_led = 0;
void delay(int length);
unsigned int key_sequence[4] = {0x0e,0x0d,0x0b,0x07};
unsigned int code dis_list[] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表
// 0 1 2 3 4 对应内容
0x92,0x82,0xf8,0x80,0x90,0xbf };
// 5 6 7 8 9 -
static unsigned int *Pointer[] = {&dis_list[0],&dis_list[0],&dis_list[0],&dis_list[0]};//Pointe to showing NUM
static unsigned int show_Num = 0;
unsigned int key_scan()//按键扫描函数
{
unsigned int key_value;//返回当前按键值
unsigned int key_scan_first;
key_scan_first = P1 & 0x0f;//读取当前按键值
delay(50);//去抖延时num×100ms
if(key_scan_first == (P1 & 0x0f))//确认后返回当前键值
{
switch(key_scan_first)
{
case 0x0e: key_value = 1;//按键1
break;
case 0x0d: key_value = 2;//按键2
break;
case 0x0b: key_value = 3;//Button 3 was pressed;
break;
case 0x07: key_value = 4;//Button 4 was pressed
break;
default:key_value = 0;//return no button was pressed
}
}
else
{
key_value = 0;//return no button was pressed
}
return key_value;
}
void delay(int length)//Delay time lengtn*100ms(os = 11.0592MHz)
{
int i,j;
for(i=0;i<length;i++)
{
for(j=0;j<120;j++)
{
;
}
}
}
void key_4_act()
{
key_enable = !key_enable;//Other Key enable while 'key_enable = 1'
current_led = 0;//clear current value,start at No.1
}
void key_1_act()//Key was pressed,curser get to next led
{
if(key_enable == 1)
{
current_led ++;
if(current_led == 4)//go back
{
current_led = 0;
}
}
}
void key_2_act()//当前指针加1
{
if(key_enable == 1)
{
Pointer[current_led]++ ;//指向下一个段码地址
if(Pointer[current_led] == &dis_list[10])//增加到段码表最后一位后,返回段码首位地址
{
Pointer[current_led] = &dis_list[0];
}
}
}
//地址加减注意 指针越界,在边界值上进行加减操作,如果在指针指向Pointer[0]自减后,将回不到指定地址位置
void key_3_act()
{
if(key_enable == 1)
{
if(Pointer[current_led] == &dis_list[0])//减小到段码首地址后 ,指向段码尾地址
{
Pointer[current_led] = &dis_list[10];
}
Pointer[current_led]--;//指向上一位段码地址
}
}
void key_action(unsigned int get_key)//Process the value of button pressed
{
switch(get_key)
{
case 1: //if(get_key == 0x00)
//{
key_1_act();
//}
break;
case 2:// if(get_key == 0x00)
// {
key_2_act();
// }
break;
case 3: //if(get_key == 0x00)
////{
key_3_act();
//}
break;
case 4: //if(get_key == 0x00)
//{
key_4_act();
//}
break;
default: break;
}
}
void timer_init(void)
{
TMOD = 0x11; // 定时/计数器0,1工作于方式1
TH0 = 0xd8; // 预置定时常数55536(d8f0),产生10ms时基信号
TL0 = 0xf0;
TH1 = 0xfc; // 预置定时常数64536(fc18),产生1ms间隔用于动态显示
TL1 = 0x18;
ET0 = 0; // 定时/计数器0允许中断
ET1 = 1; // 定时/计数器1允许中断
TR0 = 0; // 开闭定时/计数器0
TR1 = 1; // 启动定时/计数器1
EA = 1; // 开总中断
}
void statu_show(unsigned int order)///showning the different nunber in different time
{
switch (order)
{
case 0: P2 = 0x10;//F1&&2;//选中第一个数码管,同时关闭其他数码管显示
P0 = *(Pointer[0]);//显示具体内容
break;
case 1: P2 = 0x20;//F2&&2;//No.second
P0 = *(Pointer[1]);
break;
case 2: P2 = 0x40;//F4&&2;//No.third
P0 = *Pointer[2];
break;
case 3: P2 = 0x80;//F8&&P2;//No.fouth
P0 = *Pointer[3];
break;
default :
break;
}
}
void timer_ISR(void) interrupt 3//利用定时中断处理分时显示
{
TR1 = 0;//close the timer 1;
TH1 = 0xfc; // 预置定时常数64536(fc18),产生1ms间隔用于动态显示
TL1 = 0x18;
statu_show(show_Num);
show_Num++;
if(show_Num == 4)//四位数码管轮流显示
{
show_Num = 0;
}
TR1 = 1;//reopen the timer 1
}
void main()
{
timer_init();//timer 1 init
while(1)
{
key_action(key_scan());//Process funcation
//delay(50);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -