实验内容:
利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输入电平。
1.选中 8 位数码管的其中 1 位数码管,当独立按键 1 每按下一次,数码管加一(按下期间加 1),范围为 0—F;
2.选中 8 位数码管的另 1 位数码管,当独立按键 2 每按下一次,数码管减一(松手之后减 1),范围为 F—0;
3.按下独立按键 3 期间,流水灯以 600ms 的速度流动;
4.按下独立按键 4,松手之后,8 个 LED 灯作一次花样循环。
按键一效果图:
按键二效果图
按键三效果图:
按键四效果图:
文章来源:https://www.toymoban.com/news/detail-737076.html
代码如下:文章来源地址https://www.toymoban.com/news/detail-737076.html
#include <REGX51.H>
#include <intrins.h>
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();
}
到了这里,关于【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!