任务9:编写程序,实现“倒计时器”

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

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

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


一、数字字模0-9

1、0的字模:0x80、0xB6、0x80

行        列

2

1

0

0

0

0

0

1

0

1

0

2

0

1

0

3

0

1

0

4

0

1

0

5

0

1

0

6

0

0

0

7

1

1

1

2、1的字模0xFF、0x80、0xFF

行        列

2

1

0

0

1

0

1

1

1

0

1

2

1

0

1

3

1

0

1

4

1

0

1

5

1

0

1

6

1

0

1

7

1

1

1

3、2的字模0x86、0xB6、0xB0

行        列

2

1

0

0

0

0

0

1

1

1

0

2

1

1

0

3

0

0

0

4

0

1

1

5

0

1

1

6

0

0

0

7

1

1

1

4、3的字模0xB6、0xB6、0x80

行        列

2

1

0

0

0

0

0

1

1

1

0

2

1

1

0

3

0

0

0

4

1

1

0

5

1

1

0

6

0

0

0

7

1

1

1

5、4的字模0xF0、0xF7、0x80

行        列

2

1

0

0

0

1

0

1

0

1

0

2

0

1

0

3

0

0

0

4

1

1

0

5

1

1

0

6

1

1

0

7

1

1

1

6、5的字模0xB0、0xB6、0x86

行        列

2

1

0

0

0

0

0

1

0

1

1

2

0

1

1

3

0

0

0

4

1

1

0

5

1

1

0

6

0

0

0

7

1

1

1

7、6的字模0x80、0xB6、0x86

行        列

2

1

0

0

0

0

0

1

0

1

1

2

0

1

1

3

0

0

0

4

0

1

0

5

0

1

0

6

0

0

0

7

1

1

1

8、7的字模0xFE、0xFE、0x80

行        列

2

1

0

0

0

0

0

1

1

1

0

2

1

1

0

3

1

1

0

4

1

1

0

5

1

1

0

6

1

1

0

7

1

1

1

9、8的字模0x80、0xB6、0x80

行        列

2

1

0

0

0

0

0

1

0

1

0

2

0

1

0

3

0

0

0

4

0

1

0

5

0

1

0

6

1

0

0

7

1

1

1

10、9的字模0xB0、0xB6、0x80

行        列

2

1

0

0

0

0

0

1

0

1

0

2

0

1

0

3

0

0

0

4

1

1

0

5

1

1

0

6

0

0

0

7

1

1

1

二、编程实现倒计时

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

三、程序的优化

#ifndef HAL_H_
#define HAL_H_

//引脚定义
////////////////////////////////////////////////////////////////////////////////////
//PortB
#define IO_PB_DIR 	0b00000000
#define IO_PB_OUT 	0b00000000			
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
//PortC
#define IO_PC_DIR 	0b00000000
#define IO_PC_OUT 	0b00000000		
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
//PortD
#define IO_PD_DIR 	0b00000000
#define IO_PD_OUT 	0b00000000
////////////////////////////////////////////////////////////////////////////////////

	
//函数原型声明
void ShowNumber(uint8 u8_Number);

#endif /* HAL_H_ */
#include "../include.h"

//以下函数为工程项目中用到的函数
void ShowNumber(uint8 u8_Number)
{
	uint8 u8_Line[3];
	
	switch (u8_Number)
	{
		case 0:
		u8_Line[2] = 0x80;
		u8_Line[1] = 0xBE;
		u8_Line[0] = 0x80;
		break;
		case 1:
		u8_Line[2] = 0xFF;
		u8_Line[1] = 0x80;
		u8_Line[0] = 0xFF;
		break;
		case 2:
		u8_Line[2] = 0x86;
		u8_Line[1] = 0xB6;
		u8_Line[0] = 0xB0;
		break;
		case 3:
		u8_Line[2] = 0xB6;
		u8_Line[1] = 0xB6;
		u8_Line[0] = 0x80;
		break;
		case 4:
		u8_Line[2] = 0xF0;
		u8_Line[1] = 0xF7;
		u8_Line[0] = 0x80;
		break;
		case 5:
		u8_Line[2] = 0xB0;
		u8_Line[1] = 0xB6;
		u8_Line[0] = 0x86;
		break;
		case 6:
		u8_Line[2] = 0x80;
		u8_Line[1] = 0xB6;
		u8_Line[0] = 0x86;
		break;
		case 7:
		u8_Line[2] = 0xFE;
		u8_Line[1] = 0xFE;
		u8_Line[0] = 0x80;
		break;
		case 8:
		u8_Line[2] = 0x80;
		u8_Line[1] = 0xB6;
		u8_Line[0] = 0x80;
		break;
		case 9:
		u8_Line[2] = 0xB0;
		u8_Line[1] = 0xB6;
		u8_Line[0] = 0x80;
		break;
		default:
		u8_Line[2] = 0xFF;
		u8_Line[1] = 0xFF;
		u8_Line[0] = 0xFF;
		break;
	}
	HC595_WriteByte(u8_Line[2]);
	HC595_WriteByte(u8_Line[1]);
	HC595_WriteByte(u8_Line[0]);
	HC595_SELECT;
}
int main(void)
{
	//定义局部变量
	int8 i;
	//目标板初始化,该函数会自动初始化相应的外设文件	
	TARGET_Init();
	
	//初始化全局变量	
		
	//在上电时,执行的相应操作	
			
	//后台主循环
	while(1)
	{
		/*
		**********************************
		在这里完成自己的项目逻辑
		**********************************
		*/	
		for (i = 9; i >= 0; i--)
		{
			ShowNumber(i);
			TARGET_Delayms(1000, 1);
		}
		/*
		**********************************
		喂狗语句,大部分工程项目都不应去除
		**********************************
		*/	
		#if INTERNAL_PERIPHERAL_WDT_MODE != 0
			TARGET_WatchDogReset();
		#endif
	}
	return 0;	//永不执行
}

 

 

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

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

 

发布了413 篇原创文章 · 获赞 1104 · 访问量 81万+

猜你喜欢

转载自blog.csdn.net/qingwufeiyang12346/article/details/102888526