实验内容: 利用所学的单片机知识及电路知识编程实现单片机 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 num=0; //全局变量 ,代表当前数码管显示的段码

void Delay(unsigned int xms){

unsigned char i, j;

while(xms--){

i = 2;

j = 239;

do{

while (--j);

} while (--i);

}

}

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=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 key()

{//独立按键扫描

if(P3_1==0){

Delay(20);

if(P3_1==0){

while(P3_1==0){//按下不松手 累加

num++;

if(num>15)//判断数码是否超出显示范围

num=0;

Delay(300);

xianshi(num);

}

}

}

if(P3_0==0){

Delay(20);

if(P3_0==0){

num--;

while(P3_0==0);

Delay(20);

if(num<0)//判断数码是否超出显示范围

num=15;

xianshi(num);

}

}

if(P3_2==0){

Delay(20);

if(P3_2==0){

while(P3_2==0);

leddemo1();

Delay(20);

}

}

if(P3_3==0){

Delay(20);

if(P3_3==0){

while(P3_3==0);

leddemo2();

Delay(20);

}

}

}

void main(){

P0=0x00;

while(1)

key();

}

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。