第一次在論壇發(fā)帖,比較緊張,條理有點亂,請大家見諒!
電路圖和程序摘自STC官網(wǎng),這樣的驅(qū)動方式只要占用3個單片機IO口卻能驅(qū)動8位數(shù)碼管,還是很方便的,中午在家里用仿真軟件仿真,確實可行。現(xiàn)將電路圖和程序奉上。
C程序代碼:
- /*------------------------------------------------------------------*/
- /* --- STC MCU International Limited -------------------------------*/
- /* --- STC 1T Series MCU Programme Demo ----------------------------*/
- /* --- Fax: 86-755-82944243 ----------------------------------------*/
- /* --- Tel: 86-755-82948412 ----------------------------------------*/
- /* If you want to use the program or the program referenced in the */
- /* article, please specify in which data and procedures from STC */
- /*------------------------------------------------------------------*/
- /* 本程序經(jīng)過測試完全正常, 不提供電話技術(shù)支持, 如不能理解, 請自行補充相關(guān)基礎(chǔ). */
- /************* 本程序功能說明 **************
- 用STC的MCU的IO方式控制74HC595驅(qū)動8位數(shù)碼管。
- 用戶可以修改宏來選擇時鐘頻率.
- 用戶可以在顯示函數(shù)里修改成共陰或共陽.推薦盡量使用共陰數(shù)碼管.
- 顯示效果為: 8個數(shù)碼管循環(huán)顯示0,1,2...,A,B..F,消隱.
- ******************************************/
- #include "reg52.h"
- /****************************** 用戶定義宏 ***********************************/
- #define MAIN_Fosc 11059200UL //定義主時鐘
- //#define MAIN_Fosc 22118400UL //定義時鐘
- /*****************************************************************************/
- /******************** 下面的宏自動生成, 用戶不可修改 **************************/
- #define Timer0_Reload (MAIN_Fosc / 12000)
- /*****************************************************************************/
- /************* 本地常量聲明 **************/
- unsigned char code t_display[]={
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F 消隱
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //段碼
- unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位碼
- /************* 本地變量聲明 **************/
- //sbit P_HC595_SER = P3^2; //pin 14 SER data input
- //sbit P_HC595_RCLK = P3^4; //pin 12 RCLk store (latch) clock
- //sbit P_HC595_SRCLK = P3^3; //pin 11 SRCLK Shift data clock
- sbit P_HC595_SER = P1^5; //pin 14 SER data input
- sbit P_HC595_RCLK = P1^4; //pin 12 RCLk store (latch) clock
- sbit P_HC595_SRCLK = P1^7; //pin 11 SRCLK Shift data clock
- unsigned char LED8[8]; //顯示緩沖
- unsigned char display_index; //顯示位索引
- bit B_1ms; //1ms標志
- /**********************************************/
- void main(void)
- {
- unsigned char i,k;
- unsigned int j;
-
- TMOD = 0x01; //Timer 0 config as 16bit timer, 12T
- TH0 = (65536 - Timer0_Reload) / 256;
- TL0 = (65536 - Timer0_Reload) % 256;
- ET0 = 1;
- TR0 = 1;
- EA = 1;
- for(i=0; i<8; i++) LED8[i] = 0x10; //上電消隱
- j = 0;
- k = 0;
- // for(i=0; i<8; i++) LED8[i] = i;
-
- while(1)
- {
- while(!B_1ms) ; //等待1ms到
- B_1ms = 0;
- if(++j >= 500) //500ms到
- {
- j = 0;
- for(i=0; i<8; i++) LED8[i] = k; //刷新顯示
- if(++k > 0x10) k = 0; //8個數(shù)碼管循環(huán)顯示0,1,2...,A,B..F,消隱.
- }
- }
- }
- /**********************************************/
- /**********************************************/
- void Send_595(unsigned char dat) //發(fā)送一個字節(jié)
- {
- unsigned char i;
- for(i=0; i<8; i++)
- {
- if(dat & 0x80) P_HC595_SER = 1;
- else P_HC595_SER = 0;
- P_HC595_SRCLK = 1;
- P_HC595_SRCLK = 0;
- dat = dat << 1;
- }
- }
- /**********************************************/
- void DisplayScan(void) //顯示掃描函數(shù)
- {
- // Send_595(~T_COM[display_index]); //共陰 輸出位碼
- // Send_595(t_display[LED8[display_index]]); //共陰 輸出段碼
- Send_595(T_COM[display_index]); //共陽 輸出位碼
- Send_595(~t_display[LED8[display_index]]); //共陽 輸出段碼
- P_HC595_RCLK = 1;
- P_HC595_RCLK = 0; //鎖存輸出數(shù)據(jù)
- if(++display_index >= 8) display_index = 0; //8位結(jié)束回0
- }
- /**********************************************/
- void timer0 (void) interrupt 1 //Timer0 1ms中斷函數(shù)
- {
- TH0 = (65536 - Timer0_Reload) / 256; //重裝定時值
- TL0 = (65536 - Timer0_Reload) % 256;
- DisplayScan(); //1ms掃描顯示一位
- B_1ms = 1; //1ms標志
- }
復制代碼
全部資料51hei下載地址:
HC595驅(qū)動8個數(shù)碼管.zip
(53.16 KB, 下載次數(shù): 266)
2018-4-20 17:36 上傳
點擊文件名下載附件
|