欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

任务8:在LED阵列上,显示数字“0”

程序员文章站 2022-06-09 10:57:09
...

本系列教程以AVR单片机为对象,介绍单片机的快速开发方法。

参考教材:《单片机技术及应用项目教程》 栾秋平 电子工业出版社 2019.6 第1版

本文介绍使用74HC595在LED阵列上,显示数字“0”的方法。


一、灯光阵列

任务8:在LED阵列上,显示数字“0”

二、config.h文件的使用

#ifndef MAIN_H_
#define MAIN_H_

/*
********************************************************************************
调试
********************************************************************************
*/
#define DEBUG 0

/*
********************************************************************************
MSP430器件选择
********************************************************************************
*/
#define MCU_MODULE 0												//0:	支持的芯片:ATmega48_88_168_328
												
/*
********************************************************************************
内部外设配置
********************************************************************************
*/
#define INTERNAL_PERIPHERAL_WDT_MODE			7					//0:	不支持看门狗
																	//1:	15ms
																	//2:	30ms
																	//3:	60ms
																	//4:	120ms
																	//5:	250ms
																	//6:	500ms
																	//7:	1s
																	//8:	2s
																	//9:	4s
																	//10:	8s
																	
#define INTERNAL_PERIPHERAL_UART0_MODE			0x00				//0x00:	不初始化异步串行口0
																	/*----------无效验------偶效验------奇效验------*/
																	//110bps	0x01		0x11		0x21
																	//300bps	0x02		0x12		0x22
																	//600bps	0x03		0x13		0x23
																	//1200bps	0x04		0x14		0x24
																	//2400bps	0x05		0x15		0x25
																	//4800bps	0x06		0x16		0x26
																	//9600bps	0x07		0x17		0x27
																	//14400bps	0x08		0x18		0x28
																	//19200bps	0x09		0x19		0x29
																	//38400bps	0x0A		0x1A		0x2A
																	//56000bps	0x0B		0x1B		0x2B
																	//115200bps	0x0C		0x1C		0x2C

#define INTERNAL_PERIPHERAL_TIMER0_MODE			0					//0:	不初始化TIMER0
																	//1:	定时1ms
																	//2:	将TIEMR0初始化为快速PWM模式,由引脚PD6进行输出

#define INTERNAL_PERIPHERAL_TIMER1_MODE			0					//0:	不初始化TIMER0
																	//1:	定时10ms
																	//2:	定时1ms

#define INTERNAL_PERIPHERAL_ADC_MODE			0					//0:	不使用ADC
																	//1:	使用ADC

#define INTERNAL_PERIPHERAL_INT0_MODE			0					//0:	不使用外部中断0
																	//1:	使用外部中断0
																	
#define INTERNAL_PERIPHERAL_INT1_MODE			0					//0:	不使用外部中断1
																	//1:	使用外部中断1

/*
********************************************************************************
外部模块使用定义
1、部分外围模块定义了使用情况,具体设置内容,应在该外围芯片相应的config文件中进行配置
2、部分外围模块定义了模块使用的个数
********************************************************************************
*/
#define EXTERNAL_MODULE_HC595_MODE				1					//0:	没有使用HC595芯片
																	//1:	使用HC595芯片,其引脚配置在相应的config文件中进行设置
																	//2:	使用HC595芯片,其引脚配置在相应的config文件中进行设置,三个引脚可以使用不同的端口

#define EXTERNAL_MODULE_HC165_MODE				0					//0:	没有使用HC165芯片
																	//1:	使用HC165芯片,其引脚配置在相应的config文件中进行设置
																	//2:   用不同的引脚,操纵两组74HC165

#define EXTERNAL_MODULE_NIXIETUBE_MODE			0					//0:	没有使用数码管及其相关电路
																	//1:	适用于使用1个74HC138芯片和1个74HC595芯片驱动2个LG3641BH的电路
																	//2:	适用于使用14个74HC164驱动14个LGB012BH的电路

#define EXTERNAL_MODULE_SD2405_MODE				0					//0:	没有使用SD2405芯片
																	//1:	使用了SD2405芯片,系统会自动调用IIC总线,使用时应在IIC_config.h中,对IIC进行配置

#define EXTERNAL_MODULE_DS18B20_MODE			0					//0:	没有使用DS18B20芯片
																	//1:	使用了DS18B20芯片

#define EXTERNAL_MODULE_TLC5620_MODE			0					//0:	没有使用TLC5620芯片
																	//1:	使用了TLC5620芯片
																	
#define EXTERNAL_MODULE_CH432T_MODE				0					//0:	没有使用CH432T芯片
																	//1:	使用了CH432T芯片,还应使能相应的外部中断

