|
刚接触AVR没几天,开始用74HC573驱动数码管的老办法,但是在AVR上面就是锁存不住,所以就改用74HC595驱动了,网上找了一些资料,但是都说的模模糊糊,对于刚接触AVR的老菜来说有点费劲,找了一些资料,通过整理及验证,将程序奉献给大家,相互学习,相互提高,少走一些弯路。环境为GCC+AVRstudio
#include<avr/io.h>
#include<util/delay.h>
#define HC595_latch (1 << PB2) //上升沿数据打入8 位锁存器,下降沿锁存器数据不变
#define HC595_sclk (1 << PB0) //上升沿数据移位,下降沿数据不变
#define HC595_oe (1 << PB3) //低电平,8 位数据锁存器输出,高电平输出高组态
#define HC595_data (1 << PB1) //串行数据输入端
#define SET_HC595_latch (PORTB |= (1 << PB2))
#define CLR_HC595_latch (PORTB &= ~(1 << PB2))
#define SET_HC595_sclk (PORTB |= (1 << PB0))
#define CLR_HC595_sclk (PORTB &= ~(1 << PB0))
#define SET_HC595_data (PORTB |= (1 << PB1))
#define CLR_HC595_data (PORTB &= ~(1 << PB1))
#define SET_HC595_oe (PORTB |= (1 << PB3))
#define CLR_HC595_oe (PORTB &= ~(1 << PB3))
void HC595_port_init(void); //595端口初始化
void HC595_Send_Data(unsigned char byte); //发送一个字节
void HC595_Output_Data(unsigned char data); //发送字符串
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};
void HC595_port_init(void)
{
PORTB = 0x00;
DDRB |= (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3);
}
//发送一个字节
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; //上升沿数据移位
CLR_HC595_sclk;
}
SET_HC595_latch;
CLR_HC595_latch;
}
//发送字符串
void HC595_Output_Data(unsigned char data)
{
CLR_HC595_latch; //下降沿锁存器数据不变
HC595_Send_Data(data);
SET_HC595_latch; //上升沿数据打入8位锁存器
}
int main(void) //GCC 中main文件必须为返回整形值的函数,没有参数
{
unsigned char i;
HC595_port_init();
while(1)
{
for(i = 0; i < 4;i++)
{
// PORTB = Led_Disbuf[5]; //送段码
HC595_Output_Data(Led_Disbuf[1]);//要送显的数字
HC595_Send_Data(ComBuf); //选通位选端口
_delay_us(10);
HC595_Send_Data(0x00); //位选通关闭
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|