本文为大家介绍两个AVR单片机8位数码管显示的程序实现。
AVR单片机595驱动8位数码管的显示的电路实现 主程序代码#include >
#include //GCC中的延时函数头文件
#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};
//函数声明
extern void Delayus(unsigned int lus); //us延时函数
extern void Delayms(unsigned int lms); //ms延时函数
int main(void) //GCC中main文件必须为返回整形值的函数,没有参数
{
unsigned char i;
PORTB = 0xff; //PORTB输出低电平,使LED熄灭
DDRB = 0xFF; //配置端口PB全部为输出口
HC595_port_init();
while(1)
{
for(i = 0; i < 8;i++)
{
PORTB = Led_Disbuf; //送段码
HC595_Send_Data(ComBuf); //选通位选端口
Delayus(70); //延时
HC595_Send_Data(0x00); //位选通关闭
}
}
}
//us级别的延时函数
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(4); //_delay_loop_2(1)是延时4个时钟周期,参数为4则延时16
//个时钟周期,本实验用16M晶体,则16个时钟周期为16/16=1us
}
}
//ms级别的延时函数
void Delayms(unsigned int lms)
{
while(lms--)
{
Delayus(1000); //延时1ms
}
}
模块化程序设计的.h文件
下面是本实例中模块化程序设计的.h文件
/*****************************
74hc595.h
***********************************/
/*74hc595与单片机的引脚连接
/MR(10脚) VCC 低点平时将移位寄存器的数据清零。通常将它接Vcc
/OE(13脚) PG4 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,
可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
ST_CP(12脚) PG1 上升沿时移位寄存器的数据进入数据存储寄存器,
下降沿时存储寄存器数据不变。通常将RCK置为低电平,
当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
通常都选微秒级),更新显示数据。
SH_CP(11脚) PG0 上升沿时数据寄存器的数据移位。QA-->QB-->QC-->。。。-->QH;
下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。
通常都选微秒级)
DS(14) PG2 串行数据输入端。
*/
#ifndef __HC595_H__
#define __HC595_H__
#include //io端口寄存器配置文件,必须包含
#include //GCC中的延时函数头文件
#define HC595_latch (1 << PG1) //上升沿数据打入8位锁存器,下降沿锁存器数据不变
#define HC595_sclk (1 << PG0) //上升沿数据移位,下降沿数据不变
#define HC595_oe (1 << PG4) //低电平,8位数据锁存器输出,高电平输出高组态
#define HC595_data (1 << PG2) //串行数据输入端
#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); //发送一个字节
void HC595_Output_Data(unsigned char data); //发送字符串
#endif
同时我们将与74HC595相关的函数定义部分放在74HC595.c文件中,如下
/********************************
74hc595.c
**************************************/
#include “hc595.h”
//595端口初始化
void HC595_port_init(void)
{
PORTG = 0x00;
DDRG |= (1 << PG0) | (1 << PG1) | (1 << PG2) | (1 << PG4);
}
//发送一个字节
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位锁存器
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)