蓝桥杯数码管静态显示

分为段码(a,b,c,d,e,f,g,dp)和公共端

 

可理解为P0口直接控制这个端口了

 

公共端由Y6控制 。

Y7控制段码,Y6控制公共端

 

例题:让第一个数码管显示数字6

#include "reg52.h"

unsigned char code SMDD_duanma[18]={0xc0,0xf9,0xa4,0xb0,

                               0x99,0x92,0x82,0xf8,

                             0x80,0x90,0x88,0x80,

                               0xc6,0xc0,0x86,0x8e,

                               0xbf,0x7f};

void HC138init(unsigned char i)

{

switch(i)

{

case 4:

P2=(P2&0x1f)|0x80;

break;

case 5:

P2=(P2&0x1f)|0xa0;

break;

case 6:

P2=(P2&0x1f)|0xc0;

break;

case 7:

P2=(P2&0x1f)|0xe0;

break;

}

}

void ShowSMG()

{

HC138init(6);

P0=0x01;

HC138init(7);

P0=0x82;

}

void main()

{

ShowSMG();

while(1)

{

}

}

所有数码管循环播放6

#include "reg52.h"

unsigned char code SMDD_duanma[18]={0xc0,0xf9,0xa4,0xb0,

                               0x99,0x92,0x82,0xf8,

                             0x80,0x90,0x88,0x80,

                               0xc6,0xc0,0x86,0x8e,

                               0xbf,0x7f};

void delay(unsigned int t)

{

while(t--);

while(t--);

}

void HC138init(unsigned char i)

{

switch(i)

{

case 4:

P2=(P2&0x1f)|0x80;

break;

case 5:

P2=(P2&0x1f)|0xa0;

break;

case 6:

P2=(P2&0x1f)|0xc0;

break;

case 7:

P2=(P2&0x1f)|0xe0;

break;

}

}

void ShowSMG_Bit(unsigned char dat,unsigned char pos)

{

HC138init(6);

P0=0x01<<pos;

HC138init(7);

P0=dat;

}

void SMG_Static()

{

unsigned char i;

for(i=0;i<8;i++)

{

ShowSMG_Bit(SMDD_duanma[6],i);

delay(60000);

}

}

void main()

{

HC138init(5);

P0=0x00;

HC138init(4);

P0=0xff;

while(1)

{

SMG_Static();

}

}

每个数码管输出0-9:

#include "reg52.h"

unsigned char code SMDD_duanma[18]={0xc0,0xf9,0xa4,0xb0,

                               0x99,0x92,0x82,0xf8,

                             0x80,0x90,0x88,0x80,

                               0xc6,0xc0,0x86,0x8e,

                               0xbf,0x7f};

void delay(unsigned int t)

{

while(t--);

while(t--);

}

void HC138init(unsigned char i)

{

switch(i)

{

case 4:

P2=(P2&0x1f)|0x80;

break;

case 5:

P2=(P2&0x1f)|0xa0;

break;

case 6:

P2=(P2&0x1f)|0xc0;

break;

case 7:

P2=(P2&0x1f)|0xe0;

break;

}

}

void ShowSMG_Bit(unsigned char dat,unsigned char pos)

{

HC138init(6);

P0=0x01<<pos;

HC138init(7);

P0=dat;

}

void SMG_Static()

{

unsigned char i,j;

for(i=0;i<8;i++)

{

for(j=0;j<10;j++)

{

ShowSMG_Bit(SMDD_duanma[j],i);

delay(60000);

}

}

}

void main()

{

HC138init(5);

P0=0x00;

HC138init(4);

P0=0xff;

while(1)

{

SMG_Static();

}

}

例题:8个数码管分别单独依次显示0-9的值,然后所有数码管一起显示同时显示0-F的值。

#include "reg52.h"

unsigned char code SMDD_duanma[18]={0xc0,0xf9,0xa4,0xb0,

                               0x99,0x92,0x82,0xf8,

                             0x80,0x90,0x88,0x80,

                               0xc6,0xc0,0x86,0x8e,

                               0xbf,0x7f};

void delay(unsigned int t)

{

while(t--);

while(t--);

}

void HC138init(unsigned char i)

{

switch(i)

{

case 4:

P2=(P2&0x1f)|0x80;

break;

case 5:

P2=(P2&0x1f)|0xa0;

break;

case 6:

P2=(P2&0x1f)|0xc0;

break;

case 7:

P2=(P2&0x1f)|0xe0;

break;

}

}

void ShowSMG_Bit(unsigned char dat,unsigned char pos)

{

HC138init(6);

P0=0x01<<pos;

HC138init(7);

P0=dat;

}

void SMG_Static()

{

unsigned char i,j;

for(i=0;i<8;i++)

{

for(j=0;j<10;j++)

{

ShowSMG_Bit(SMDD_duanma[j],i);

delay(60000);

}

}

for(j=0;j<16;j++)

{

  HC138init(6);

P0=0xff;

HC138init(7);

P0=SMDD_duanma[j];

delay(60000);

}

}

void main()

{

HC138init(5);

P0=0x00;

HC138init(4);

P0=0xff;

while(1)

{

SMG_Static();

}

}

 

### 蓝桥杯比赛中数码管显示的最佳实现方式 在蓝桥杯比赛中的数码管显示技术,通常分为静态显示和动态显示两种方式。然而,当需要多个数码管同时显示不同内容时,静态显示无法满足需求[^1]。因此,最佳实践通常是采用 **动态扫描显示** 的方法。 #### 动态数码管显示的工作原理 动态数码管显示的核心在于通过快速切换各个数码管的位选信号,并配合相应的段码数据,使得人眼因视觉暂留效应而感知到稳定的多组数字显示。这种方法的关键点如下: - 每个数码管的位选信号独立控制。 - 数据刷新频率需达到一定水平(一般大于50Hz),以避免闪烁现象。 - 需要精确的时间分配机制来依次点亮每一个数码管。 ```c void display_digit(uint8_t digit[], uint8_t length) { static uint8_t index = 0; // 关闭所有数码管 PORTB &= ~(1 << PB7); // 设置当前数码管的段码 PORTD = segment_code[digit[index]]; // 打开对应的位选 PORTB |= (1 << bit_select[index]); // 自动更新索引 index++; if(index >= length){ index = 0; } } ``` 上述代码展示了如何通过循环逐一设置每个数码管的段码并开启其对应位选,从而实现动态显示效果。 #### 控制逻辑的设计要点 为了确保动态显示稳定可靠,还需要注意以下几个方面: 1. 使用定时器中断触发显示刷新过程,保持固定的帧率。 2. 如果涉及复杂的图案或字符,则应预先定义好对应的字模表。 3. 当存在其他任务时,可以考虑将显示处理放入低优先级的任务队列中执行。 #### 结合实际案例分析 例如,在某些题目场景下可能还会涉及到与其他外设交互的情况,比如温度传感器DS18B20的数据采集后实时反映于数码管上。此时除了基本的动态显示之外,还需加入针对具体硬件的操作流程[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值