如果要節省單片機IO口,可以用一個按鍵,通過判斷按下的時間來執行不同的子程序,自己閑來無事隨意寫了個,可能不夠精簡,但是功能都有,proteus仿真能出來,三種按鍵時間,短時間按下LED1亮,中等長度時間LED2亮,長時間按下LED3亮,具體按多久,自己稍微體會下就能把握
單片機長短按鍵仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- sbit keyback=P1^0;
- sbit k=P1^4;
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit key3=P1^3;
- static uint i=0;
- uchar keystay=0x00;
- uchar T0RH;
- uchar T0RL;
- void configtimer0(uchar ms)
- {
- ulong tmp;
- tmp=11059200/12;
- tmp=(ms*tmp)/1000;
- tmp=65536-tmp+10;
- T0RH=(unsigned char)(tmp>>8);
- T0RL=(unsigned char)tmp;
- TMOD &=0xF0;
- TMOD |=0x01;
- TH0=T0RH;
- TL0=T0RL;
- ET0=1;
- TR0=1;
- }
- void Judge(uint num)
- {
- if((5<num)&&(num<=50))
- {
- key1=0;
- key2=1;
- key3=1;
- i=0;
- }
- if((50<num)&&(num<=120))
- {
- key2=0;
- key1=1;
- key3=1;
- i=0;
- }
- if(num>120)
- {
- key3=0;
- key1=1;
- key2=1;
- i=0;
- }
- }
- main()
- {
- EA=1;
- configtimer0(10);
- while(1)
- {
- if((keystay&0xFF)==0x00)
- {
- Judge(i);
- }
- }
- }
-
- void keyscan()
- {
- keystay=(keystay<<1) | (!keyback);
- }
-
- void interrupt_timer0()interrupt 1
- {
- TH0=T0RH;
- TL0=T0RL;
- keyscan();
- if((keystay&0xFF)==0xFF)
- {
- i++;
-
- if(i>400)
- {
- i=0;
- }
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
長短按鍵.rar
(68.63 KB, 下載次數: 221)
2017-11-8 14:44 上傳
點擊文件名下載附件
keil加proteus
|