/*--------------------------------------------------------------------------------
★★ 標準串口和模擬串口4位74hc595動態數碼管顯示程序 ★★
1.CPU :16F873單片機 晶振4MHz
2.在proteus上仿真通過,4位數碼管動態掃描計數,非常的實用。
3. 測試時將部分語句屏蔽
4. 74hc595與164的差別在于有數據存儲器,控制端為1時數據才能被傳出
5.日期:2007-11-11
6.所有代碼以及仿真文件請點此出下載http://www.zg4o1577.cn/ziliao/file/16f87_595.rar
---------------------------------------------------------------------------------*/
#include <pic.h>
#include <pic1687x.h>
__CONFIG(WDTDIS & HS & UNPROTECT);
unsigned char dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共陰極字型碼
unsigned char distab[4]={ 0xf7, 0xfb, 0xfd, 0xfe}; //要顯示的位
unsigned char disbuf[4];
bit DAT @ (unsigned)&PORTC*8+5; //絕對尋址位操作指令:對應bit0~7共8位
bit CLK @ (unsigned)&PORTC*8+3;
bit ST_CP @ (unsigned)&PORTC*8+2; //bit2
//#define DAT RC5;
//#define CLK RC3;
//#define ST_CP RC2;
unsigned char data;
//1ms延時子程序//
void delay(unsigned char ms_delay)
{
unsigned int count=100*ms_delay;
while(--count)
{;}
}
//模擬串口//
/*
void send(unsigned char da)
{
unsigned char k;
for(k=0;k<8;k++)
{
DAT=da&0x01;//從低位開始逐一移出(與線路有關,這是段A對應QG),595的時序是從D0逐步到D7.移完8次后整體再向下(bit)
da>>=1;
CLK=0;
CLK=1;
}
} */
//顯示函數,先分離再顯示//
void display(unsigned int tmp)
{
unsigned char i;
disbuf[0]=tmp%10;
tmp/=10;
disbuf[1]=tmp%10;
tmp/=10;
disbuf[2]=tmp%10;
disbuf[3]=tmp/10;
for(i=0;i<4;i++)
{
if(SSPIF)SSPIF=0; //等待發送完畢
ST_CP=0;
// send(dispcode[disbuf[i]]); //模擬串口
SSPBUF=dispcode[disbuf[i]]; //標準串口
delay(1); //不加延時標準串口千位變個位
ST_CP=1; //最后給鎖存信號,代表顯示任務完成
PORTB=distab[i];
delay(1); //決定刷新頻率
PORTB=PORTB|0xff; //傳完后關閉當前顯示位(不然顯示不全),同時不影響沒有用到的端口
}
}
//主函數51hei.com提供//
void main()
{
unsigned int k;
TRISC=0; //兩種定義方式
// TRISC3=0; //SCK時鐘輸出引腳。
//TRISC5=0; //串行數據輸出引腳。
TRISB=0;
//SSPIE=1; //這些是中斷有關的
//GIE=1;
//PEIE=1;
PIR1=0; //清SPI標志
//INTCON=0x00; //*關閉所有中斷*/
SSPSTAT=0xc0; //SCK上跳沿數據傳送。
SSPCON=0x20; //主控方式,空閑時時鐘為低電平,時鐘為:Fosc/4,模擬、標準分開
for(k=0;k<9999;k++)
{
delay(40);
display(k);
}
}
//串口中斷//
/*
void interrupt recceive_sth (void)
{
SSPIF=0;
}*/