怎样只显示动态数码管的有效位?高位零不显示。。。
sbit ADD0 = P2^0;
sbit ADD1 = P2^1;
sbit ADD2 = P2^2;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
uint8 code ledchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint8 shuchar[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
uint8 i;
uint16 ci;
uint32 shu;
void main()
{
EA=1;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
ET0=1;
TR0=1;
while(1)
{
if(ci>=1000)
{
ci=0;
shu++;
shuchar[0]=ledchar[shu%10];
shuchar[1]=ledchar[shu/10%10];
shuchar[2]=ledchar[shu/100%10];
shuchar[3]=ledchar[shu/1000%10];
shuchar[4]=ledchar[shu/10000%10];
shuchar[5]=ledchar[shu/10000%10];
}
}
}
void InterruptTimer0() interrupt 1
{
TH0=0xFC;
TL0=0x67;
ci++;
P0=0xFF;
switch(i)
{
case 0:ADD0=1;ADD1=1;ADD2=1;i++;P0=shuchar[0];break;
case 1:ADD0=0;ADD1=1;ADD2=1;i++;P0=shuchar[1];break;
case 2:ADD0=1;ADD1=0;ADD2=1;i++;P0=shuchar[2];break;
case 3:ADD0=0;ADD1=0;ADD2=1;i++;P0=shuchar[3];break;
case 4:ADD0=1;ADD1=1;ADD2=0;i++;P0=shuchar[4];break;
case 5:ADD0=0;ADD1=1;ADD2=0;i=0;P0=shuchar[5];break;
default:break;
}
}
以下内容来源于《51单片机轻松入门-基于STC15W4K系列》
例12.5 动态显示的秒计数器(整数有效数值前面的0消隐)
在例12.4的数据显示过程中,整数有效数值前面的0都会被点亮,通常是不符合实际使用要求的,本例中判断整数有效位前数值是否为0,若位0则让段码输出口输出0xFF,使对应位数码管不显示,本例只能对整数有效数值前面的0消隐,小数有效数值前面的0消隐将在12章“精密电压表\通用显示器\计数器制作”部分展示完整产品的实例,本例在上例的基础上主要增加了如下代码。
#define Hidden 16 // 高位消隐码在数据表中的位置,DispTab[15]=0xff
void DataProcessing() // 数据处理函数
{
unsigned char tmp[6]; // 最高位tmp[5],最低位 tmp[0]
tmp[0] = sec%10; // 16进制转BCD码(个位)
tmp[1] = sec/10%10; // 16进制转BCD码(十位)
tmp[2] = sec/100%10; // 16进制转BCD码(百位)
tmp[3] = sec/1000%10; // 16进制转BCD码(千位)
tmp[4] = sec/10000%10; // 16进制转BCD码(万位)
tmp[5] = sec/100000%10; // 16进制转BCD码(十万位)
if (tmp[5]==0) DispBuf[5] = Hidden; // 十万位消隐
else DispBuf[5]= tmp[5];
if ((tmp[5]==0)&&(tmp[4]==0))DispBuf[4]= Hidden; // 万位消隐
else DispBuf[4]= tmp[4];
if((tmp[5]==0)&&(tmp[4]==0)&&(tmp[3]==0)) DispBuf[3]= Hidden; // 千位消隐
else DispBuf[3]= tmp[3];
if((tmp[5]==0)&&(tmp[4]==0)&&(tmp[3]==0)&&(tmp[2]==0))DispBuf[2]= Hidden; //百位消隐
else DispBuf[2]= tmp[2];
if((tmp[5]==0)&&(tmp[4]==0)&&(tmp[3]==0)&&(tmp[2]==0)&&(tmp[1]==0))DispBuf[1]= Hidden; // 十位消隐
else DispBuf[1] = tmp[1];
DispBuf[0] = tmp[0]; // 最低位显示
}
12.3 独立键盘
#include <reg52.h>
sbit ADD0 = P2^0;
sbit ADD1 = P2^1;
sbit ADD2 = P2^2;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
uint8 code ledchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint8 shuchar[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
uint8 i;
uint16 ci;
uint32 shu;
void main()
{
EA=1;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
ET0=1;
TR0=1;
while(1)
{
if(ci>=1000)
{
ci=0;
shu++;
shuchar[0]=ledchar[shu%10];
shuchar[1]=ledchar[shu/10%10];
shuchar[2]=ledchar[shu/100%10];
shuchar[3]=ledchar[shu/1000%10];
shuchar[4]=ledchar[shu/10000%10];
shuchar[5]=ledchar[shu/10000%10];
}
}
}
void InterruptTimer0() interrupt 1
{
TH0=0xFC;
TL0=0x67;
ci++;
P0=0x00;
switch(i)
{
case 0: ADD0=1;ADD1=1;ADD2=1;i++;P0=shuchar[0];break;
case 1:
if(shuchar[1]==ledchar[0])shuchar[1]=0x00;
else
{ ADD0=0;ADD1=1;ADD2=1;P0=shuchar[1];}
i++;
break;
case 2:
if(shuchar[2]==ledchar[0])shuchar[2]=0x00;
else {ADD0=1;ADD1=0;ADD2=1;P0=shuchar[2];}
i++;break;
case 3:
if(shuchar[3]==ledchar[0])shuchar[3]=0x00;
else
{ADD0=0;ADD1=0;ADD2=1;P0=shuchar[3];}
i++;break;
case 4:
if(shuchar[4]==ledchar[0])shuchar[4]=0x00;
else
{ADD0=1;ADD1=1;ADD2=0;P0=shuchar[4];}
i++;break;
case 5:
if(shuchar[5]==ledchar[0])shuchar[5]=0x00;
else
{ADD0=0;ADD1=1;ADD2=0;P0=shuchar[5];}
i=0;break;
default:break;
}
}
#include <reg52.h>
sbit ADD0 = P2^0;
sbit ADD1 = P2^1;
sbit ADD2 = P2^2;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
uint8 code ledchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint8 shuchar[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
uint8 i;
uint16 ci;
uint32 shu;
void main()
{
char i;
uint8 buf[6];//中间转换缓冲区
EA=1;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
ET0=1;
TR0=1;
while(1)
{
if(ci>=1000)
{
ci=0;
shu++;
buf[0] = sec%10;
buf[1] = sec/10%10;
buf[2] = sec/100%10;
buf[3] = sec/1000%10;
buf[4] = sec/10000%10;
buf[5] = sec/100000%10;
for(i=5;i>=1;i--) //从最高为开始,遇到0不显示,遇到非0退出循环
{
if(buf[i] == 0)
shuchar[i] = 0xFF;
else
break;
}
//将剩余的有效数字位如实转换
for( ;i>=0;i--) /for()起始未对j操作,j即保持上个循环结束时的值
{
shuchar[i] =ledchar[buf[i]];
}
}
}
void InterruptTimer0() interrupt 1
{
TH0=0xFC;
TL0=0x67;
ci++;
P0=0xFF;
switch(i)
{
case 0:ADD0=1;ADD1=1;ADD2=1;i++;P0=shuchar[0];break;
case 1:ADD0=0;ADD1=1;ADD2=1;i++;P0=shuchar[1];break;
case 2:ADD0=1;ADD1=0;ADD2=1;i++;P0=shuchar[2];break;
case 3:ADD0=0;ADD1=0;ADD2=1;i++;P0=shuchar[3];break;
case 4:ADD0=1;ADD1=1;ADD2=0;i++;P0=shuchar[4];break;
case 5:ADD0=0;ADD1=1;ADD2=0;i=0;P0=shuchar[5];break;
default:break;
}
谢谢
还是蛮有用的
谢谢
还是蛮有用的
这是错误的
为什么我的积分不够了?
