当前位置:   article > 正文

51单片机-数码管显示(清翔版)_清翔电子51单片机数码管

清翔电子51单片机数码管

51单片机-数码管显示

1.静态数码管

数码管原理图:
在这里插入图片描述
共阳极数码管需要给低电平数码管才会点亮,共阴极数码管需要给高电平才会点亮。在数码管的中的字码a代表低位,dp代表高位,也就是a代表(2^0) dp代表(2^7)。
共阴极显示16进制所有数字代码:
0: 0x3F ( abcdef = 0011 1111 )
1: 0x06
2: 0x5B
3: 0x4F
4: 0x66
5: 0x6D
6: 0x7D
7: 0x07
8: 0x7F
9: 0x6F
A: 0x77
B: 0x7C
C: 0x39
D: 0x5E
E: 0x79
F: 0x71
(2)数码管锁存模块:
在这里插入图片描述
为了方便数据存储需要将数码管数据进行锁存,锁存分为2种:位锁存,段锁存。
位锁存:在单片机数码管中有8位,需要使用芯片来锁存中要显示的具体哪一位数码管。在上面的芯片中是用来锁存位的,WE1代表低位,WE8代表高位。在位锁存中低电平有效。
74HC537芯片介绍:芯片中锁存开关位LE引脚,高电平开启锁存,低电平锁住数据。芯片的其他功能还有中继信号等作用。
在这里插入图片描述

锁存使用第二行,中继信号使用第一行。
段锁存:下面那个芯片代表段锁存,段锁存作用是锁住具体要在数码管中显示的数据。列如:我们将位锁存锁住以后就要开启P2-6引脚下面的段锁存,虽然两个芯片D段引脚在单片机中使用的相同,但是位锁存已经被锁存在第一个芯片之中,修改引脚数据不会发生变化,但是段选与位选的锁存引脚是不相同的。

#include <REGX52.H>

#define unsigned int uint;
#define unsigned int uint;

sbit duan = P2^6;//高电平有效,当开启段选以后可以控制数码管中那一根数码管
sbit wei = P2^7; //高电平有效,当开启位选可以控制8位数码管显示那一位

void main(){

    //显示哪一个数码管
	wei = 1; //打开位选,修改显示的数码管
	P0 = 0xFD;// 1111 1101  低电平有效 让第二位数码管显示
	wei = 0;//进行数据锁存   	

    //数码管中具体显示的内容
	duan = 1;
	P0 = 0x5B;//0-9:0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
	duan = 0;
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2.动态数码管显示

动态数码管的思想是将静态数码管进行封装,然后修改显示的数据。

#include <REGX52.H>

#define uint unsigned int 
#define uchar unsigned char 

sbit duan = P2^6;
sbit wei = P2^7; 

//code代表不能被修改,共阴极数码管显示 0-9
uchar code LED[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//毫秒级延时
void dely( uint z ){
	uint x,y;
	for(x = z;x > 0;x--){
		for(y = 114; y > 0;y--);
	}
}

void play(uint n){
	uint ge,shi,bai; //输入3位数,分别得出百十个位
	bai = n / 100;
	shi = n / 10 % 10;
	ge = n % 10;
	
	//第一位(百位)
	P0 = 0xFF;//清除断码
	wei = 1;
	P0 = 0xFE;//显示第一位
	wei = 0;
	
	duan = 1;
	P0 = LED[bai];
	duan = 0;
	dely(5);
	
	
	//第二位(十位)
	P0 = 0xFF;//清除断码
	wei = 1;
	P0 = 0xFD;//显示第二位
	wei = 0;
	
	duan = 1;
	P0 = LED[shi];
	duan = 0;
	dely(5);
	
	//第三位(个位)
	P0 = 0xFF;//清除断码
	wei = 1;
	P0 = 0xFB;//显示第三数码管
	wei = 0;
	
	duan = 1;
	P0 = LED[ge];
	duan = 0;
	dely(5);
}

void main(){
	while(1){
		play(521);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

3.数码管配合独立按键

这个主要使用的是使用独立按键来操控数码管的加减。
在这里插入图片描述
当按键被按下时,电路接口为0,此时可以检测哪一个电路引脚接口为0,说明哪一个接口被按下。
按键消抖:

if(K1 == 0){
    dely(20); //延时20毫秒是将按键贴片来回跳动的部分给消除
    if(KE1 == 0){//此时按键贴片不会出现来回跳动,只会平稳接触。
        消抖完成。
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

松手检测:

if( KEY_S2 == 0){ //S2按键按下数值增加
			dely(20);//按键延时消抖
			if(KEY_S2 == 0){
				while(!KEY_S2); //松手检测
			}		
	}
松手检测的作用:是保持我们按键在处于按下的时候只执行代码块中的数据,如果不使用松手检测,
当按键一直按下的时候,执行完代码快中的数据就会跑到别的函数中
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

完整代码:

#include <REGX52.H>

#define uint unsigned int 
#define uchar unsigned char 

sbit duan = P2^6;
sbit wei = P2^7; 

sbit KEY_S2 = P3^0;
sbit KEY_S3 = P3^1;

uchar code LED[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//毫秒延时
void dely( uint z ){
	uint x,y;
	for(x = z;x > 0;x--){
		for(y = 114; y > 0;y--);
	}
}

void play(uint n){	
	P0 = 0xFF;//显示第一位
	wei = 1;
	P0 = 0xFE;//
	wei = 0;

	duan = 1;
	P0 = LED[n];
	duan = 0;
	dely(5);
}


void main(){
	uchar number = 0;
	
	
	
	
	while(1){
		
		if( KEY_S2 == 0){ //S2按键按下数值增加
			
			dely(20);//按键延时消抖
			
			if(KEY_S2 == 0){
				number++;
			  if(number == 10){
					number = 9;
				}
				while(!KEY_S2); //松手检测
			}		
		}
		
		
		if( KEY_S3 == 0){ //S3按键按下数值减少
			
			dely(20);//按键延时消抖
			
			if(KEY_S3 == 0){
			  if(number > 0){
					number--; //注意如果到0在减就会变成255,因为char适0-255
				}
				while(!KEY_S3);
			}
		}
		
  play(number);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/408788
推荐阅读
相关标签
  

闽ICP备14008679号