实现at89c52通过3*3的扫描按键,选择内置已设定的定时程序并进行更改目标计时时间的程序
时间: 2024-02-11 19:07:04 浏览: 34
以下是基于AT89C52单片机,通过3*3扫描按键实现选择内置已设定的定时程序并进行更改目标计时时间的程序的示例代码:
```c
#include <reg52.h>
//定义数码管显示1~9的编码
unsigned char code disp[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//定义按键输入的扫描码
unsigned char code key_code[3][3] = {{0x1,0x2,0x3},{0x4,0x5,0x6},{0x7,0x8,0x9}};
//定义定时器计数值,默认10秒
unsigned int target_time = 10000;
//延时函数,延时1ms
void delay_ms(unsigned int i)
{
unsigned int j,k;
for(j=0;j<i;j++)
for(k=0;k<114;k++);
}
//计时器初始化函数
void timer_init(void)
{
TMOD = 0x01; //定时器T0工作在模式1,16位计数器
TH0 = 0xff; //计时器T0初值设为65535-1000=64535,计数1ms
TL0 = 0x9c;
TR0 = 1; //启动计时器T0
}
//数码管显示函数
void display(unsigned char num)
{
unsigned char i;
for(i=0;i<8;i++)
{
P2 = ~(1<<i); //选择第i个数码管
P0 = disp[num%10]; //显示个位数字
delay_ms(1); //延时1ms
P0 = 0x00; //关闭数码管
num /= 10; //获取十位数字
}
}
//按键扫描函数
unsigned char key_scan(void)
{
unsigned char i,j,key_value;
key_value = 0xff; //初始化按键值为0xff
for(i=0;i<3;i++)
{
P1 = ~(1<<i); //选择第i行
for(j=0;j<3;j++)
{
if(!(P1 & (1<<(j+3)))) //检测到按键按下
{
key_value = key_code[i][j]; //获取按键的扫描码
while(!(P1 & (1<<(j+3)))); //等待按键松开
}
}
}
return key_value; //返回按键值
}
//主函数
void main()
{
unsigned char key_flag = 0; //按键标志位,0表示未按下任何按键,1表示已按下
unsigned char key_value; //按键值
unsigned int timer_count = 0; //计时器计数值
unsigned char timer_flag = 0; //计时器标志位,0表示未开始计时,1表示正在计时
unsigned char timer_select = 0; //定时程序选择,1表示10秒,2表示30秒,3表示60秒
P0 = 0x00; //数码管初始化
P2 = 0xff;
P1 = 0xff; //按键扫描初始化
timer_init(); //计时器初始化
while(1)
{
key_value = key_scan(); //检测按键值
if(key_value != 0xff) //检测到按键按下
{
key_flag = 1; //标志位设为1
switch(key_value)
{
case 0x1: //选择10秒定时程序
timer_select = 1;
break;
case 0x2: //选择30秒定时程序
timer_select = 2;
break;
case 0x3: //选择60秒定时程序
timer_select = 3;
break;
case 0x4: //增加计时时间
if(target_time < 60000)
target_time += 1000;
break;
case 0x5: //减少计时时间
if(target_time > 1000)
target_time -= 1000;
break;
case 0x6: //开始计时
timer_count = 0;
timer_flag = 1;
break;
case 0x7: //停止计时
timer_count = 0;
timer_flag = 0;
break;
case 0x8: //复位计时器
timer_count = 0;
timer_flag = 0;
break;
case 0x9: //清除按键标志位
key_flag = 0;
break;
}
}
if(key_flag == 0) //未按下任何按键
{
if(timer_flag == 1) //正在计时
{
display((target_time-timer_count)/1000); //显示剩余时间
if(timer_count == target_time) //计时器计数值达到目标时间
{
timer_count = 0; //计数值清零
timer_flag = 0; //计时结束
}
else //计时器计数值加1
{
timer_count++;
}
}
else //未计时
{
switch(timer_select) //根据定时程序选择显示目标时间
{
case 1:
display(10);
break;
case 2:
display(30);
break;
case 3:
display(60);
break;
}
}
}
}
}
```
该程序的主要功能为:通过3*3的按键矩阵选择内置已设定的定时程序并进行更改目标计时时间,并在数码管上显示剩余时间。其中,按键0~3分别对应10秒、30秒、60秒和增加计时时间,按键4~5分别对应减少计时时间和开始计时,按键6~8分别对应停止计时、复位计时器和清除按键标志位。程序运行时,按键扫描函数检测按键值并根据按键值进行相应的操作,计时器计数值和标志位根据按键操作进行更改,数码管显示函数根据计时器标志位和计时器计数值进行数码管显示。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)