壇友的不占用中斷 不使用延時 沒有死循環。!不占用任何資源。親測可用
1.png (100.42 KB, 下載次數: 27)
下載附件
2024-5-3 20:36 上傳
單片機源程序如下:
- #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(); //每次按下按鍵只會執行一次,按鍵不放開絕對不會重復執行。
- {
- }
- }
- }
復制代碼
|