赞
踩
1.头文件和定义,代码还使用了 sbit 定义来声明了两个变量 duan 和 wei,它们实际上是 P2.6 和 P2.7 端口的别名,用于控制数码管的段选和位选信号。这种方法可以使代码更具可读性,并提高代码的可维护性。定义无符号整数便于后面应用。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,b,c,d,e
sbit duan=P2^6; //段选信号的锁存器控制
sbit wei=P2^7; //位选信号的锁存器控制
2.使用一个 16 个元素的数组 table,该数组包含了 0-15 的数字在数码管中对应的段码值。
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0-F的码表
3.延时函数部分
(数码管的显示主要依靠于人的视觉暂存和数码管的余辉),前面亮灯灭灯里面提到过 单片机控制一盏灯的亮与灭程序解释
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<113;j++)
{
;
}
}
}
4.利用取余操作,将要显示的数据拆分开
void culi() //假设d=123;
{
a=d/100; //a=123/100=1,其它的不要,只要1,存进变量a中
b=d/10%10; //b=123/10=12%10=2,只要2,其它的不要,存进变量b中
c=d%10; //c=123%10=3,只要3,其它的不要,存进变量c中
}
5.进行位选和段选,也就是显示操作
11110111对应16进制就是0xf7, 所以设置P0口味0xf7进行位选操作,最后将百位发送给P0进行段选,然后延时,完成百位上的数据的显示。十位和个为依次类推。
void pro() { P0=0xf7; //选择数码管 wei=1; //选择数码管开启 wei=0; //选择数码管关闭 P0=table[a]; //送段码百位 duan=1; //段位开 duan=0; //段位关 delay_ms(5);//延时 P0=0xef; wei=1; wei=0; P0=table[b]; //送段码十位 duan=1; duan=0; delay_ms(5); P0=0xdf; wei=1; wei=0; P0=table[c]; //送段码个位 duan=1; duan=0; delay_ms(5); e++; }
6.主函数部分
d是数码管要显示的数字,e在这里的作用是实现自加操作,当加至一定数量的时候,d变也会自加,于是可以看到数码管上的数字逐渐增大。主程序就是先对d进行拆分,进入循环之后,进行数码管显示(数码管显示里面包括了e自加),e自加到一定数量后d自加,e置零,d拆分,之后在while死循环中进行显示,下一个流程也是这样的。关于为什么e自加到50,代码中在pro()函数中使用e变量计数,是为了控制数码管显示的速度和循环显示的次数。每次进入pro()函数后,会将当前数码管的值显示出来,并将e的值自加1,表示等待下一次显示的时间。当e的值累计到50时,if(e==50)语句会触发执行一些特定的操作,即将变量d自加1,并调用culi()函数将d分解为百位、十位和个位数,以便在下一轮循环中显示出来。这是因为在该代码中,每50个计数周期后需要切换到下一个数字进行显示,即在一个特定的时间间隔内更新数码管的显示值,以达到流畅的显示效果。如果不进行分解操作,就无法在下一轮循环中显示下一个数字。需要注意的是,这个特定的时间间隔(50个计数周期)是通过实验调整得出的,具体的数值可以根据具体的需求和实际情况进行调整。例如,如果需要加快数码管的显示速度,可以减小时间间隔;如果需要减缓数码管的显示速度,可以增大时间间隔。同时,为了保证数码管显示的稳定性和可靠性,时间间隔也不能太小或太大,需要根据具体的硬件设备和程序实现进行适当的调整。
void main() { d=0; //要显示的变量 e=0; //自加的速度标志。 culi(); while(1) { pro(); //数码管显示。 if(e==50) //e测试等于50就执行下面的语句。 { e=0; //e=0 d++; //d自加1 culi(); //处理d,就是把d分成百位,十位,个位。 } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。