void display() //显示函数
{
uchar i;
if(mode==0) //无极变速
{
displaydata[0]=0x00;
displaydata[1]=duan[disdata[1]];
displaydata[2]=duan[disdata[2]]|0x20;
displaydata[3]=duan[disdata[3]];
}
else if(mode==1) //上限
{
displaydata[0]=0xce; //H 11001110
displaydata[1]=duan[TH%1000/100];
displaydata[2]=duan[TH%100/10]|0x20;
displaydata[3]=duan[TH%10];
}
else if(mode==2) //下限
{
displaydata[0]=0x1a; //L 00111000
displaydata[1]=duan[TL%1000/100];
displaydata[2]=duan[TL%100/10]|0x20;
displaydata[3]=duan[TL%10];
}
else if(mode==3) //档位0到3档
{
displaydata[0]=duan[dang];
displaydata[1]=0x80; //01000000
displaydata[2]=duan[disdata[1]];
displaydata[3]=duan[disdata[2]];
}
else if(mode==4)
{
displaydata[0]=0xda; //b自然风
displaydata[1]=duan[disdata[1]];
displaydata[2]=duan[disdata[2]]|0x20;
displaydata[3]=duan[disdata[3]];
}
for(i=0;i<4;i++) //循环4次显示4位数码管
{
P2=wei[i]; //选中位
P0=displaydata[i]; //送入显示码
delay(3); //延时
P2=0xff; //关闭位
P0=0x00; //复位显示码
}
}
大神,代码中有这个循环位选,有什么作用的,是起到刷新扫描作用吗?
for(i=0;i<4;i++) //循环4次显示4位数码管
{
P2=wei[i]; //选中位
P0=displaydata[i]; //送入显示码
delay(3); //延时
P2=0xff; //关闭位
P0=0x00; //复位显示码
}
一个位码和一个段码才能显示。
追问谢谢大神,
单片机数码管动态显示浪费资源怎么办
不要放在主程序 放在 定时器中断 里面 到一定时间 自动执行 而不是让CPU干耗着等着时间到来 比如你把定时时间长度设置为2.5ms 正好可以扫数码管 再把这个长度累计8次 就是20ms 正好扫描键盘(这个累计是软件实现的 这就两个事情只用了一个定时器)那么他们之间怎么沟通呢 就是用 全局变量 主程序只...
51单片机数码管显示问题
采用这种方式一般都是所谓的动态扫描显示,往往不止一个数码管。一个数码管8段加一个公共端需要9根口线才能完全显示任意数字,为了节省IO口线,就利用了人眼视觉驻留的原理(就像电影胶片每秒24帧,连续起来播放你觉得没有任何间断),每一位数码管显示一会儿,然后关掉它,再去显示下一个数码管。只要保证...
51单片机定时中断导致主程序数码管显示出问题
2,串口发送改为中断方式,这个不细说了,网上有资料。。3,舍弃数码管扫描的软件延时,改用硬件延时(就是把数码管的位的切换也放在定时器中断里完成),保证动态扫描的及时性。这叫单片机的“前后台”编程方式,相当于将动态扫描放在了“后台”,由定时器中断来触发,不触发则不占CPU时间。
如何在单片机在串口中断通信时,解决对动态数码管显示闪烁的问题??
单片机在串口中断通信时,动态扫描显示数码管显示闪烁,说明要么你的串口中断通信程序设计不合理(比如内部有等待),要么是你的动态扫描频率太低。解决办法:1、设置串口中断优先权低、动态扫描中断优先权高(如果是中断扫描的话)。2、优化串口中断程序。
单片机中数码管动态显示扫描时间问题
我也遇到过同样的问题,仿真时显示刷新有问题,但下载到单片机系统中确实能正常显示。解决Proteus仿真的办法:用于进行位驱动的三极管不要选择某种实际的三极管,而是用理想三极管,这样数码管显示不正常的问题就解决了。
proteus 仿真单片机 两位数码管动态扫描显示乱码
你的问题可能如下:一、大概是动态扫描的时间间隔太长了,通常动态扫描的时间间隔在1-2ms时间,如果时间太长就会出现闪烁的现象。从你的程序看,你的扫描时间间隔好象是10ms!二、每次循环的次数要足够多,如用1ms时间间隔扫描,你有二个字符要循环,则循环500次,一共是2*500=1000秒,这样才能看清你...
C51单片机的数码管显示问题
数码管动态显示要求扫描很快,你上面就是延时了5ms,如果时间再长一点,那你就能看到数码管不停的闪。所以这里10ms太长了,可以不用。但为什么个位没闪,应该是在display时,先是现实十位,然后把十位灭掉,再显示个位,一直等到在显示十位时,个位才灭,就是说在这支前,个位是亮的,由于你这延时了...
单片机数码管动态显示
下面是用段选和位选的数码管动态显示程序,可以参照下写法 include <AT89X51.H> unsigned char dispbitcnt; \/\/数码管位码扫描变量 unsigned char second;\/\/秒变量 unsigned char minite;\/\/分变量 unsigned char hour;\/\/时变量 unsigned char tcnt;\/\/秒信号产生变量 unsigned char mstcnt;\/...
单片机数码管动态显示的过程中,怎么实现让其中一个闪烁,其他的不受影...
1 单片机数码管动态显示的过程中,设置一个闪烁寄存器,专门保存要闪烁显示的位子,再增加一个闪烁显示码的暂存器。2 每次调用显示程序时,先要判断需要显示闪烁的位子的显示码,是不是等于“灭”的显示码,不是的话,将该位的显示码送闪烁显示码的暂存器进行保存,将“灭”的显示码送入相应的显示缓冲...
数码管俩位显示0到99加中断程序
void dispaly(uchar num);\/\/显示子程序 void main(){ init();while(1){ dispaly(num);} } void init()\/\/初始化函数 { p1=1;p2=1;num=0;TMOD=0x01;\/\/采用定时器中断 TH0=(65536-50000)\/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;} void dispaly(uchar num)\/\/显示子程序 ...