历史上的今天
今天是:2025年03月12日(星期三)
2020年03月12日 | 任务9:编写程序,实现“倒计时器”
2020-03-12 来源:eefocus
本系列教程以AVR单片机为对象,介绍单片机的快速开发方法。
参考教材:《单片机技术及应用项目教程》 栾秋平 电子工业出版社 2019.6 第1版
本文介绍使用74HC595在LED阵列上,显示数字“0-9”的方法。
一、数字字模0-9
1、0的字模:0x80、0xB6、0x80

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

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

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

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

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

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

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

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

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

二、编程实现倒计时
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; //永不执行
}
史海拾趣
|
请教各位大虾,写了一个spwm的程序,出来是20Khz,但是接到示波器上无法得到想要的波形是怎么回事?是不是变换的速度太快了无法用示波器观察?… 查看全部问答> |
|
能源是一种极重要的资源。大家都知道,没有能源,汽车不能开,飞机不能飞,工业无法持续发展,经济提高也没有保证。 所以,开发油田的意义很大,现在咱国家原油产量在1.6亿吨左右。按现有资源的可获量以及目前开采利用情况和技术经济条件 ...… 查看全部问答> |
|
1、SPARTAN-6这块板子确实不错,32位软核MicroBlaze添加了MMU还有JTAG模式,可以在线调试。 2、新增的PCI高速接口对于高速数据开发很有帮助,参考示例中视频开发部分以及网络部分都是很有用的 3、调试需要的JTAG和UART接口它都做成USB转接口了, ...… 查看全部问答> |
|
Windows Emabedded CE6.0下怎样在应用程序中加载驱动? 我做了一个看门狗驱动,想要在应用程序中动态加载驱动,使用ActivateDeviceEx()加载驱动,程序代码段: DrvDll = ActivateDeviceEx(_T(\"HKEY_LOCAL_MACHINE\\\\Drivers\\\\BuiltIn\\\\WDT\"),RegIniData,1,NULL); hWDT = CreateFile(_T(\"WDT1 ...… 查看全部问答> |
|
现在网络差,上不了图,只能贴下载的反馈信息一片是20K,一片是65535K在串口COM8连接成功@115200bps,耗时261毫秒芯片内BootLoader版本号:2.1芯片PID:00000410芯片FLASH容量为128KB芯片SRAM容量为20KB96位的芯片唯一序列号:37006A065832373 ...… 查看全部问答> |




