#include "stc12le5a60s2.h"
//共阴数码管段码表
unsigned char code DispCode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
// 0 1 2 3 4 5 6 7 8 9
0x77,0x7C,0x39,0x5E,0x79,0x71,0x3D,0x76,0x74,0x30,
// A b C d E F G H h I
0x10,0x1E,0x38,0x54,0x5C,0x73,0x67,0x50,0x31,0x78,
// i J L n o P q r R t
0x3E,0x1C,0x40,0x48,0x08,0x00,0xff};
// U V 一 二 _ 灭
//HC595接口定义
sbit HC595_DAT = P4^4; //HC595串行数据线
sbit HC595_SCK = P4^5; //HC595移位时钟线
sbit HC595_RCK = P4^6; //HC595锁存时钟线
sbit HC595_OE = P3^7; //HC595输出允许线
//端口操作定义
#define SET 1 //高电平
#define CLR 0 //低电平
//端口操作
#define HC595_DAT_Clr() {HC595_DAT=CLR;}
#define HC595_DAT_Set() {HC595_DAT=SET;}
#define HC595_SCK_Clr() {HC595_SCK=CLR;}
#define HC595_SCK_Set() {HC595_SCK=SET;}
#define HC595_RCK_Clr() {HC595_RCK=CLR;}
#define HC595_RCK_Set() {HC595_RCK=SET;}
#define HC595_OE_Clr() {HC595_OE=CLR;}
#define HC595_OE_Set() {HC595_OE=SET;}
//函数声明
void Delay_ms(unsigned int ms);
void HC595_Init(void);
void HC595_SendWord(unsigned char dis,unsigned char dig);
int cout=0,miao=11,min=17,hour=10,*p;
int i[]={1,2,3,4,5,6,7,8};
//主方法
void main(void)
{
unsigned char x;
HC595_Init();
TMOD=0x10;
TH1=0x4B;
TL1=0xFF;
TR1=1;
*p=i; //HC595初始化
while(1)
{
for(x=0;x<8;x++) //将37个段码全部显示出来
{
//将待显示的字型码和点亮的数码管号送至锁存器。
//由于是共阴数码管,将八段数码管共阴极拉低,显示数据。
HC595_SendWord(DispCode[i[x]],~(0x01<
Delay_ms(500); //延时0.5秒
}
}
}
/***********************************************
函数名称:HC595_SendWord
功 能:HC595发送两个字节数据。
入口参数:dis:显示的字型码
dig:点亮的数码管号 dig中为0的位,则对应的数码管点亮
返 回 值:无
备 注:两片HC595,发送两个字节数据,高字节
为数码管段码,低字节为选择点亮哪个数码管。
该程序点亮数码管可以结合原理图来看,
否则不好理解,和电路原理关系密切。
************************************************/
void HC595_SendWord(unsigned char dis,unsigned char dig)
{
unsigned char i; //定义计数器
unsigned int temp=0; //定义数据变量
//将两个8位变量合并成一个16字节变量
temp=dis;
temp=temp<<8 | dig;
HC595_OE_Set(); //禁止显示
//送出数据
for(i=0;i<16;i++)
{
HC595_SCK_Clr(); //置低时钟线
if( (temp&0x8000)==0x8000 )//先发送高字节
{
HC595_DAT_Set(); //置高信号线
}
else
{
HC595_DAT_Clr(); //置低信号线
}
HC595_SCK_Set(); //置高时钟线
temp<<=1; //数据左移
}
//锁存信号上升沿锁存数据
HC595_RCK_Clr();
HC595_RCK_Set();
HC595_OE_Clr(); //输出允许,开始显示
}
/***********************************************
函数名称:HC595_Init
功 能:显示初始化函数
入口参数:无
返 回 值:无
备 注:单片机P4口默认不使用,如需启用,
需软件设置。
************************************************/
void HC595_Init(void)
{
Delay_ms(10); //等待HC595上电稳定
P4SW |=0x70; //使用P4口
//将端口置高,赋予端口固定电平
HC595_DAT_Set();
HC595_SCK_Set();
HC595_RCK_Set();
//输出允许,开始显示
HC595_OE_Clr();
}
/***********************************************
函数名称:Delay_ms
功 能:STC 1T单片机1ms延时程序
入口参数:ms:延时的毫秒数
返 回 值:无
备 注:示波器实测1.05ms 外部时钟11.0592MHz
************************************************/
void Delay_ms(unsigned int ms)
{
unsigned int i;
while( (ms--) != 0)
{
for(i = 0; i < 600; i++);
}
}
void time1(void) interrupt 1
{
TH1=0x4B;
TL1=0xFF;
cout++;
if(cout==20)
{
cout=0;
miao++;
if(miao==60)
{ miao=0;
min++;
if(min==60)
{ min=0;
hour++;
if (hour==12)
{ hour=0;
}
}
}
} i[0]=miao/10;
i[1]=miao%10;
i[2]=min/10;
i[3]=min%10;
i[4]=hour/10;
i[5]=hour%10;
}