标题:
8位共阳数码管74HC595芯片AVR单片机控制 proteus仿真及源码
[打印本页]
作者:
qq732357710
时间:
2017-5-4 22:26
标题:
8位共阳数码管74HC595芯片AVR单片机控制 proteus仿真及源码
刚入门AVR单片机一段时间,感觉资料很少,所以进度很慢,刚才百度到这里来,现上传一个数码管的程序来和大家分享,高手就跳过吧,初学可以下载来做参考
proteus仿真原理图:
0.png
(39.22 KB, 下载次数: 152)
下载附件
2017-5-5 00:30 上传
0.png
(60.63 KB, 下载次数: 139)
下载附件
2017-5-5 00:29 上传
单片机源程序:
/*
* smg8_avr.h
*
* Created: 2017/3/16 1:54:20
* Author: lyl
*/
#ifndef SMG8_AVR_H_
#define SMG8_AVR_H_
#include "lyl_avr.h"
//数码管端口定义
#define smgPORT PORTA
#define smgPORT_DDR DDRA
#define DS PA5//串行数据输入端口
#define SHCP PA6//为移位寄存器的时钟脉冲输入口
#define STCP PA7//为存储寄存器的时钟脉冲输入口
//OE为输出使能端口,低电平有效,已直接接地
void smgPortInit(void);//数码管端口初始化
void smg74HC595_WriteByte(uchar ucData); //向74HC595发送一个数据
void smgDisplay(uchar bitCode,uchar segCode,uchar dp); //在数码管的某一位上显示某一个字符
//共阳数码管的编码,并将数据定义在CODE区
const uchar SMG_SEG_CODE[18]={//共阳数码管的段码编码,并将数据定义在CODE区
0xc0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A=10*/
0x83,/*b=11*/
0xC6,/*C=12*/
0xA1,/*d=13*/
0x86,/*E=14*/
0x8E,/*F=15*/
0xFF,/*不显示=16*/
0xBF,/*横杆“-”=17*/
};
//数码管的位选择编码
const uchar SMG_BIT_CODE[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#define SMG8_SetDS() setbit(smgPORT,DS)
#define SMG8_ClrDS() clrbit(smgPORT,DS) //数据引脚
#define smgSTCP_SET() setbit(smgPORT,STCP)
#define smgSTCP_CLR() clrbit(smgPORT,STCP) //上升沿更新数据
#define smgSHCP_SET() setbit(smgPORT,SHCP)
#define smgSHCP_CLR() clrbit(smgPORT,SHCP) //上升沿移入数据
#define smgDS_SET() setbit(smgPORT,DS)
#define smgDS_CLR() clrbit(smgPORT,DS) //数据引脚
/************************************************************************/
/* 函数名称:smgPortInit
函数功能:初始化8位共阳数码管的数据端口
入口参数:无
返回值:无 */
/************************************************************************/
void smgPortInit(void){
smgPORT|=((1<<DS)|(1<<SHCP)|(1<<STCP));//初值为高电平
smgPORT_DDR|=((1<<DS)|(1<<SHCP)|(1<<STCP));//数码管端口设置为输出模式
}
/************************************************************************/
/*函数名称:smg74HC595_WriteByte
函数功能:向74HC595发送一个字节数据
入口参数:ucData-要发送的数据
返回值:无 */
/************************************************************************/
void smg74HC595_WriteByte(uchar ucData){
for(uchar i = 0 ;i < 8;i++){//高位在前低位在后
if((ucData & (0x80>>i)) != 0) smgDS_SET(); else smgDS_CLR();
smgSHCP_CLR();
smgSHCP_SET();//SHCP引脚的上升沿移入数据
_delay_us(10);
}
}
/************************************************************************/
/*函数名称:smgDisplay
函数功能:在8位共阳数码管的指定位置上显示一个字符
入口参数:bitCode-位选择码,即选择要在哪位数码管上显示数据
:segCode-数据段码选择,即要显示什么数据
:dp-当dp取值不等于0时,数码管将显示后面的小圆点
返回值:无 */
/************************************************************************/
void smgDisplay(uchar bitCode,uchar segCode,uchar dp){//在数码管的某一位上显示某一个字符
uchar a;
if(dp==0) a=0x00; else a=0x80;
smg74HC595_WriteByte(SMG_BIT_CODE[bitCode]); //显示在哪一个数码管上
smg74HC595_WriteByte(SMG_SEG_CODE[segCode]-a); //显示的数据
smgSTCP_CLR();
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
8位共阳数码管74HC595芯片AVR单片机控制.7z
(71.49 KB, 下载次数: 43)
2017-5-4 22:25 上传
点击文件名下载附件
初学程序,高手跳过
下载积分: 黑币 -5
作者:
qq732357710
时间:
2017-5-4 22:39
用的编程环境是Atmel Studio 7 和Proteus 8
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1