通过外中断,两个按键可实现流水灯加速减速控制,从左到右,从右到左,从中间到两端,从两端到中间等。大家可以参考下
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar j,k;
- void delay(int ms)
- { uchar i;
- while(ms--)
- for(i=0;i<123;i++);
- }
- uchar codetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
- 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
- 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
- 0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,
- 0xff,0xe7,0xc3,0x81,0x00,0x7e,0x3c,0x18,
- 0x00,};
- void EXINTinit()
- {
- EA=1;EX0=1;EX1=1;IT0=1;IT1=1;
- }
- void main()
- {
- EXINTinit(); P0=0xfe;
- while(1)
- {
- switch(k)
- {
- case 0:
- {
- for(j=0;j<16;j++)
- {
- if(k!=0) break;
- P0=tab[j];
- delay(300);
- }
- for(j=0;j<16;j++)
- {
- if(k!=0)
- break;
- P0=tab[j+16];
- delay(300);
- }
- for(j=0;j<9;j++)
- {
- if(k!=0)
- break;
- P0=tab[j+32];
- delay(300);
- }
- for(j=0;j<16;j++)
- {
- if(k!=0)
- break;
- P0=0x00;
- delay(300);
- }
- for(j=8;j>0;j--)
- {
- if(k!=0)
- break;
- P0=0x55;
- delay(300);
- P0=0xaa;
- delay(300);
- }
- }break;
-
- case 1:
- {
- for(j=0;j<16;j++)
- {
- if(k!=1)
- break;
- P0=tab[j];
- delay(100);
- }
- for(j=0;j<16;j++)
- {
- if(k!=1)
- break;
- P0=tab[j+16];
- delay(100);
- }
- for(j=0;j<9;j++)
- {
- if(k!=1)
- break;
- P0=tab[j+32];
- delay(100);
- }
- for(j=0;j<16;j++)
- {
- if(k!=1)
- break;
- P0=0x00;
- delay(100);
- }
- for(j=8;j>0;j--)
- {
- if(k!=1)
- break;
- P0=0x55;
- delay(300);
- P0=0xaa;
- delay(100);
- }
- };break;
- case 2:
- {
- for(j=0;j<16;j++)
- {
- if(k!=2)
- break;
- P0=tab[j];
- delay(600);
- }
- for(j=0;j<16;j++)
- {
- if(k!=2)
- break;
- P0=tab[j+16];
- delay(600);
- }
- for(j=0;j<9;j++)
- {
- if(k!=2)
- break;
- P0=tab[j+32];
- delay(600);
- }
- for(j=0;j<16;j++)
- {
- if(k!=2)
- break;
- P0=0x00;
- delay(600);
- }
- for(j=8;j>0;j--)
- {
- if(k!=2)
- break;
- P0=0x55;
- delay(600);
- P0=0xaa;
- delay(600);
- }
- };break;
- default: break;
- }
- }
- }
- voidEX0INT() interrupt 0
- {
- k=1;
- }
- voidEX1INT() interrupt 2
- { k=2;
- }
复制代码
|