蓝桥杯动态数码管显示

蓝桥杯数码管原理图:



数码管内部就是8LED组成的,LED的阴极全部连接在一起就是共阴极数码管,反之就是共阳极数码管,这个公共端用一个引脚引出用于位选,由于二极管是单向导电,对共阳极数码管而言,我们想要位选这个数码管就要给位选的引脚高电平,二极管一端已经是高电平了,段选就需要给另外一端一个低电平,共阴极数码管分析思路一样.

我们看一下原理图,首先我们看一下动态数码管的原理图,首先说明一下我们蓝桥杯的板子上的数码管是共阳极的,对第一组数码管(四个)分析,com1,com2,com3,com4就是留给我们来位选的,a,b,c,d,e,f,g,dp就是进行数码管的段选,加入我们让第一个数码管显示我们想要的数字,先给com1一个高电平,在给对应的a,b,c,d,e,f,g,dp一个低电平就可以显示我们想要的数字.

看到左边有两个芯片(M74HC573MIR),这个是锁存芯片,其特性为当11LE为高电平时,芯片解除锁存,为低电平时,芯片处于锁存状态。只要我们所谓锁存,就是当我们使芯片处于锁存状态的时候,Q1~Q8的状态与D1~D8无关,当锁存解除,Q1~Q8会与D1~D8保持一致.由原理图,左边两个M74HC573MIR芯片是否处于锁存状态分别LE,他们分别由Y6CY7C控制.

再看 器件选择 这个原理图,左边有一个74HC138译码器,这个芯片就是ABC三个管脚控制着Y0~Y78个管脚,使其中一个输出低电平,其他七个引脚输出高电平,其规律可以看起到网上到芯片手册.我们先位选,看到动态数码管原理图,我们需要给Y6C一个高电平,再看到器件选择的原理图,当我们74HC138A,B,C三个引脚赋值为1,1,0,就可以使Y6输出低电平,而其他的引脚输出高电平,然后再看到右边的4个或非门,Y6WR经过一个或非门得到Y6C,WR我们在开发板上是和GND相连的,默认低电平,当我们通过74HC138Y6一个低电平的时候,Y6WR的或运算得到低电平,然后取非得到高电平,即此时的Y6C是高电平,然后我们就关闭了U8这块M74HC573MIR芯片的锁存,通过给P0一个值就可以控制com,位选需要的芯片.然后同样的方法就可以段选了.

下面是代码实现
//这个数组用于位选,只给一个引脚高电平
unsigned char which[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//段选,根据数字编码
unsigned char num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//延时函数
void delay_ms(int n)
{
	int i,j;
	for(i=n;i>0;i--)
		for(j=110;j>0;j--);
}
//显示函数,w表示第几个数码管,n表示显示什么数字
void display_num(unsigned char w,unsigned char n)
{
	P2 = (P2&0x1f)|0xc0;//这一步就是先将P2的高三位先清0,然后在置相应的位来关闭相应锁存芯片的锁存
	P0 = which[w-1];//位选
	
	P2 = (P2&0x1f)|0xe0;//关闭段选芯片的锁存
	P0 = num[n];//段选
	delay_ms(5);//延时保证数码管数字亮度
	P0 = 0xFF;  //消影
	P2 &= 0x1f; //重新将高三位清零,以供下次使用
	
}

<think>好的,我需要帮助用户解决关于共阴极数码管编码方式和代码实现的问题。首先,我需要回顾用户提供的引用内容,看看有哪些相关信息可以引用。用户提到了几个引用,其中引用[1]解释了共阴极数码管的基本结构,指出共阴极是8个LED的负极接在一起,位选端口给0,数据端口给1时点亮。引用[2]和[5]提供了Verilog和C语言的代码示例,展示了不同数字对应的段选编码。引用[3]和[4]讨论了动态扫描和驱动方式,说明如何通过控制位选和段选来显示不同数字。接下来,我需要整理共阴极数码管的编码方式。通常,数码管有7段(a到g)加一个小数点(dp)。共阴极的编码是当某段为高电平时点亮。例如,数字0需要a到f段亮,g段灭,对应的二进制应该是0b0000001(假设最低位是a段)。但需要确认引用中的具体编码。例如,引用[5]中的数组seg7code,0x3F对应二进制00111111,可能对应a到g的不同排列,需要结合硬件连接。然后,代码实现部分需要分静态驱动和动态扫描。静态驱动简单,但占用资源多。动态扫描则是轮流点亮各个数码管,利用视觉暂留效果。引用[4]和[5]中的代码展示了动态扫描的实现,比如循环控制每个数码管显示时间和顺序。 还需要注意不同文献中编码可能有差异,比如段序(a到g的顺序)可能不同,用户需要根据具体硬件手册调整。例如引用[2]中的Verilog代码,数字0的编码是7’b000_0001,可能代表a段为0(低电平有效),但共阴极应该是高电平有效,这里可能存在矛盾。需要仔细检查代码中的段选是否低电平有效,可能用户引用中的代码有误,或者段选信号是反向的。另外,引用[5]中的C语言代码使用了0x3F表示0,转换为二进制是00111111,假设P2口连接的段是a到g,其中a是最低位,那么可能每个位的定义需要确认。例如,a段对应bit0,b段对应bit1,依此类推。如果共阴极数码管需要某段亮,则对应位为1,所以数字0需要a到f段亮,g段灭,即二进制1111110(0xFE),但引用中的编码是0x3F,这可能是因为段选的顺序不同,或者硬件连接是反向的。需要向用户指出这些可能的差异,并建议参考具体硬件文档。同时,动态扫描的实现需要注意延时时间,通常每个数码管显示1-5ms,循环扫描以保持稳定显示。 最后,生成相关问题时,可以涉及共阴与共阳的区别、动态扫描的原理、编码差异的原因以及常见错误排查等。</think>### 共阴极数码管编码方式与代码实现 #### 一、共阴极数码管编码原理 共阴极数码管的8个LED(a-g + dp)负极共地,**段选信号需高电平驱动**。例如: - **数字“0”**需要点亮a-f段,熄灭g段。若段序为a(LSB)到dp(MSB),则二进制编码为$00111111$(即$0x3F$)[^5]。 - **数字“1”**仅点亮b和c段,对应$00000110$(即$0x06$)[^5]。 引用中的编码表示例如下: ``` 0: 0x3F → 7段码为00111111(a-f亮,g灭) 1: 0x06 → 00000110(b、c亮) ... 9: 0x6F → 01101111(a、b、c、d、g亮)[^5] ``` #### 二、代码实现(C语言) 1. **静态驱动**(单个数码管): ```c unsigned char seg7code[] = {0x3F, 0x06, 0x5B, ..., 0x71}; // 0-9的编码表 P2 = seg7code[0]; // 显示数字“0”[^5] ``` 2. **动态扫描**(多位数码管): ```c void main() { while(1) { for (int i=0; i<4; i++) { P3 = 0x01 << i; // 位选(选中第i位数码管) P2 = seg7code[data[i]]; // 段选 delay(2); // 延时保持显示 } } } ``` **原理**:通过快速轮询位选信号,利用视觉暂留实现多位数显示[^4]。 --- #### 三、注意事项 1. **编码差异**:段序(a-g排列)可能因硬件设计不同,需参考具体电路手册[^1][^3]。 2. **电平有效性**:若段选信号为低电平有效(如引用[2]中的Verilog代码),需将编码取反。 3. **动态扫描频率**:建议每位数码管刷新时间≤5ms,避免闪烁[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布鲁格若门

对你有用的话真是太好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值