坛友的不占用中断 不使用延时 没有死循环!!!不占用任何资源。亲测可用
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED1= P3^4;
- sbit LED2 = P3^5;
- sbit LED3= P3^6;
- sbit LED4 = P3^7;
- sbit key1 =P1^4;
- sbit key2 =P1^5;
- /*不占用中断 不使用延时 没有死循环!!!不占用任何资源
- 这个按键检测程序我在20年前网上看到过。当时没有试用。今又看到这个单片机代码。于是决定测试一下*/
- unsigned char num,trg1=0, trg2=0,cont1=0,cont2=0;//一定是全局变量
- //unsigned char
- unsigned key1scan()
- {
- unsigned char a=!key1;//网上是异或运算a=key1^0x01,对于一位按键可以直接写成取反
- trg1= a&(a^cont1);
- cont1=a;
- if(trg1&!key1) //网上是(trg1&key1)实际测试不能使用!!因为任何时候都不可能为真。只有改成(trg1&!key1)才可以完美执行!!!
- //return 1;//返回等于1 表示按键按下。
- {
- //此处可以是自己需要执行的程序。(去掉前面的返回)
- LED1=~LED1;//按一次亮按一次灭
- }
- }
- unsigned key2scan()
- {
- unsigned char a=!key2;//网上是异或运算a=key2^0x01,对于一位按键可以直接写成取反
- trg2= a&(a^cont2);
- cont2=a;
- if(trg2&!key2)
- //return 1;//返回等于1 表示按键按下。
- {
- //此处可以是自己需要执行的程序。(去掉前面的返回)
- LED2=~LED2; //按一次亮按一次灭
- }
- }
- void main()
- {
- P3=0XFF;
- P1=0XFF;
- while(1)
- {
- key1scan(); //每次按下按键只会执行一次,按键不放开绝对不会重复执行。
- {
- //自己的程序。
- }
- key2scan(); //每次按下按键只会执行一次,按键不放开绝对不会重复执行。
- {
- }
- }
- }
复制代码
|