新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 兩片74HC595級聯動態驅動8位數碼管 51單片機

        兩片74HC595級聯動態驅動8位數碼管 51單片機

        作者: 時間:2016-11-25 來源:網絡 收藏
        功能 : 用2片74HC595驅動8位數碼管, 級聯的最低1片595控制位選,那么第一片控制段選

        時間 : 2013-3-28 21:11:59
        作者 : Stone
        版本 : REV1
        平臺 : STC89C52 11.0592MHz
        現象 : 8位數碼管從第一位開始從0計數,滿10進位
        版本說明 : 第0版本沒有使用定時器中斷,同時定義了一個 unsigned long int 變量計數
        再把這個數的每位分離出來顯示,所以導致有點閃屏,此版本使用定時器中斷,
        而且沒有用 unsigned long int 之類的變量,而是用數組 Val[8] 來計數,
        主函數只負責顯示,其它的在中斷函數里面處理,這樣顯示一點都不閃屏,
        備注 : 可以用 ULN2003A 接在數碼管的 com 口來提高驅動能力,ULN2003A里面有7個NPN三極管,
        可以大大提高驅動能力

        本文引用地址:http://www.104case.com/article/201611/321351.htm


        #include


        sbit SCK = P1^1; // 數據輸入時鐘線,脈沖
        sbit SI = P1^0; // 數據線
        sbit RCK = P1^2; // 鎖存

        unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 段碼
        unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位選
        unsigned char Val[8] = {0}; // 要顯示的數據


        ************************ 函數聲明 ************************
        void interrupt_init(void);
        void timer_init(void);

        控制74HC595輸出數據
        void Output(void)
        {
        RCK = 0;
        RCK = 1;
        }

        向74HC595中寫入一字節數據
        void Write_Byte(unsigned char dat)
        {
        unsigned char i = 0;

        for(i=0; i<8; i++)
        {
        SCK = 0;
        SI = dat & 0x80;
        SCK = 1;

        dat <<= 1;
        }
        }

        顯示函數

        void Display(unsigned char * p)
        {
        unsigned char * pt = Wei;

        Write_Byte(*(pt+0));
        Write_Byte(SMG[*(p+7)]);
        Output();

        Write_Byte(*(pt+1));
        Write_Byte(SMG[*(p+6)]);
        Output();

        Write_Byte(*(pt+2));
        Write_Byte(SMG[*(p+5)]);
        Output();

        Write_Byte(*(pt+3));
        Write_Byte(SMG[*(p+4)]);
        Output();

        Write_Byte(*(pt+4));
        Write_Byte(SMG[*(p+3)]);
        Output();

        Write_Byte(*(pt+5));
        Write_Byte(SMG[*(p+2)]);
        Output();

        Write_Byte(*(pt+6));
        Write_Byte(SMG[*(p+1)]);
        Output();

        Write_Byte(*(pt+7));
        Write_Byte(SMG[*(p+0)]);
        Output();

        }

        int main(void)
        {
        timer_init();
        interrupt_init();

        while(1)
        {
        Display(Val);
        }

        return 0;
        }

        void interrupt_init(void)
        {
        EA = 1;//開總中斷
        ET0 = 1;//開定時器0中斷
        ET1 = 1;//開定時器1中斷
        }

        void timer_init(void)
        {
        TMOD = TMOD | 0x01;//定時器0工作方式1
        TMOD = TMOD & 0xFD;

        TH0 = 0x4B;//裝初值,50ms計數
        TL0 = 0xFF;

        TR0 = 1;//開啟定時器0
        }

        void timer0() interrupt 1
        {
        static unsigned char counter0 = 0;
        counter0++;
        TH0 = 0x4B;//重新裝入初值,定時器0從頭開始計數,計數50ms
        TL0 = 0xFF;

        if(2 == counter0)//2*50 ms = 100ms = 0.1s
        {
        counter0 = 0;//counter0置零,定時器0從頭開始計數

        Val[0]++;
        if(10==Val[0])
        {
        Val[0] = 0;
        Val[1]++;

        if(10==Val[1])
        {
        Val[1] = 0;
        Val[2]++;

        if(10==Val[2])
        {
        Val[2] = 0;
        Val[3]++;

        if(10==Val[3])
        {
        Val[3] = 0;
        Val[4]++;

        if(10==Val[4])
        {
        Val[4] = 0;
        Val[5]++;

        if(10==Val[5])
        {
        Val[5] = 0;
        Val[6]++;

        if(10==Val[6])
        {
        Val[6] = 0;
        Val[7]++;

        if(10==Val[7])
        {
        Val[7] = 0;
        }
        }
        }
        }
        }
        }
        }
        }
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 公主岭市| 视频| 衡山县| 和顺县| 罗城| 玉林市| 罗定市| 海原县| 双流县| 建平县| 板桥市| 新民市| 阳谷县| 门源| 临猗县| 迁西县| 柳河县| 石林| 宝鸡市| 昌宁县| 涞源县| 阿坝县| 沂水县| 邓州市| 中江县| 望江县| 桦南县| 新和县| 当雄县| 瑞金市| 涿鹿县| 阜阳市| 理塘县| 漾濞| 卢湾区| 梁河县| 安图县| 平阴县| 平昌县| 南郑县| 通许县|