下面输入是display(236)时,单片机上的数码管就正常从左至右显示236。但是当我改成display(263)时,单片机上的数码管就显示007。
我感觉是26/28/30的数学计算的公式有问题,但是核查了一下,好像没问题,上面这种情况就不太理解了,有没有了解其中所以然的小伙伴解答一下,感谢!
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件
#define uint unsigned int//宏定义unsigned int简称为uint
#define uchar unsigned char//宏定义unsigned char简称为uchar
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//毫秒级延时函数定义
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void display(uchar i)
{
uchar bai,shi,ge;
//直接舍去余数,得到百位数值
bai = i / 100;
//先求余,得到个位和十位组成的数,再除10舍去个位,得到十位数值
shi = i % 100 / 10;
//直接得到个位的余数
ge = i % 10;
//第一位数码管
P0 = 0XFF;
WE = 1;
P0 = 0XFE;//1111 1110
WE = 0;
DU = 1;
P0 = tabel[bai];
DU = 0;
delay(5);
//第二位数码管
P0 = 0XFF;
WE = 1;
P0 = 0XFD;//1111 1101
WE = 0;
DU = 1;
P0 = tabel[shi];//显示十位
DU = 0;
delay(5);
//第三位数码管
P0 = 0XFF;
WE = 1;
P0 = 0XFB;//1111 1011
WE = 0;
DU = 1;
P0 = tabel[ge];//显示个位
DU = 0;
delay(5);
}
void main()//main函数自身会循环
{
while(1)
{
display(263); //数码管显示函数
}
}