- #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();
- }
復制代碼
|