标题:
51单片机四位数码管计时显示程序求助
[打印本页]
作者:
wzynb
时间:
2024-5-22 18:12
标题:
51单片机四位数码管计时显示程序求助
各位大佬主要看主函数就行
Nixietube_number这个函数就是在数码管第几位显示数字几
这个代码运行个位数的时候就没有问题,把if那段删了只留else里面的运行两位数也没问题,但是使用ifelse的话并不能像我预想中那样,一位数时只显示第四个灯,当需要显示数字为两位数时再显示两个灯
反而在显示数字为9之后会短暂什么都不显示,然后第四个灯就开始乱闪
希望大佬能指点一下我为什么用了ifelse显示就出问题了
单片机源程序如下:
#include <REGX52.H>
void Nixietube_number(int position,int number);
void Delay(long xms);
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
int n=0;
int i=0;
void main()
{
TMOD=0x01;
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
EA=1;ET0=1;
TR0=1;
while(1)
{
if(0<=n<10)
{
Nixietube_number(4,n);
}
else
{
Nixietube_number(4,n%10);
Nixietube_number(3,n/10);
}
}
}
void Delay(long xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixietube_number(int position,int number)
{
unsigned char numberSize[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
switch(position)
{
case 1:
led1=1;led2=0;led3=0;led4=0;break;
case 2:
led1=0;led2=1;led3=0;led4=0;break;
case 3:
led1=0;led2=0;led3=1;led4=0;break;
case 4:
led1=0;led2=0;led3=0;led4=1;break;
}
P2=numberSize[number];
Delay(5);
}
void tiemr0() interrupt 1
{
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
i++;
if(i==50)
{
i=0;
n=n+1;
}
}
作者:
xiaobendan001
时间:
2024-5-22 18:56
电路图呢?这样的驱动方式还是挺新颖的,ifelse的意思是无效零消隐吗?
作者:
lkc8210
时间:
2024-5-22 19:00
if(0<=n<10)这种写法不正确
应改为if(0<=n && n<10)
但n其实不会少于0
所以可以简化为if(n<10)
作者:
xxxevery
时间:
2024-5-22 19:30
你的numberSize[]数组应该就是numberSize[10],你用大于9的n去取值不是越位了吗
作者:
xiaobendan001
时间:
2024-5-23 07:19
lkc8210 发表于 2024-5-22 19:00
if(0
对啊,可是看起来楼主是编译通过了吧
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1