发布网友
共3个回答
热心网友
你的现象应该是那两位数码管在
16 以前显示的是 0 和 一个数,如15 时显示的是 0 和 F、14 时显示的是 0 和 e。。。
16 时显示的是 1 和 0 ,17 时显示的是 1 和 1
disbuf[0]=(((firstdat&0xf0)>>4)&0x0f);
disbuf[1]=firstdat&0x0f;
disbuf[2]=(((seconddat&0xf0)>>4)&0x0f);
disbuf[3]=seconddat&0x0f;
这里不用这么麻烦吧,直接
disbuf[0]=firstdat>>4; 右移时,低四位被移出,高四位移入0,就是你要的结果了
disbuf[1]=firstdat&0x0f;
disbuf[2]=seconddat>>4;
disbuf[3]=seconddat&0x0f;
或者
disbuf[0]=firstdat/16; 除以16 得到 16 进制的十位
disbuf[1]=firstdat%16; 对16取余得到 16进制的个位
disbuf[2]=seconddat/16;
disbuf[3]=seconddat%16;
就行了吧
我想应该不会出现没消影的,不知道你说的消影是指什么现象
热心网友
参考一下这个仿真实例的8位数码管的动态显示,试试
热心网友
#include <reg51.h>
void delay(unsigned int i);
unsigned char code Disp_Tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code dispbit[4]={0x7f,0xbf,0xcf,0xef}; // 高4位进行段选择,每次选择一个数码管
unsigned char disbuf[4];
void delayms(unsigned int ms)
{
unsigned int a,b,c;
for(a=2;a>0;a--)
for(b=46;b>0;b--)
for(c=ms;c>0;c--);
}
void Led_Disp()
{
unsigned char i;
for(i=0;i<4;i++)
{
P2 = dispbit[i];
P3 = Disp_Tab[disbuf[i]];
delayms(1);
P3 = 0xff;//关闭显示
}
}
main()
{
int firstdat=17;
int seconddat=1;
while(1)
{
disbuf[0]=((firstdat&0xf0)>>4)&0x0f;//
disbuf[1]=firstdat&0x0f; //
disbuf[2]=((seconddat&0xf0)>>4;//
disbuf[3]=seconddat&0x0f;//
Led_Disp();
/*
P2 = 0x0f;
P0 = 0x06;
delay(600);
P2 = 0xf0;
P0 = 0x07;
delay(600);
*/
}