动态显示设计思路
轮流点亮单个数码管,但看起来数码管是同时点亮的。
练习内容
具体代码
遇到的问题与解决方法:在数据快速更新的同时,数码管如果同步显示更新的数据,数码管显示的数据就会非常快,以至于我们人眼看上去很乱甚至看不清数据,在一开始使用的延时函数的基础上加以修改就可以使数码管延时显示一会儿更新之后的数据,让数据显示更加稳定清晰。
#include "reg52.h"
#include "inithc138.h"
#include "delay.h"
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};//0~F,“-”,“.”对应段码
//声明为“code”,节约ram区资源
unsigned char yue=12;
void smgshow_bit(unsigned char pos,unsigned char dat )//按位显示
{
inithc138(6);//位选
P0=0x01<<pos;//选择pos位数码管亮(0~7位)
inithc138(7);//段选
P0=dat;//显示内容
}
void display_dynamic()//动态显示
{
smgshow_bit(0,SMG_duanma[2]);
delayxms(2);//延时2ms(延时时间不能过长)
smgshow_bit(1,SMG_duanma[0]);
delayxms(2);
smgshow_bit(2,SMG_duanma[1]);
delayxms(2);
smgshow_bit(3,SMG_duanma[8]);
delayxms(2);
smgshow_bit(4,SMG_duanma[16]);
delayxms(2);
smgshow_bit(5,SMG_duanma[16]);
delayxms(2);
smgshow_bit(6,SMG_duanma[yue/10]);
delayxms(2);
smgshow_bit(7,SMG_duanma[yue%10]);
delayxms(2);
}
void update_delay(unsigned int x)
{
unsigned char data i, j;
while(x--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
display_dynamic();
}
}
void main()
{
while(1)
{
display_dynamic();
yue++;
if(yue>12)
yue=1;
update_delay(50);//数据刷新的同时延时显示一会儿
}
}