本文為大家介紹兩個AVR單片機(jī)8位數(shù)碼管顯示的程序?qū)崿F(xiàn)。
AVR單片機(jī)595驅(qū)動8位數(shù)碼管的顯示的電路實現(xiàn)
主程序代碼
#include
#include //GCC中的延時函數(shù)頭文件
#include “hc595.h”
//unsigned char Led_Disbuf[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰極
unsigned char Led_Disbuf[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共陽極
unsigned char ComBuf[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//函數(shù)聲明
extern void Delayus(unsigned int lus); //us延時函數(shù)
extern void Delayms(unsigned int lms); //ms延時函數(shù)
int main(void) //GCC中main文件必須為返回整形值的函數(shù),沒有參數(shù)
{
unsigned char i;
PORTB = 0xff; //PORTB輸出低電平,使LED熄滅
HC595_port_init();
while(1)
{
for(i = 0; i < 8;i++)
{
PORTB = Led_Disbuf; //送段碼
HC595_Send_Data(ComBuf); //選通位選端口
Delayus(70); //延時
HC595_Send_Data(0x00); //位選通關(guān)閉
}
}
}
//us級別的延時函數(shù)
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(4); //_delay_loop_2(1)是延時4個時鐘周期,參數(shù)為4則延時16
//個時鐘周期,本實驗用16M晶體,則16個時鐘周期為16/16=1us
}
}
//ms級別的延時函數(shù)
void Delayms(unsigned int lms)
{
while(lms--)
{
Delayus(1000); //延時1ms
}
}
模塊化程序設(shè)計的.h文件
下面是本實例中模塊化程序設(shè)計的.h文件
/*****************************
74hc595.h
***********************************/
/*74hc595與單片機(jī)的引腳連接
/MR(10腳) VCC 低點平時將移位寄存器的數(shù)據(jù)清零。通常將它接Vcc
/OE(13腳) PG4 高電平時禁止輸出(高阻態(tài))。
如果單片機(jī)的引腳不緊張,用一個引腳控制它,
可以方便地產(chǎn)生閃爍和熄滅效果。比通過數(shù)據(jù)端移位控制要省時省力。
ST_CP(12腳) PG1 上升沿時移位寄存器的數(shù)據(jù)進(jìn)入數(shù)據(jù)存儲寄存器,
下降沿時存儲寄存器數(shù)據(jù)不變。通常將RCK置為低電平,
當(dāng)移位結(jié)束后,在RCK端產(chǎn)生一個正脈沖(5V時,大于幾十納秒就行了。
通常都選微秒級),更新顯示數(shù)據(jù)。
SH_CP(11腳) PG0 上升沿時數(shù)據(jù)寄存器的數(shù)據(jù)移位。QA-->QB-->QC-->。。。-->QH;
下降沿移位寄存器數(shù)據(jù)不變。(脈沖寬度:5V時,大于幾十納秒就行了。
通常都選微秒級)
DS(14) PG2 串行數(shù)據(jù)輸入端。
*/
#ifndef __HC595_H__
#define __HC595_H__
#include //io端口寄存器配置文件,必須包含
#include //GCC中的延時函數(shù)頭文件
#define HC595_latch (1 << PG1) //上升沿數(shù)據(jù)打入8位鎖存器,下降沿鎖存器數(shù)據(jù)不變
#define HC595_sclk (1 << PG0) //上升沿數(shù)據(jù)移位,下降沿數(shù)據(jù)不變
#define HC595_oe (1 << PG4) //低電平,8位數(shù)據(jù)鎖存器輸出,高電平輸出高組態(tài)
#define HC595_data (1 << PG2) //串行數(shù)據(jù)輸入端
#define SET_HC595_latch (PORTG |= (1 << PG1))
#define CLR_HC595_latch (PORTG &= ~(1 << PG1))
#define SET_HC595_sclk (PORTG |= (1 << PG0))
#define CLR_HC595_sclk (PORTG &= ~(1 << PG0))
#define SET_HC595_data (PORTG |= (1 << PG2))
#define CLR_HC595_data (PORTG &= ~(1 << PG2))
#define SET_HC595_oe (PORTG |= (1 << PG4))
#define CLR_HC595_oe (PORTG &= ~(1 << PG4))
void HC595_port_init(void); //595端口初始化
void HC595_Send_Data(unsigned char byte); //發(fā)送一個字節(jié)
void HC595_Output_Data(unsigned char data); //發(fā)送字符串
#endif
同時我們將與74HC595相關(guān)的函數(shù)定義部分放在74HC595.c文件中,如下
/********************************
74hc595.c
**************************************/
#include “hc595.h”
//595端口初始化
void HC595_port_init(void)
{
PORTG = 0x00;
DDRG |= (1 << PG0) | (1 << PG1) | (1 << PG2) | (1 << PG4);
}
//發(fā)送一個字節(jié)
void HC595_Send_Data(unsigned char byte)
{
unsigned char i;
//CLR_HC595_latch;
for(i = 0;i < 8;i++)
{
if(byte & 0x80)
{
SET_HC595_data;
}
else
{
CLR_HC595_data;
}
byte <<=1;
SET_HC595_sclk; //上升沿數(shù)據(jù)移位
CLR_HC595_sclk;
}
SET_HC595_latch;
CLR_HC595_latch;
}
//發(fā)送字符串
void HC595_Output_Data(unsigned char data)
{
CLR_HC595_latch; //下降沿鎖存器數(shù)據(jù)不變
HC595_Send_Data(data);
SET_HC595_latch; //上升沿數(shù)據(jù)打入8位鎖存器
}
評論