历史上的今天
返回首页

历史上的今天

今天是: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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

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

image.png?imageView2/2/w/550

二、编程实现倒计时

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; //永不执行

}

推荐阅读

史海拾趣

BOOKLY公司的发展小趣事

在电子行业的激烈竞争中,BOOKLY公司以其卓越的技术创新能力脱颖而出。公司初创时,仅是一个由几位电子工程师组成的小团队,专注于研发高效能、低功耗的芯片技术。经过数年的艰苦努力,BOOKLY成功推出了一款颠覆性的芯片产品,被广泛应用于智能手机和电脑领域,迅速赢得了市场份额。此后,公司不断投入研发,拓展产品线,逐渐在电子行业建立了自己的品牌地位。

Consolidated Wire公司的发展小趣事

在电子行业的早期,Consolidated Wire公司以其出色的技术研发能力崭露头角。公司投入大量资源研发新型导电材料,成功推出了一种具有更高导电性能和更低电阻的新型线材。这一技术突破不仅提升了电子设备的性能,还降低了能耗,赢得了市场的广泛认可。随着新型线材的普及,Consolidated Wire公司的业务规模迅速扩大,逐渐在电子线材市场占据了领先地位。

Califia Lighting公司的发展小趣事

Califia Lighting深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、包装等各个环节都进行严格把关。同时,公司还注重客户服务和售后支持,及时解决客户在使用过程中遇到的问题,赢得了客户的信赖和好评。

CYMBET公司的发展小趣事

随着全球环境问题的日益严重,环保和可持续发展已经成为电子行业的重要议题。CYMBET公司积极响应这一趋势,致力于环保和可持续发展。公司的EnerChip电池芯片采用环保材料制造,具有生物相容性,不会对环境造成污染。此外,CYMBET还积极探索绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。这种对环保和可持续发展的重视不仅体现了CYMBET的社会责任感,也为公司的可持续发展奠定了坚实的基础。

Amphenol Nexus公司的发展小趣事

Amphenol Nexus Technologies深知,在电子行业中,合作与共赢是实现持续发展的重要途径。因此,公司积极与产业链上下游的合作伙伴建立紧密的合作关系,共同推动行业的发展。通过与供应商、客户以及同行业企业的合作,Amphenol Nexus Technologies不断提升自身的竞争力,实现了业务的快速增长和市场的持续扩张。

以上便是关于Amphenol Nexus公司在电子行业发展的五个故事。这些故事展示了公司在不同历史阶段的发展轨迹、领导层的智慧和决策、技术创新的努力以及合作共赢的理念。正是这些因素的共同作用,使得Amphenol Nexus Technologies能够在激烈的市场竞争中脱颖而出,成为电子连接器行业的佼佼者。

BITECH公司的发展小趣事

1998年,Amphenol Nexus Technologies经历了一次重要的领导层更迭。拜尔斯先生退休,弗雷德·法拉哈尼(Fred Farahani)收购了Nexus, Inc.的股份,并与弗拉纳根先生成为合伙人。在Fred的领导下,公司开始关注销售和开发方面的新机遇,产品基础也扩展到包括微型连接器系列。这一变革为公司带来了新的增长点,使其在激烈的市场竞争中保持了领先地位。

问答坊 | AI 解惑

用verilog写的SPWM程序无法用示波器观察

请教各位大虾,写了一个spwm的程序,出来是20Khz,但是接到示波器上无法得到想要的波形是怎么回事?是不是变换的速度太快了无法用示波器观察?…

查看全部问答>

在PCB中找元件

1.在PROTEL中把原理图文件生成为PCB,在PCB中找相应的元件有什么快捷键?或者怎么找? 2.假如说,在生成的PCB中有若干个电阻,我想把电阻的一端左对齐/右对齐。。。该怎么操作?…

查看全部问答>

Windows Embedded工控 油田开采效率高

  能源是一种极重要的资源。大家都知道,没有能源,汽车不能开,飞机不能飞,工业无法持续发展,经济提高也没有保证。   所以,开发油田的意义很大,现在咱国家原油产量在1.6亿吨左右。按现有资源的可获量以及目前开采利用情况和技术经济条件 ...…

查看全部问答>

刚参加完SPARTAN -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 ...…

查看全部问答>

很强大65535KBSRAM的STM32F103RBT6

现在网络差,上不了图,只能贴下载的反馈信息一片是20K,一片是65535K在串口COM8连接成功@115200bps,耗时261毫秒芯片内BootLoader版本号:2.1芯片PID:00000410芯片FLASH容量为128KB芯片SRAM容量为20KB96位的芯片唯一序列号:37006A065832373 ...…

查看全部问答>

新手求助

刚接触STM32,问一些基础的问题,请大虾们帮忙,谢谢! 以前用kei 做51的程序 一个工程一般会有很多的 .c文件 一个mian.c的文件 当用到其他.c里的函数时就 在mian.c的文件里包含.h的文件。 比如有个key.c 和key.h 但mian.c里用到 key.c里的 ...…

查看全部问答>

布局布线后仿真结果错误

行为仿真时正确,而布局布线后仿真结果错误。 大家来总结一下,这可能是什么原因导致的 :)  …

查看全部问答>

寻求DSP仿真器 HDS560pod 驱动

一个很好的朋友向我求助DSP仿真器 HDS560pod,有哪位好心的朋友有的话,帮助我这个朋友一下好吗?谢谢!…

查看全部问答>

TMS320F28335的头文件和库文件有哪些?

TMS320F28335的原始头文件有哪些,多少个? 原始库文件有哪些?多少个?…

查看全部问答>