【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯

简介: 【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯

实验内容:

利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输入电平。

       1.选中 8 位数码管的其中 1 位数码管,当独立按键 1 每按下一次,数码管加一(按下期间加 1),范围为 0—F;

       2.选中 8 位数码管的另 1 位数码管,当独立按键 2 每按下一次,数码管减一(松手之后减 1),范围为 F—0;

       3.按下独立按键 3 期间,流水灯以 600ms 的速度流动;

       4.按下独立按键 4,松手之后,8 个 LED 灯作一次花样循环。

按键一效果图:

按键二效果图

按键三效果图:

按键四效果图:

代码如下:

#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();          
}
相关文章
|
4月前
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
104 4
|
4月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
133 3
|
4月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
|
4月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
100 1
|
4月前
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
209 0
|
4月前
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
148 0
|
4月前
|
算法
51单片机不用定时器的数码管倒计时
51单片机不用定时器的数码管倒计时
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
【51单片机】一文带你利用【Keil软件的模板功能】【自定义模板】简化操作(带图详解)
【51单片机】一文带你利用【Keil软件的模板功能】【自定义模板】简化操作(带图详解)
【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)
【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)