- #include "reg51.h"
- #include "intrins.h"
- #define U8 unsigned char
- #define U16 unsigned int
- sbit sKEY0 = P1 ^ 0;
- sbit sKEY1 = P1 ^ 1;
- sbit sKEY2 = P1 ^ 2;
- bit key0, key1, key2;
- U8 k0ms, k1ms, k2ms; //3個按鍵按下的時間(毫秒) 按下計數 松開清0
- U16 delay = 500; //流水燈延時(毫秒)
- bit lr = 0; //流水燈方向
- void InitTimer0(){
- TMOD = 0x01;
- TH0 = 0x0FC;
- TL0 = 0x18;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void main(){
- InitTimer0();
- while (1) {
- if (sKEY0 == 0) {
- lr = !lr;
- while (sKEY0 == 0);
- }
- if (sKEY1 == 0) {
- if (delay < 4000) delay += 500;
- while (sKEY1 == 0);
- }
- if (sKEY2 == 0) {
- if (delay > 500) delay -= 500;
- while (sKEY2 == 0);
- }
- }
- }
- void Timer0Interrupt() interrupt 1 { //12Mhz 1mS 定時器中斷
- static U8 a = 1;
- static U16 ms = 0;
- TH0 = 0x0FC;
- TL0 = 0x18;
- if (sKEY0) {k0ms = 0;}else{if (k0ms != 0xFF) {k0ms++;}}
- if (sKEY1) {k1ms = 0;}else{if (k1ms != 0xFF) {k1ms++;}}
- if (sKEY2) {k2ms = 0;}else{if (k2ms != 0xFF) {k2ms++;}}
- key0 = !(k0ms >= 25); //按鍵消抖25毫秒
- key1 = !(k1ms >= 25);
- key2 = !(k2ms >= 25);
- if (++ms >= delay) {
- ms = 0;
- P0 = ~a;
- a = lr ? _cror_(a, 1) : _crol_(a, 1);
- }
- }
復制代碼 |