基于51单片机,五个按钮控制一个四位共阳数码管,一个按钮切换显示电压上下限,一个按钮增加电压上下限的值,一个按钮减小电压上下限的值,一个按钮向左切换数码管位数,一个按钮向右切换数码管的位数,的keil程序
时间: 2024-02-26 14:57:04 浏览: 66
以下是基于51单片机的keil程序,实现了五个按钮控制一个四位共阳数码管,其中一个按钮切换显示电压上下限,一个按钮增加电压上下限的值,一个按钮减小电压上下限的值,一个按钮向左切换数码管位数,一个按钮向右切换数码管的位数。
```C
#include<reg51.h>
//定义数码管的共阳端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//定义按钮的输入端口
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
//定义电压上下限的初始值
unsigned char vol_min=0x00;
unsigned char vol_max=0xff;
//定义数码管位数和当前显示的位数
unsigned char digit_num=4;
unsigned char digit_pos=0;
//定义数码管显示的值
unsigned char code digit[10]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
};
//延时函数,用于消除按键抖动
void delay(unsigned int i){
while(i--);
}
//按键检测函数,返回按下的按钮编号
unsigned char key_scan(){
unsigned char key_code=0;
if(!key1){
delay(1000); //延时消除按键抖动
if(!key1){
key_code=1;
}
}
else if(!key2){
delay(1000); //延时消除按键抖动
if(!key2){
key_code=2;
}
}
else if(!key3){
delay(1000); //延时消除按键抖动
if(!key3){
key_code=3;
}
}
else if(!key4){
delay(1000); //延时消除按键抖动
if(!key4){
key_code=4;
}
}
else if(!key5){
delay(1000); //延时消除按键抖动
if(!key5){
key_code=5;
}
}
return key_code;
}
//数码管位数切换函数,每次调用向左或向右移动一位
void digit_shift(unsigned char dir){
if(dir==1){ //左移
digit_pos++;
if(digit_pos>=digit_num){
digit_pos=0;
}
}
else{ //右移
digit_pos--;
if(digit_pos>=digit_num){
digit_pos=digit_num-1;
}
}
}
//数码管显示函数,根据当前位数和显示值显示数字
void digit_display(unsigned char num){
switch(digit_pos){
case 0:{
LSA=0;LSB=0;LSC=0;P0=digit[num%10];break;
}
case 1:{
LSA=1;LSB=0;LSC=0;P0=digit[num/10%10];break;
}
case 2:{
LSA=0;LSB=1;LSC=0;P0=digit[num/100%10];break;
}
case 3:{
LSA=1;LSB=1;LSC=0;P0=digit[num/1000%10];break;
}
}
}
//电压上下限调节函数,根据按键调节电压上下限的值
void vol_limit_adjust(unsigned char key_code){
switch(key_code){
case 2:{ //按下key2,增加电压上限
vol_max++;
break;
}
case 3:{ //按下key3,减小电压上限
vol_max--;
break;
}
case 4:{ //按下key4,减小电压下限
vol_min--;
break;
}
case 5:{ //按下key5,增加电压下限
vol_min++;
break;
}
}
}
void main(){
unsigned char key_code=0;
unsigned char vol_now=0; //当前电压值
unsigned char vol_flag=0; //电压上下限标志位,0表示显示当前电压,1表示显示电压上限,2表示显示电压下限
while(1){
key_code=key_scan(); //按键检测
if(key_code!=0){ //如果有按键按下
if(key_code==1){ //按下key1,切换电压上下限标志位
vol_flag++;
if(vol_flag>2){
vol_flag=0;
}
}
else if(key_code>=2&&key_code<=5){ //按下key2~key5,调节电压上下限
vol_limit_adjust(key_code);
}
else if(key_code==6){ //按下key6,向左切换数码管位数
digit_shift(1);
}
else if(key_code==7){ //按下key7,向右切换数码管位数
digit_shift(2);
}
}
//根据电压上下限标志位判断当前显示值
if(vol_flag==0){ //显示当前电压
vol_now++; //模拟电压值变化
if(vol_now>vol_max){
vol_now=vol_min;
}
digit_display(vol_now);
}
else if(vol_flag==1){ //显示电压上限
digit_display(vol_max);
}
else if(vol_flag==2){ //显示电压下限
digit_display(vol_min);
}
delay(1000); //延时
}
}
```
注意:以上程序仅供参考,具体实现可能需要根据具体硬件和需求进行调整。
阅读全文