- #include <reg51.H>
- sbit P_HC595_SER = P2^0;
- sbit P_HC595_SRCLK = P2^1;
- sbit P_HC595_RCLK = P2^2;
- unsigned char code table[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char code wela[]={
- 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned char data dis_buf[8]; //缓存数组
- unsigned int Cnt_ms=0,Cnt_s=9999;
- /**************** 初始化定时器0函数 ******************/
- void Timer0Init(void) //1毫秒@12.000MHz
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x18; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1;
- EA = 1;
- }
- /**************** 向HC595发送一个字节函数 ******************/
- void Send_595(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- dat <<= 1;
- P_HC595_SER = CY; //溢出位赋值数据输出端
- P_HC595_SRCLK = 1; //移位时钟
- P_HC595_SRCLK = 0;
- }
- }
- /**************** 向HC595发送2个字节驱动码 ******************/
- void DisplayScan(void)
- {
- static unsigned char i;
- Send_595(wela[i]);//向HC595发送位码
- Send_595(dis_buf[i]);//向HC595发送段码
- P_HC595_RCLK = 1;//锁存输出数据
- P_HC595_RCLK = 0;
- i=++i%4;
- }
- void main()
- {
- P_HC595_SRCLK = 0;//初始化移位时钟端
- P_HC595_RCLK = 0;//初始化锁存输出端
- Timer0Init();
- while(1)
- {
- dis_buf[0]=table[Cnt_s/1000%10];
- dis_buf[1]=table[Cnt_s/100%10];
- dis_buf[2]=table[Cnt_s/10%10];
- dis_buf[3]=table[Cnt_s%10];
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TL0 = 0x18; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- if(++Cnt_ms>=1000)
- {
- Cnt_ms=0;
- if(Cnt_s>0)Cnt_s--;
- }
- DisplayScan();
- }
复制代码
|