1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > [蓝桥杯单片机 八位共阳数码管](4)

[蓝桥杯单片机 八位共阳数码管](4)

时间:2019-02-25 18:26:54

相关推荐

[蓝桥杯单片机 八位共阳数码管](4)

[蓝桥杯单片机 共阳数码管]

一、数码管原理图

开发板上的八位数码管为共阳连接,com1–com8分别控制公共端(公共阳极);a–dp分别控制数码管每一位的八个段。它们两又分别被锁存器U6和U7控制着。

当com端为高电平,对应的a–dp为低电平时相应段码就会亮。如:com1为高电平,com2–com8为低电平,此时让dp为低电平,a–g为高电平,则第一个数码管只有dp亮,也就是亮一个点。

由于段码有八个,如果一个一个赋值很麻烦,因此一般用十六进制数一次性给段码进行赋值。十六进制数控制的段码显示如下:

二、数码管显示代码

下面举几个例子:

1、让数码管八个位都显示6(数码管静态显示)

#include"reg52.h"sbit HC138_A = P2^5;//定义译码器中ABC所在引脚sbit HC138_B = P2^6;sbit HC138_C = P2^7;void Show_SMG(){HC138_C = 1; //给CBA赋值,打通U6HC138_B = 1;HC138_A = 0;P0 = 0xff; //com1-8设为高电平HC138_C = 1; //给CBA赋值,打通U7HC138_B = 1;HC138_A = 1;P0 = 0x82; //给八个段赋值显示6}void main(){while(1){Show_SMG();}}

2、让数码管八个位从0显示到9(数码管静态显示)

为了方便,我们将所有要用的段码放在一个数组中;将选择锁存器的代码也进行优化,要理解这些的原理都要将十六进制转化为二进制来理解。

#include"reg52.h"unsigned char SMG_Duanma[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码void Delay(unsigned int t){while(t--);}void SelectHC573(unsigned channel) //选择锁存器{switch(channel){case 6: //选择U6锁存器P2 = P2 & 0x1f | 0xc0;break;case 7: //选择U7锁存器P2 = P2 & 0x1f | 0xe0;break;}}unsigned char i;void ShowSMG(){SelectHC573(6);P0 = 0xff; //com1-8设为高电平SelectHC573(7);for(i = 0; i<=9; i++){P0 = SMG_Duanma[i];Delay(50000);Delay(50000);}}void main(){while(1){ShowSMG();}}

3、让数码管从0显示到99(数码管动态显示)

动态显示原理:让不同位的数码管只亮一小段极小时间,从而造成视觉暂留效果,人眼无法识别这极小段的熄灭时间,从而觉得这些不同位数码管是同时亮的。

上代码:

#include"reg52.h"unsigned char SMG_Duanma[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码void Delay(unsigned int t){while(t--);}void SelectHC573(unsigned char channel){switch(channel){case 6: //选择U6锁存器P2 = P2 & 0x1f | 0xc0;break;case 7: //选择U7锁存器P2 = P2 & 0x1f | 0xe0;break;}}void ShowSMG_Bit(unsigned char pos, unsigned char value) //pos位显示value{SelectHC573(6);P0 = 0x01 << (pos - 1);SelectHC573(7);P0 = value;Delay(200); //消影P0 = 0xff; //消影}unsigned char i, j;void DelaySMG(unsigned int t){while(t--){ShowSMG_Bit(1, SMG_Duanma[i]); //第一位显示SMG_Duanma[i]Delay(200);ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j]Delay(200);}}void ShowSMG(){for(i = 0; i<=9; i++)for(j = 0; j <= 9; j++){ShowSMG_Bit(1, SMG_Duanma[i]); //第一位显示SMG_Duanma[i]DelaySMG(200);ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j]DelaySMG(200);}}void main(){while(1){ShowSMG();}}```

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。