中断键盘扫描

 先理解下中断的含义:对于51单片机,例如中断口 INT0口,低电平有效,是指如果该脚是低电平,则进入中断函数           

        void Int0_Routine(void) interrupt 0  执行,对于STC12LE5404AD,当P1=0XFF时,如果有按键按下,则 INT0口为低,则进入中断函数void Int0_Routine(void) interrupt 0 。代码如下:

 

//#include <reg52.h>
#include <intrins.h>
#include <STC12.h>
#define   uchar unsigned char   /*宏定义*/ 

sbit P1_7=P1^7;
sbit P1_6=P1^6;
sbit P1_5=P1^5;
sbit P1_4=P1^4;
sbit P1_3=P1^3;
sbit P1_2=P1^2;
sbit P1_1=P1^1;
sbit P1_0=P1^0; 


sbit FREE_HAND=P2^2;
sbit PSTN_CIN=P2^3;
sbit MAN_CIN=P2^7;

 uchar i = 0;
uchar ch;
uchar record = 0;
uchar temp;
uchar key_test ;
uchar GetKey

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用定时器中断方式扫描键盘的 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 毫秒)扫描一次键盘,如果有键按下,则将其对应的键值返回。在主函数中,我们只需要启动定时器、打开中断即可,无需不断轮询扫描键盘,从而实现了高效率的键盘输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值