新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > CEPARK AVR單片機 之HC595驅動數碼管顯示

        CEPARK AVR單片機 之HC595驅動數碼管顯示

        作者: 時間:2016-11-22 來源:網絡 收藏
        這里我用的CEPARK 的M64 AVR開發板,這一課的重點是學會如何使用74HC595來驅動數碼管。

        74HC595是具有8位移位寄存器和一個存儲器,三態輸出功能。移位寄存器和存儲器是分別的時鐘。數據在SHcp的上升沿輸入,在STcp的上升沿進入的存儲寄存器中去。如果兩個時鐘連在一起,則移位寄存器總是比存儲寄存器早一個脈沖。移位寄存器有一個串行移位輸入(Ds),和一個串行輸出(Q7’),和一個異步的低電平復位,存儲寄存器有一個并行8位的,具備三態的總線輸出,當使能 OE時(為低電平),存儲寄存器的數據輸出到總線。

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

        引腳說明:
        QA--QH: 八位并行輸出端,可以直接控制數碼管的8個段。

        QH: 級聯輸出端。我將它接下一個595的SI端。

        SER(DS): 串行數據輸入端。

        74595的控制端說明:

        /SCLR(MR)(10腳): 低點平時將移位寄存器的數據清零。通常我將它接Vcc。

        SCK(SHCP)(11腳):上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數據不變。(脈沖寬度:5V時,大于幾十納秒就行了。我通常都選微秒級)

        RCK(STCP)(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將RCK置為低電平,當移位結束后,在RCK端產生一個正脈沖(5V時,大于幾十納秒就行了。我通常都選微秒級),更新顯示數據。

        /G(OE)(13腳): 高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。

        注:74164和74595功能相仿,都是8位串行輸入轉并行輸出移位寄存器。74164的驅動電流(25mA)比74595(35mA)的要小,14腳封裝,體積也小一些。

        74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串行速度慢的場合很有用處,數碼管沒有閃爍感。

        與164只有數據清零端相比,595還多有輸出端時能/禁止控制端,可以使輸出為高阻態。
        注明:74HC595引腳命名我現在看到兩種,如串行數據輸入端(14腳)有的Datasheet上叫SER,還有一種叫DS。不過這都沒有關系,只是名字不一樣,大家看這些文檔時,注意點就行。

        大家這里只要注意11,12,14這三個引腳由單片機的哪幾個口控制就好。

        SHCP(11)-----------PG0

        STCP(12)-----------PG1

        DS(14)-------------PG2

        下面是源程序:
        效果:第一位和第二位數碼管顯示5;

        #include <avr/io.h>

        #include

        #define SER_PORT PORTG //PG口

        #define SER_DATA PG2 //DS,串行數據入口

        #define SER_RCK PG1 //STCP,來一個上升沿時數據進入并行輸出

        #define SER_SCK PG0 //SHCP,來一個上升沿時數據移位

        unsigned char Led_Disbuf[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共陽極

        void Send_Byte_HC595(unsigned char byte) //并行數據移位輸出函數

        { //byte是表示我們想哪一位數碼管亮,如為0x01,表示第一個數碼管亮

        unsigned char i; //循環變量

        for(i = 0;i < 8;i++)

        {

        if(byte & 0x80)

        {

        SER_PORT |= _BV(SER_DATA); //PG2輸出1

        }

        else

        {

        SER_PORT &= ~_BV(SER_DATA);//PG2輸出0

        }

        SER_PORT |= _BV(SER_SCK); //上升沿觸發,SER_DATA數據進入移位寄存器

        _delay_us(5);

        SER_PORT &= ~_BV(SER_SCK);

        byte <<= 1; //通過左移,逐個點亮個個數碼管

        }

        SER_PORT |= _BV(SER_RCK); //上升沿觸發,移位寄存器中的數據并行輸出

        _delay_us(5);

        SER_PORT &= ~_BV(SER_RCK);

        }

        int main(void)

        {

        PORTB = 0xff; //PB口賦初值為ff

        DDRB = 0xff; //PB口為輸出態

        PORTG = 0x00; //PG口賦初值為0

        DDRG |= _BV(SER_DATA)|_BV(SER_RCK)|_BV(SER_SCK); //PG0,PG1,PG2為輸出態

        PORTB = Led_Disbuf[5]; //數碼管上顯示5

        Send_Byte_HC595(0x03); //第一位,第二位數碼管點亮

        while(1)

        {};

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沂源县| 咸阳市| 白山市| 阳春市| 渝中区| 桐乡市| 宁强县| 千阳县| 阳原县| 会同县| 同心县| 泗水县| 聊城市| 梓潼县| 江口县| 白朗县| 通道| 瓦房店市| 屯门区| 云龙县| 淅川县| 新乡市| 茌平县| 竹山县| 广灵县| 江川县| 三台县| 呼玛县| 西青区| 麦盖提县| 松潘县| 乐安县| 泾源县| 饶平县| 赤峰市| 济阳县| 彩票| 泰宁县| 南澳县| 泸定县| 泽州县|