使用這個芯片還是上個帖子有位前輩說74HC595芯片對IO口的擴展能力優于三八譯碼器。(它有個級聯接口,可以直接接下一個74HC595芯片),其實想想生活中的廣告位顯示器就能用到它。剛好發現自己的板子上有兩塊74HC595芯片。通過看它的數據手冊我發現這個芯片的特點可以用下圖描述:(字寫得不好 )。大家可以想想入棧和出棧的原理,其實一樣的。(如有不對,懇請指正)。例如:單片機P1^1口輸出0x01至該芯片,當SRCLK上升沿到來時,該數據被從高到低位依次移入移位寄存器當中,此時數據為:0x80;SRCLK下降沿到來時,禁止置入數據,然后當RCLK的上升沿到來時,移位寄存器當中的數據從高位到地位依次移到數據寄存器當中,QA->QH,此時數據為原來的數據:0x01。下面分享兩個代碼,一個是對這個芯片的基礎理解。另一個是驅動兩個8*8點陣顯示♥。關于♥的位碼生成大家可以了解一下字符取模軟件。
單片機源程序如下:
- #include "reg51.h"
- #include "intrins.h" // 包含_nop_()函數原型
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit SRCLK = P1^0;
- sbit RCLK = P1^1;
- sbit SER = P1^2;
- void HC595SendByte(u8 dat);
- void delay(u16 i)
- {
- while(i--);
- }
- void Hc595SendByte(u8 dat)
- {
- u8 i;
- SRCLK = 0;
- _nop_();
- SRCLK = 1;
- for(i = 0; i < 8; i++) //用循環依次讀入8位數據。
- {
- SER = dat >> 7; //把dat的最高位直接移到最低位。dat不變。
- dat <<= 1;
-
- SRCLK = 0;
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- _nop_();
- RCLK = 1;
- }
- void main(void)
- {
- u8 led = 0xfe;
- u8 i;
- while(1)
- {
- for(i = 0; i < 7; i++)
- {
- HC595SendByte(led);
- P0 = _crol_(led,1);
- delay(50000);
- }
- for(i = 0; i < 7; i++)
- {
- HC595SendByte(led);
- P0 = _cror_(led,1);
- delay(50000);
- }
- }
- }
復制代碼
所有資料51hei提供下載:
LED點陣.rar
(18.25 KB, 下載次數: 20)
2020-4-2 17:17 上傳
點擊文件名下載附件
_HC595.zip
(18.91 KB, 下載次數: 16)
2020-4-2 17:17 上傳
點擊文件名下載附件
|