按下k1時led燈由上至下流水點亮
按下k2時led燈由下至上流水點亮
按下k3時led燈高低4個led交替點亮
按下K4時led燈閃爍點亮
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.PNG (90.33 KB, 下載次數: 61)
下載附件
電路圖
2018-12-2 22:49 上傳
單片機源碼:
- #include<reg51.h>
- #include<absacc.h>
- #define uchar unsigned char
- bit keyflag; // keyflag為按鍵按下的標志位
- uchar keyval; // keyval為鍵值
- uchar forwardtab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar backwardtab[ ]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- uchar altertab[]={0x0f,0xf0};
- uchar blinktab[]={0x00,0xff};
- void delay10ms(void) //函數:軟件消抖延時10ms
- { unsigned char i,j;
- for(i=0;i<100;i++)
- for(j=0;j<100;j++)
- ;
- }
- void led_delay(void) //函數:延時
- { unsigned char i,j;
- for(i=0;i<220;i++)
- for(j=0;j<220;j++)
- ;
- }
-
- void forward(void) //函數功能:正向流水點亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<8;i++)
- {
- P0=forwardtab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
- void backward(void) //函數功能:反向流水點亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<8;i++)
- {
- P0=backwardtab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
-
- void alter(void) //函數功能:反向流水點亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<2;i++)
- {
- P0=altertab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
- void blink(void) //函數功能:反向流水點亮LED
- {
- unsigned char i,j;
- for(j=0;j<10;j++)
- { for (i=0;i<2;i++)
- {
- P0=blinktab[i]; //LED0亮
- led_delay();
- }
- }
- P0=0xff;
- }
- void main(void)
- {
- IE=0x81; //總中斷允許EA=1,允許中斷
- IT0=1; //跳邊沿觸發INT0
- keyflag=0; //設置按鍵按下標志為0
- do {
- P0=0x00; //全亮
- if(keyflag) //如果按鍵按下標志keyflag =1,則有鍵按下
- {
-
- keyval=~keyval; //鍵值取反
- switch(keyval) //根據按下鍵的鍵值進行分支跳轉
- {
- case 1: forward(); //處理0號鍵
- break;
- case 2: backward(); //處理0號鍵
- break;
- case 4: alter(); //處理0號鍵
- break;
- case 8: blink(); //處理0號鍵
- break; }
- keyflag=0; //清按鍵按下標志
- }
- } while(1);
- }
-
-
- void int0( ) interrupt 0 //有鍵按下,則執行的中斷函數
- {
- uchar reread_key; // reread_key為重讀鍵值變量;
- IE=0x80; // 屏蔽中斷
- keyflag=0; // 把按鍵按下標志keyflag清0
- P1=0xff; // 向P1口寫1,設置P1口為輸入
- keyval=P1; // 從P1口讀入鍵盤的狀態
- delay10ms(); // 延時10ms
- reread_key=P1; // 再次從P1口讀鍵盤狀態,并存reread_key中
- if(keyval==reread_key) // 比較兩次讀取的鍵值,如相同,說明鍵按下
- { keyflag=1; // 按鍵按下標志key_flag為1 }
- IE=0x81; // 重新允許中斷
- }
- }
復制代碼
0.png (48.17 KB, 下載次數: 62)
下載附件
2018-12-3 00:16 上傳
全部資料51hei下載地址:
project512.zip
(58.87 KB, 下載次數: 55)
2018-12-2 22:51 上傳
點擊文件名下載附件
電路圖及代碼 下載積分: 黑幣 -5
|