- /***********74HC595動態掃描4位數碼管************/
- //MCU:AT89S52RC
- //晶振:11.0592M.
- //采用4位數碼管
- /***************************************************/
- #include<reg51.h>
- #include <INTRINS.H>
- #define uint unsigned int
- #define uchar unsigned char
- #define nop() _nop_();_nop_();
- sbit CLK=P2^0; //74HC595的11引腳
- sbit DAT=P2^1; //74HC595的14引腳
- sbit RCLK=P2^2; //74HC595的12引腳
- sbit CS1=P2^3; //數碼管段位COM1(公共端)即數碼管的12腳
- sbit CS2=P2^4; //數碼管段位COM2(公共端)即數碼管的9腳
- sbit CS3=P2^5; //數碼管段位COM3(公共端)即數碼管的8腳
- sbit CS4=P2^6; //數碼管段位COM4(公共端)即數碼管的6腳
- //本程序支持4位共陽和共陰數碼管(包插四位時鐘)可根據你的數碼管是共陰還是共陽,開啟下面匹配的tab[]
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F 全亮 全滅
- //uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00,0xff}; //共陽數碼管 不顯示0xff 全亮0x00 只顯示點0x7f
- uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff,0x00}; //共陰數碼管 不顯示0x00 全亮0xff 只顯示點0x80
- uchar t;
- uchar count = 0;
- /* //延時函數
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- */
- //寫數碼管函數
- void write595(unsigned char word,uchar k1)
- {
- uchar num,c; //變量
- if(k1==1){ //如果k1的值為1,則點亮時鐘數碼管的:點(如果是普通的四位數碼管,則點亮第二位的小數點)
- num=tab[word]|0x80; //關鍵就在|0x80
- } else {
- num=tab[word];
- }
- //循環8個LED
- for(c=0;c<8;c++)
- {
- CLK=0;
- DAT=num&0x80;
- num=num<<1;
- CLK=1;
- }
- RCLK=0;
- //nop();
- //nop();
- RCLK=1;
- }
- void select1(void)
- { //第一位數碼管
- CS1=0;
- CS2=1;
- CS3=1;
- CS4=1;
- }
- void select2(void)
- { //第二位數碼管
- CS1=1;
- CS2=0;
- CS3=1;
- CS4=1;
- }
- void select3(void)
- { //第三位數碼管
- CS1=1;
- CS2=1;
- CS3=0;
- CS4=1;
- }
- void select4(void)
- { //第四位數碼管
- CS1=1;
- CS2=1;
- CS3=1;
- CS4=0;
- }
- void init() //啟動定時器
- {
- TMOD=0X01;
- TH0=(65535-46080)/256;
- TL0=(65535-46080)%256;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void T0_time() interrupt 1 //定時器
- {
- if (count == 20) {
- t++;
- count = 0;
- } else {
- ++count;
- }
- }
- int main(void) //主程序
- {
- //unsigned char i;
- init(); //啟動定時器
- while(1)
- { //無限循環
- if(t>9) {t=0;} //當t>9,則初始為0
- write595(t,0); //要寫的值
- select1(); //顯示第一位數碼管
- //for(i=0;i<10;i++) _nop_();
- write595(t+1,1); //要寫的值
- select2(); //顯示第二位數碼管
- write595(t+2,0); //要寫的值
- select3(); //顯示第三位數碼管
- write595(t+3,0); //要寫的值
- select4(); //顯示第四位數碼管
- }
- }
復制代碼
|