数码管流水显示“HELP“

该程序使用REGX52.h库来控制数码管,通过定义延时函数实现数码管的动态扫描显示。利用视觉暂留效应,让人眼感觉多个数码管同时显示。代码中设置了不同的数码管位置选择,并依次点亮数码管,显示HELP图像,整体向右移动,形成动态效果。

#include<REGX52.h>

unsigned char table[]={0x76,0x79,0x38,0x73};/*定义数码管显示图像,依次为H,E,L,P*/
void Delay(unsigned char xms)/*定义延时函数,输入的数字为多少毫秒*/
{

while(xms--)
{
unsigned char i,j;
i=2;
j=239;
do
{
while(--j);
}while(--i);
}
}

void choosesmg(unsigned char Location,led)
{
switch(Location)/*switch选择点亮哪个数码管*/
{
case 0:
P2_4=1;P2_3=1;P2_2=1;break;
case 1:
P2_4=1;P2_3=1;P2_2=0;break;
case 2:
P2_4=1;P2_3=0;P2_2=1;break;
case 3:
P2_4=1;P2_3=0;P2_2=0;break;
case 4:
P2_4=0;P2_3=1;P2_2=1;break;
case 5:
P2_4=0;P2_3=1;P2_2=0;break;
case 6:
P2_4=0;P2_3=0;P2_2=1;break;
case 7:
P2_4=0;P2_3=0;P2_2=0;break;
}
P0=table[led];/*选择点亮的数码管显示相应图像*/


}

void main()
{
while(1)
{
unsigned char b;
unsigned char a;


for(b=0;b<5;b++)/*共有两个4位数码管,help图像整体向右运动5次为一个总循环,故for 5次*/
{
for(a=0;a<60;a++)/*刷新若干次,使help能够停留足够时间*/
{
choosesmg(b,0);
Delay(1);
choosesmg(b+1,1);
Delay(1);
choosesmg(b+2,2);
Delay(1);
choosesmg(b+3,3);

Delay(1);
}

}

}
}
数码管动态扫描显示原理(多个数码管同时显示,人的视觉上):数码管实际只能一次点亮一个数码管,但是由于人的视觉有暂留效应,故只要
把不同数码管之间延时一定时间,人在视觉上就会认为多个数码管同时显示。

### 关于C51单片机驱动数码管实现流水显示学号 为了实现C51单片机驱动数码管并展示流水效果以及特定的学号,可以基于已有的动态显示代码进行修改和扩展。以下是详细的分析与解决方案。 #### 动态显示原理 动态显示的核心在于利用人眼的视觉暂留效应,在短时间内依次点亮各个数码管,从而形成连续的效果[^1]。对于流水显示而言,可以通过控制每一位数码管的内容及其亮灭顺序来模拟流动感。 #### 修改后的代码示例 以下是一个完整的C语言代码示例,用于在数码管上滚动显示一个假设的学号`20231234`: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int // 定义数码管字形码表 uchar code dis_code[] = { 0xC0, // '0' 0xF9, // '1' 0xA4, // '2' 0xB0, // '3' 0x99, // '4' 0x92, // '5' 0x82, // '6' 0xF8, // '7' 0x80, // '8' 0x90 // '9' }; void delay(uint t) { // 延时函数 uchar i; while (t--) for (i = 0; i < 100; i++); } void display(uchar data[], uchar length) { // 显示函数 uchar i, pos = 0x80; // 初始化位置变量 while (1) { for (i = 0; i < length; i++) { P0 = dis_code[data[(pos >> (length - 1)) & 0x0F]]; // 输出当前位数据 P2 = pos; // 控制哪一位数码管被选通 delay(50); pos >>= 1; // 移动到下一位 } } } uchar student_id[] = {2, 0, 2, 3, 1, 2, 3, 4}; // 学号数组 void main() { display(student_id, sizeof(student_id)); // 调用显示函数 } ``` 以上代码实现了将学号`20231234`逐位滚动显示的功能。其中,`student_id`数组存储了要显示的具体数字序列,而`display()`函数负责按照指定的时间间隔刷新每位数码管上的内容[^1]。 #### 注意事项 - **硬件连接**:确保P0口接数码管段码端,P2口接位选信号线。 - **延时调整**:如果发现流水速度过快或者过慢,可适当调节`delay()`函数内的参数值。 - **资源占用**:考虑到实际应用中可能还需要处理其他任务,应合理分配CPU时间给不同模块运行。 #### 进一步优化建议 如果希望增加更多功能比如反向流动或是暂停播放等功能,则可以在原有基础上加入按键检测机制,并依据不同的输入状态执行相应的操作逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值