此种方式与595连级都采用读表方式(读取数组中的段码表和位选表)进行数据读取。
在这里译码器做位选器,595做段选器,两者分别配有“段码表”和“位选表”;
两者根据显示函数的内容,从表中读取数据后传输至数码管进行显示。
(相关资料图)
附件“主程序代码附注”
*********************************************************************************************************
#include<STCXXXX.H>
u8 a,b,c,d,e,f,g,i,j;
u32 num,HG,HS,FG,FS,MG,MS;
sbit SCK = P3^2;//数据时钟
sbit RCK = P3^5;//锁存时钟
sbit SI = P3^4; //数据信号
sbit A0 = P4^0;
sbit A1 = P5^5;
sbit A2 = P4^4;
code Data1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //段码数据发送给595
code Data2[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //位选数据发送给38译码器(时-分-秒)
void Gun(u8 c) //驱动595硬件
{
a = Data1[c];
for(b=0;b<8;b++) //参数已用:a,b,c
{
SI = a&0x80;
SCK = 0;
SCK = 1;
a=a << 1;//595拉栓炮,拉for栓装弹,弹容量8发
}
RCK=0; //锁存器扳机,并行炮,一炮射八发
RCK=1;
}
void YMQ138(u8 e) //驱动38译码器硬件
{
d=Data2[e];
A0 = d&0x01; //参数已用:d,e
A1 = (d&0x02)>>1;
A2 = (d&0x04)>>2; //38读表机
}
void Delay5ms() //延时
{
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
void main()
{
P0M0=0X00;P0M1=0X00; //配置I/O口,做初始化,模式:“双向口”
P1M0=0X00;P1M1=0X00;
P2M0=0X00;P2M1=0X00;
P3M0=0X00;P3M1=0X00;
P4M0=0X00;P4M1=0X00;
TMOD=0X01; //定时器初始化
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1; //此刻,定时器已开启!
while(1) //while循环-展示数码管动态扫描
{
YMQ138(0); //38译码器的数组控制函数(控位选)
Gun(MG); //595的数组段选控制函数(控段选)
Delay5ms(); //延时函数给予显示延时
Gun(10); //595锁存数据清空
YMQ138(1);
Gun(MS);
Delay5ms();
Gun(10);
YMQ138(2);
Gun(11);
Delay5ms();
Gun(10);
YMQ138(3);
Gun(FG);
Delay5ms();
Gun(10);
YMQ138(4);
Gun(FS);
Delay5ms();
Gun(10);
YMQ138(5);
Gun(11);
Delay5ms();
Gun(10);
YMQ138(6);
Gun(HG);
Delay5ms();
Gun(10);
YMQ138(7);
Gun(HS);
Delay5ms();
Gun(10);
HS=num/3600%24/10;// "num"定时器参数-链接显示与定时器
HG=num/3600%24%10;//时
FS=num%3600/60/10;
FG=num%3600/60%10;//分
MS=num%60/10;
MG=num%60%10; //秒
}
}
void T0_time() interrupt 1 //中断
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
f++;
if(f==20)
{
f=0; //已用参数f
num++;
}
}
关键词: