四位數碼管使用的是兩個74hc595
#include<reg52.h>
#include<intrins.h>
sbit Echo= P3^3;
sbit Trig= P3^2;
unsigned int time=0;
typedef unsigned char uchar;
typedef unsigned int uint;
/**********函數聲明********************/
void SendTo595(uchar byteData);
void xianshi(uint shu);
/***********************************/
sbit DS = P3^1; //p3.4串行數據輸入 DS
sbit SH_CP = P3^0; //串行輸入時鐘,上升沿有效
sbit ST_CP = P3^5; //串行寄存器時鐘,上升沿有效
char code DISP[] = {0xf5, 0x05, 0xb3, 0x97, 0x47, 0xd6, 0xf6, 0x85, 0xf7,0xd7};
char code QQ[]={0x70,0xb0,0xd0,0xe0};
uchar j;//顯示時間
uint S=0;
//uint q;
void delay(uint z)//延時1ms
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<114;y++)
{
}
}
}
void timer0 (void) interrupt 1
{
for(S=9900;S<9999;S++){xianshi(S);}
}
void Time_Init()
{
TMOD=0x01; //設T0為方式1,GATE=1;
TH0=0;
TL0=0;
ET0=0;
EA=1;
TR0 = 0;
}
void main()
{
Time_Init();
//for(S=0;S<9999;S++){xianshi(S);}
Trig=1; //啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
Echo=1;
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100;//算出來是CM(time*1.87)/100;
xianshi(S);
}
//發送一個字節數據給595再并行輸出
void SendTo595(uchar Data)
{
char i;
/*for(i=0;i<8;i++)
{
SH_CP = 0;
DS=0x80&Data1;//&為按位運算符,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個式子為0
Data1=_crol_(Data1,1); //左移一位 將高位補給低位,如果二進制數為01010101 那么_crol_(1) 為10101010
SH_CP = 1; //上升沿讓串行輸入時鐘變成高電平 并延時一個時鐘周期
_nop_();
}
*/
for(i=0;i<8;i++)
{
SH_CP = 0;
DS=0x80&Data;//&為按位運算符,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個式子為0
Data=_crol_(Data,1); //左移一位 將高位補給低位,如果二進制數為01010101 那么_crol_(1) 為10101010
SH_CP = 1; //上升沿讓串行輸入時鐘變成高電平 并延時一個時鐘周期
_nop_();
}
/* ST_CP = 0;
_nop_();
位移寄存器完畢,轉移到存儲寄存器
ST_CP = 1; //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
_nop_();
_nop_();
*/
}
void xianshi(uint shu)
{
uint qian;
uint bai;
uint shi;
uint ge;
qian=shu/1000;
bai=(shu-(qian*1000))/100;
shi=(shu-(qian*1000)-(bai*100))/10;
ge=shu-(qian*1000)-(bai*100)-(shi*10);
//SendTo595(QQ[3]);
//SendTo595(DISP[0]);
//SendTo595(DISP[1]);
//delay(4000);
//SendTo595(DISP[2]);
//SendTo595(DISP[0]);
/* for(j=0;j<4;j++)
{
for(k=0;k<10;k++)
{}}*/
for(j=0;j<20;j++)
{
SendTo595(QQ[0]);
SendTo595(DISP[ge]);
ST_CP = 0;
_nop_();
//位移寄存器完畢,轉移到存儲寄存器
ST_CP = 1; //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
_nop_();
// _nop_();
delay(5);
SendTo595(QQ[1]);
SendTo595(DISP[shi]);
ST_CP = 0;
_nop_();
//位移寄存器完畢,轉移到存儲寄存器
ST_CP = 1; //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
_nop_();
// _nop_();
delay(5);
SendTo595(QQ[2]);
SendTo595(DISP[bai]);
ST_CP = 0;
_nop_();
//位移寄存器完畢,轉移到存儲寄存器
ST_CP = 1; //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
_nop_();
// _nop_();
delay(5);
SendTo595(QQ[3]);
SendTo595(DISP[qian]);
ST_CP = 0;
_nop_();
//位移寄存器完畢,轉移到存儲寄存器
ST_CP = 1; //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
_nop_();
// _nop_();
delay(5);
}
}
|