程序实现定时器中断方式扫描键盘的实例代码
时间: 2023-05-28 07:02:42 浏览: 138
下面是一个使用定时器中断方式扫描键盘的 C 语言示例代码:
```
#include <reg51.h> // 引入 8051 单片机的头文件
#define KEY_PORT P1 // 定义键盘端口为 P1
#define TIMER_VALUE 65536 - 50000 // 定义定时器初值
unsigned char scan_key(); // 声明扫描键盘的函数
void timer0() interrupt 1 // 定义定时器中断服务函数
{
TH0 = TIMER_VALUE / 256; // 设置定时器初值
TL0 = TIMER_VALUE % 256;
scan_key(); // 每次中断扫描一次键盘
}
void main()
{
TMOD = 0x01; // 设置定时器 0 为模式 1
TH0 = TIMER_VALUE / 256; // 初始化定时器初值
TL0 = TIMER_VALUE % 256;
IE = 0x82; // 打开定时器 0 中断和总中断
TR0 = 1; // 启动定时器 0
while(1); // 无限循环
}
unsigned char scan_key() // 扫描键盘的函数
{
unsigned char key = 0xFF; // 定义键值为 0xFF(表示无键按下)
unsigned char i, j; // 定义计数器变量
for (i = 0; i < 4; i++) // 遍历行
{
KEY_PORT = ~(1 << i); // 先将当前行的输出置为低电平
for (j = 0; j < 3; j++) // 遍历列
{
if (!(KEY_PORT & (1 << (j + 4)))) // 判断当前列是否被按下
{
switch (i * 3 + j) // 根据行列对应的键值进行转换
{
case 0: key = '1'; break;
case 1: key = '2'; break;
case 2: key = '3'; break;
case 3: key = '4'; break;
case 4: key = '5'; break;
case 5: key = '6'; break;
case 6: key = '7'; break;
case 7: key = '8'; break;
case 8: key = '9'; break;
case 9: key = '*'; break;
case 10: key = '0'; break;
case 11: key = '#'; break;
}
while (!(KEY_PORT & (1 << (j + 4)))); // 等待键释放
}
}
}
return key; // 返回键值
}
```
以上示例代码使用定时器 0 中断每隔一段时间(本例中为 50 毫秒)扫描一次键盘,如果有键按下,则将其对应的键值返回。在主函数中,我们只需要启动定时器、打开中断即可,无需不断轮询扫描键盘,从而实现了高效率的键盘输入。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)