实验内容:
利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输入电平。
1.选中 8 位数码管的其中 1 位数码管,当独立按键 1 每按下一次,数码管加一(按下期间加 1),范围为 0—F;
2.选中 8 位数码管的另 1 位数码管,当独立按键 2 每按下一次,数码管减一(松手之后减 1),范围为 F—0;
3.按下独立按键 3 期间,流水灯以 600ms 的速度流动;
4.按下独立按键 4,松手之后,8 个 LED 灯作一次花样循环。
按键一效果图:
按键二效果图
按键三效果图:
按键四效果图:
代码如下:
#include#include int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管编码 int mun=0; //全局变量 ,代表当前数码管显示的段码 void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } } //按键检测是否按下,若按下着返回键码 int key() { if(mun>14||mun<0)//判断数码是否超出显示范围 mun=0; while(1) { if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);return 4;} if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);return 3;} if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);return 2;} if(P3_1==0){Delay(500);mun++; return 1;} } } void xianshi(int p) { P2_2=1;P2_3=1;P2_4=1; //位选选中第第一位 P0=table[p]; //段选,输出段码 } void leddemo1(){//流水灯模式1 int i; P0=0x00; for(i=0;i<8;i++){ P2=_crol_(0xfe,i); Delay(600); } P2=0xff; } void leddemo2(){ //流水灯模式2 P0=0x00; P2=0x7e; Delay(600); P2=0xbd; Delay(600); P2=0xdb; Delay(600); P2=0xe7; Delay(600); P2=0xc3; Delay(600); P2=0xb1; Delay(600); P2=0x00; Delay(600); P2=0x18; Delay(600); P2=0x3c; Delay(600); P2=0x7e; Delay(600); P2=0x00; Delay(600); P2=0xff; Delay(600); P2=0x00; Delay(600); P2=0xff; Delay(600); P2=0x00; Delay(600); P2=0xff; Delay(600); P2=0x00; Delay(600); P2=0x81; Delay(600); P2=0xc3; Delay(600); P2=0xe7; Delay(600); P2=0xff; Delay(600); } void main() { P0=0x00; while(1) { switch(key()) { case 1: xianshi(mun); break; case 2: xianshi(--mun); break; case 3: leddemo1(); break; case 4: leddemo2(); break; } } }



