該"測(cè)試程序"系列的編寫是為了檢測(cè)學(xué)校實(shí)驗(yàn)室板子上的各個(gè)部分是否正常工作 同時(shí)復(fù)習(xí)之前實(shí)驗(yàn)的知識(shí)要點(diǎn) 由于代碼上附帶多數(shù)注釋 故此文只放代碼 不再多做注解
/*
程序編寫者:Murrey_Xiao
編寫日期:2017-04-20
功能介紹:
該程序?yàn)閷?shí)驗(yàn)室Mega16板上职抡,使用74HC595的四位數(shù)碼管的測(cè)試程序
PA0 PB0 PB1為74HC595的使用端口
PD4-7為數(shù)碼管COM口的使用端口
*/
#include <iom16v.h>
#include <macros.h>
//數(shù)碼管段碼值(給0亮狼荞,即共陽)
unsigned char led_7[14]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff,0x7f,0xc6,0x00};
//數(shù)碼管的顯示值
unsigned char disp_buff[4]={8,8,5,1};
#define LED_PLACE PORTD
#define CLR_SHCLK() PORTB&=~(1<<1) //移位時(shí)鐘 SCLK
#define SET_SHCLK() PORTB|=(1<<1) //移位時(shí)鐘 SCLK写妥,上升沿
#define CLR_STCLK() PORTB&=~(1<<0) //鎖存時(shí)鐘 RCLK
#define SET_STCLK() PORTB|=(1<<0) //拉高鎖存時(shí)鐘馅扣,上升沿
#define CLR_DS() PORTA&=~(1<<0) //清零
#define SET_DS() PORTA|=(1<<0) //置位
//使用74HC595的4位數(shù)碼管初始化
void port_init(void)
{
//PA0
DDRA |= 0x01; //74HC595 DS端配置為輸出模式
PORTA &= ~(1<<0); //74HC595 DS端初始化為0
//PB0 && PB1
DDRB |= 0x03; //74HC595 移位時(shí)鐘SHCLK和鎖存時(shí)鐘STCLK配置為輸出模式
PORTB &= 0xfc; //74HC595 SHCLK和STCLK初始化為0
//PD4-7
DDRD |= 0xf0; //數(shù)碼管4個(gè)COM口配置為輸出模式
PORTD |= 0xf0; //數(shù)碼管4個(gè)COM口初始化為1(1為斷開)
}
//74HC595 壓入數(shù)據(jù)函數(shù)
void HC595_send_byte(unsigned char SndData)
{
char i;
for(i=0;i<8;i++)
{
if(SndData&(1<<(7-i)))
{
SET_DS();
}
else
{
CLR_DS();
}
CLR_SHCLK(); //移位時(shí)鐘 SCLK
SET_SHCLK(); //移位時(shí)鐘 SCLK虫给,上升沿
}
CLR_STCLK();
SET_STCLK(); //拉高鎖存時(shí)鐘,上升沿
}
/*使用74HC595的4位數(shù)碼管測(cè)試程序
LED_PLACE為PORTD PORTD4-7位為數(shù)碼管的4個(gè)COM口
HC595_send_byte()實(shí)現(xiàn)數(shù)據(jù)的并轉(zhuǎn)串
*/
int main()
{
unsigned char i,j;
port_init();
while(1)
{
for(i=0;i<4;i++)
{
LED_PLACE |= 0xf0; //數(shù)碼管全關(guān)
HC595_send_byte(led_7[disp_buff[i]]); //給碼
LED_PLACE &= ~(1<<(7-i)); //數(shù)碼管打開
j=200; //延時(shí)
while(j--) ;
}
}
return 0;
}