/*--------------------------------------------------------------------------------
★★ 标准串口和模拟串口4位74hc595动态数码管显示程序 ★★
1.CPU :16F873单片机 晶振4MHz
2.在proteus上仿真通过,4位数码管动态扫描计数,非常的实用。
3. 测试时将部分语句屏蔽
4. 74hc595与164的差别在于有数据存储器,控制端为1时数据才能被传出
5.日期:2007-11-11
6.所有代码以及仿真文件请点此出下载http://www.51hei.com/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;
}*/