8位数码管显示(译码器-595方式)
来源:哔哩哔哩时间:2023-04-30 01:10:12

此种方式与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++;

}

}

关键词: