要达到单片机数码管轮流显示的效果,不但要控制哪一个数码管显示,还要控制此数码管显示什么内容,因此我们引入两个table分别对位选和段选进行编码放入这2个table,再利用下标就可以来同时控制位选和段选信号了.
源代码如下,产生的效果是:四个数码管轮流显示1-9
源代码如下,产生的效果是:四个数码管轮流显示1-9
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led2=P0^0;
sbit led3=P0^1;
sbit led4=P0^2;
sbit led5=P0^3;
sbit sda=P1^0;
sbit clk=P1^1;
sbit dig1=P1^2;
sbit dig2=P1^3;
sbit dig3=P1^4;
sbit dig4=P1^5;
uchar code table_dig[]={0x38,0x34,0x2c,0x1c};
uchar code table_num[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde};
uchar code table[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde};
uint dig,num,times;
void write164(uchar);
void delay(uchar t);
void main()
{
/** LED的显示 **/
led2=0;
led3=1;
led4=0;
led5=1;
/** 定时器操作 **/
TMOD=0x01;//定时器模式1,16位定时
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开中断
ET0=1;
TR0=1;//定时器开始计时
dig=0;
num=0;
times=0;
while(1)
{
if(times==20)
{
times = 0; //这一步很重要,少了会出一些奇怪的问题的
write164(table_num[num]);
num++;
if(num==10)
num=0;
//delay(100);
P1=table_dig[dig];
dig++;
if(dig==4)
dig=0;
}
}
}
/** 延迟函数 **/
void delay(uchar t)
{
uchar x,y;
for(x=t;x>0;x--)
for(y=101;y>0;y--);
}
/** 向锁存器写入一个字节数据 **/
void write164(uchar b)
{
uchar temp = b;
uint i;
for(i=0;i<8;i++)
{
clk=1;
sda = temp & 0x80;
clk=0;
temp = temp << 1;
}
}
/** 定时器中断函数 **/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times ++ ;
}