作业2:6位数码管静动态显示

张开发
2026/4/16 12:18:12 15 分钟阅读

分享文章

作业2:6位数码管静动态显示
文章目录一.6位数码管都输出9图片实现代码二.数码管左一位和右一位显示7图片实现代码三.6位数码管轮播0-9图片实现代码四.数码管中间两位轮播0-9图片实现代码五.数码管依次显示1-6图片实现代码1.数码管轮流显示0-5六.6位数码管显示13.14.15图片实现代码一.6位数码管都输出9图片实现代码#includereg52.h// 头文件// 定义锁存器控制引脚sbit dulaP3^4;// 锁存器U2段选sbit welaP1^6;// 锁存器U2位选// 主函数voidmain(){// 1.位选控制wela1;// 打开位选P00xc0;// 位选6个数码管 1100 0000低6位有效对应6个数码管wela0;// 关闭位选// 2.段选控制dula1;// 打开段选P00x6f;// 数码管显示9 0110 1111a,b,c,d,f,g段亮dula0;// 关闭段选// 3.保持while(1);}二.数码管左一位和右一位显示7图片实现代码#includereg52.hsbit dulaP3^4;// 段选sbit welaP1^6;// 位选voiddelay(unsignedintt);voidmain(){while(1){// 第1位显示7 P00xff;// 【消隐】发送位选前清空P0避免鬼影wela1;P00xfe;// 选中第1位 (1111 1110) - 注意根据你的电路如果是高电平选通则用0x01wela0;dula1;P00x07;// 共阴极7的段码dula0;delay(2);// 动态扫描延时通常在1-5ms// 第2-5位熄灭 (实际上直接跳过即可或者显式关闭) // 如果想让中间彻底黑掉最简单的办法是不去扫描它们// 或者像下面这样发送一个全灭的段码// 第6位显示7 P00xff;// 【消隐】wela1;P00xdf;// 选中第6位 (1101 1111) - 若为高电平选通则用0x20wela0;dula1;P00x07;// 显示7dula0;delay(2);}}voiddelay(unsignedintt){unsignedintx,y;for(xt;x0;x--)for(y110;y0;y--);三.6位数码管轮播0-9图片实现代码#includereg52.hsbit dulaP3^4;sbit welaP1^6;// 共阴极段码表 0-9unsignedcharcode table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 位选表分别选中第1, 2, 3, 4, 5, 6位 (高电平有效)unsignedcharcode wheeltable[]{0x01,0x02,0x04,0x08,0x10,0x20};voiddelay(unsignedintt){while(t--);}voidmain(){unsignedcharnum0;// 当前要显示的数字unsignedintcrystal0;// 用于控制数字切换频率的计数器unsignedchari;// 扫描索引while(1){// 动态扫描循环快速轮流点亮 1-6 位for(i0;i6;i){// --- 位选操作 ---wela1;P0wheeltable[i];// 依次选中每一位wela0;// --- 段选操作 ---dula1;P0table[num];// 显示当前的数字dula0;delay(100);// 短暂留存保证亮度// --- 消隐 ---dula1;P00x00;// 关掉段选防止重影dula0;}// 控制数字变换的速度crystal;if(crystal50){// 数值越大0-9 变化越慢crystal0;num;if(num9)num0;}}}四.数码管中间两位轮播0-9图片实现代码#includereg52.hsbit dulaP3^4;// 段选sbit welaP1^6;// 位选// 标准共阴极 0-9 段码表unsignedcharcode table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voiddelay(unsignedintt){while(t--);}voidmain(){unsignedcharnum0;unsignedintspeed_cnt0;while(1){// --- 核心逻辑分时操作总线严防干扰 ---// 1. 处理位选P00xff;// 清空总线数据wela1;// 开启位选锁存器P00xf3;// 送入位选低电平选通中间两位1111 0011wela0;// 锁存此时中间两位的公共端已经接通// 2. 处理段选P00x00;// 清空总线数据关键防止位选数据冲进段选dula1;// 开启段选锁存器P0table[num];// 送入0-9段码dula0;// 锁存此时数字段码已送达// 3. 维持显示delay(500);// 4. 轮播控制speed_cnt;if(speed_cnt200){speed_cnt0;num;if(num9)num0;// 0-9 循环}}}五.数码管依次显示1-6图片实现代码#includereg52.h#defineucharunsignedchar#defineuintunsignedint// 定义锁存器控制引脚sbit dulaP3^4;// 段选锁存器U2sbit welaP1^6;// 位选锁存器U3// 数码管共阴极段码表 (0-9)uchar code TableDula[]{0x3F,// 00x06,// 10x5B,// 20x4F,// 30x66,// 40x6D,// 50x7D,// 60x07,// 70x7F,// 80x6F// 9};// 数码管位码表 (选中第1到第6位低电平有效)uchar code TableWela[]{0xFE,// 1111 1110 - 选中第1位0xFD,// 1111 1101 - 选中第2位0xFB,// 1111 1011 - 选中第3位0xF7,// 1111 0111 - 选中第4位0xEF,// 1110 1111 - 选中第5位0xDF// 1101 1111 - 选中第6位};/** * brief 延时函数 * param x 延时毫秒数 (近似) */voiddelay(uchar x){uchar j;while(x--){for(j0;j125;j);}}voidmain(){uchar i;while(1){// 动态扫描循环for(i0;i6;i){// --- 1. 处理位选 ---P0TableWela[i];// 送入位码wela1;// 打开位选锁存器wela0;// 锁定当前位// --- 2. 处理段选 ---P0TableDula[i1];// 送入段码 (i1 对应显示数字 1,2,3,4,5,6)dula1;// 打开段选锁存器dula0;// 锁定当前数字笔画// --- 3. 视觉暂留 ---delay(2);// 每一位点亮约 2ms// --- 4. 消隐 (非常重要防止位选切换时产生重影) ---P00x00;// 段码清零dula1;// 写入全灭状态dula0;}}}1.数码管轮流显示0-5实现代码#includereg52.hsbit dulaP3^4;sbit welaP1^6;// 0-5 的共阴极段码unsignedcharcode table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d};// 选中第 1 到第 6 位的位选码 (低电平 0 选中)unsignedcharcode wei[]{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};voiddelay(unsignedintt){unsignedintx,y;for(xt;x0;x--)for(y110;y0;y--);}voidmain(){unsignedchari;while(1){for(i0;i6;i){// 1. 位选选中当前的第 i 位P00xff;// 消隐wela1;P0wei[i];wela0;// 2. 段选显示对应的数字P00x00;// 清空总线dula1;P0table[i];dula0;// 3. 核心长延时。决定了数字“跳动”的速度// 延时约 500ms这样肉眼就能清楚看到数字在移动delay(500);}}}六.6位数码管显示13.14.15图片实现代码#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbit dulaP3^4;sbit welaP1^6;// 存储“13.14.15”对应的段码// 注意最后一位是 0x6D (数字5)没有加小数点uchar code DisplayData[]{0x06,// 10xCF,// 3.0x06,// 10xE6,// 4.0x06,// 10x6D// 5 (注意此处没有小数点)};// 位码表低电平有效uchar code TableWela[]{0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};voiddelay(uchar x){uchar j;while(x--){for(j0;j125;j);}}voidmain(){uchar i;while(1){for(i0;i6;i){// --- 1. 位选 ---P0TableWela[i];wela1;wela0;// --- 2. 段选 ---P0DisplayData[i];dula1;dula0;delay(2);// 保持显示// --- 3. 消隐 ---P00x00;dula1;dula0;}}}

更多文章