|
|
本帖最后由 51黑電子會(huì)員 于 2020-3-8 16:43 編輯
- /***外部中斷0掃描鍵盤(pán),按下S1鍵時(shí),P2口的8位LED正向流水點(diǎn)亮;按下S2鍵時(shí),P2口的
- 8位LED反向流水點(diǎn)亮;按下S3鍵時(shí),P2口的8位LED熄滅;按下S4鍵時(shí),P2口的8位LED閃爍。***/
- #include<reg52.h>//包含51單片機(jī)寄存器定義的頭文件
- #define uchar unsigned char
- #define uint int
- sbit S1=P1^4;//將S1位定義為P1.4引腳
- sbit S2=P1^5;//將S2位定義為P1.5引腳
- sbit S3=P1^6;//將S3位定義為P1.6引腳
- sbit S4=P1^7;//將S4位定義為P1.7引腳
- uchar keyvalue;//儲(chǔ)存按鍵值
- uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- /*************************************************
- 函數(shù)功能:流水燈延時(shí)
- **************************************************/
- void led_delay(void)
- {
- uchar i,j;
- for(i=0;i<200;i++)
- for(j=0;j<200;j++);
- }
- /*************************************************
- 函數(shù)功能:軟件消抖延時(shí)
- **************************************************/
- void delay20ms(void)
- {
- uchar i,j;
- for(i=0;i<100;i++)
- for(j=0;j<100;j++);
- }
- /*************************************************
- 函數(shù)功能:正向流水點(diǎn)亮LED
- **************************************************/
- void forward(void)
- {
- // P2=0xfe; //第一個(gè)燈亮
- // led_delay();
- // P2=0xfd; //第二個(gè)燈亮
- // led_delay();
- // P2=0xfb; //第三個(gè)燈亮
- // led_delay();
- // P2=0xf7; //第四個(gè)燈亮
- // led_delay();
- // P2=0xef; //第五個(gè)燈亮
- // led_delay();
- // P2=0xdf; //第六個(gè)燈亮
- // led_delay();
- // P2=0xbf; //第七個(gè)燈亮
- // led_delay();
- // P2=0x7f; //第八個(gè)燈亮
- // led_delay();
- // P2=0xff;
- // P2=0xfe; //第一個(gè)燈亮
- // led_delay();
- uint i;
- for(i=0;i<8;i++)
- {
- P2=table[i];
- led_delay();
- }
- }
- /*************************************************
- 函數(shù)功能:反向流水點(diǎn)亮LED
- **************************************************/
- void backward(void)
- {
- // P2=0x7f; //第八個(gè)燈亮
- // led_delay();
- // P2=0xbf; //第七個(gè)燈亮
- // led_delay();
- // P2=0xdf; //第六個(gè)燈亮
- // led_delay();
- // P2=0xef; //第五個(gè)燈亮
- // led_delay();
- // P2=0xf7; //第四個(gè)燈亮
- // led_delay();
- // P2=0xfb; //第三個(gè)燈亮
- // led_delay();
- // P2=0xfd; //第二個(gè)燈亮
- // led_delay();
- // P2=0xfe; //第一個(gè)燈亮
- // led_delay();
- uint i;
- for(i=7;i>=0;i--)
- {
- P2=table[i];
- led_delay();
- }
- }
- /*************************************************
- 函數(shù)功能:關(guān)閉所有LED
- **************************************************/
- void stop(void)
- {
- P2=0xff;//關(guān)閉8個(gè)LED
- }
- /*************************************************
- 函數(shù)功能:閃爍點(diǎn)亮LED
- **************************************************/
- void flash(void)
- {
- P2=0xff;//關(guān)閉8個(gè)LED
- led_delay();
- P2=0x00;//點(diǎn)亮8個(gè)LED
- led_delay();
- }
- /*************************************************
- 函數(shù)功能:外部中斷0的中斷初始化程序
- **************************************************/
- void outside0_init()//外部中斷0初始化
- {
- EA=1; //開(kāi)總中斷
- EX0=1; //打開(kāi)外部中斷0
- IT0=1; //設(shè)置為下降沿觸發(fā)
- }
- /*************************************************
- 函數(shù)功能:外部中斷0的中斷服務(wù)子程序
- **************************************************/
- void outside0_serve(void) interrupt 0
- {
- P1=0Xf0;
- EX0=0;
- if((P1&0xf0)!=0xf0)//判斷是否有按鍵按下
- {
- delay20ms();//延時(shí)20ms再去檢測(cè)
- if((P1&0xf0)!=0xf0)//再判斷是否有按鍵按下
- {
- if(S1==0)//按鍵S1被按下
- keyvalue=1;
- if(S2==0)//按鍵S2被按下
- keyvalue=2;
- if(S3==0)//按鍵S3被按下
- keyvalue=3;
- if(S4==0)//按鍵S4被按下
- keyvalue=4;
- }
- }
- EX0=1;
- }
- /*************************************************
- 函數(shù)功能:主函數(shù)
- **************************************************/
- void main(void)//主函數(shù)
- {
- outside0_init();//外部中斷0初始化
- keyvalue=0;//按鍵值初始化為0
- while(1)
- {
- switch(keyvalue)
- {
- case 1:
- forward();
- break;
- case 2:
- backward();
- break;
- case 3:
- stop();
- break;
- case 4:
- flash();
- break;
- }
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|