#define EXTERNAL_MODULE_FM24C64_MODE			0					//0:	没有使用FM24C64芯片
																	//1:	使用了FM24C64芯片,系统会自动调用IIC总线,使用时应在IIC_config.h中,对IIC进行配置
																	//		64Kb 8KB
																	//		可接8个器件,靠地址区分	0-7	高字节为A
																	//		共8192个单元
																	//		0-8191
																	
#define EXTERNAL_MODULE_AT45DB161D_MODE			0					//0:	没有使用AT45DB161D芯片
																	//1:	使用了AT45DB161D芯片,其引脚配置在相应的config文件中进行设置
																	
/*
********************************************************************************
协议层使用配置
********************************************************************************
*/
#define PROTOCOL_MINIUART_UART0_MODE			0					//0:	不针对UART0加载MiniUart
																	//1:	针对UART0加载MiniUart	
																	
#define PROTOCOL_MINIUART_CH432T_UART0_MODE		0					//0:	不针对CH432T_UART0加载MininUart
																	//1:	针对CH432T_UART0加载MiniUart
																	
#define PROTOCOL_MINIUART_CH432T_UART1_MODE		0					//0:	不针对CH432T_UART1加载MininUart	
																	//1:	针对CH432T_UART1加载MiniUart																																									

#endif /* MAIN_H_ */

三、74HC595配置文件的使用

#ifndef HC595_01_CONFIG_H_
#define HC595_01_CONFIG_H_

#define HC595_PORT		PORTC
#define HC595_DDR		DDRC
#define HC595_CLOCK		BIT1
#define HC595_CS		BIT0
#define HC595_MOSI		BIT2

#endif /* HC595_01_CONFIG_H_ */

四、认知74HC595的操作函数和功能宏

#ifndef HC595_H_
#define HC595_H_

//宏定义
#if EXTERNAL_MODULE_HC595_MODE == 1
	#define HC595_SELECT		CLRBIT(HC595_PORT,HC595_CS);SETBIT(HC595_PORT,HC595_CS);CLRBIT(HC595_PORT,HC595_CS)
	#define HC595_UNSELECT		CLRBIT(HC595_PORT,HC595_CS)
	#define HC595_SET_CLOCK 	SETBIT(HC595_PORT,HC595_CLOCK)
	#define HC595_CLR_CLOCK		CLRBIT(HC595_PORT,HC595_CLOCK)
	#define HC595_SET_MOSI		SETBIT(HC595_PORT,HC595_MOSI)
	#define HC595_CLR_MOSI		CLRBIT(HC595_PORT,HC595_MOSI)	
#elif EXTERNAL_MODULE_HC595_MODE == 2
	#define HC595_SELECT		CLRBIT(HC595_PORT_CS,HC595_CS);SETBIT(HC595_PORT_CS,HC595_CS);CLRBIT(HC595_PORT_CS,HC595_CS)
	#define HC595_UNSELECT		CLRBIT(HC595_PORT_CS,HC595_CS)
	#define HC595_SET_CLOCK 	SETBIT(HC595_PORT_CLOCK,HC595_CLOCK)
	#define HC595_CLR_CLOCK		CLRBIT(HC595_PORT_CLOCK,HC595_CLOCK)
	#define HC595_SET_MOSI		SETBIT(HC595_PORT_MOSI,HC595_MOSI)
	#define HC595_CLR_MOSI		CLRBIT(HC595_PORT_MOSI,HC595_MOSI)
#endif

//函数原型声明
void HC595_Init(void);
void HC595_WriteByte(uint8 u8_Byte);

#endif /* HC595_H_ */

五、“0”的字模

任务8:在LED阵列上,显示数字“0”

六、显示程序

//加入包含文件
#include "../include.h"

//定义系统常量

//定义全局变量

//主程序
int main(void)
{
	//定义局部变量
	
	//目标板初始化,该函数会自动初始化相应的外设文件	
	TARGET_Init();
	
	//初始化全局变量	
		
	//在上电时,执行的相应操作	
			
	//后台主循环
	while(1)
	{
		/*
		**********************************
		在这里完成自己的项目逻辑
		**********************************
		*/	
		HC595_WriteByte(0x80);
		HC595_WriteByte(0xBE);
		HC595_WriteByte(0x80);
		HC595_SELECT;					
		/*
		**********************************
		喂狗语句,大部分工程项目都不应去除
		**********************************
		*/	
		#if INTERNAL_PERIPHERAL_WDT_MODE != 0
			TARGET_WatchDogReset();
		#endif
	}
	return 0;	//永不执行
}

 

 

 

任何问题,只需在此文章的评论处留言即可,我将尽力解答,不要试图采用其它的联系方式,我一概不理会。

原创性文章,转载请注明出处CSDN:http://blog.csdn.net/qingwufeiyang12346。