在前一部分中,视频课程的数字管道共享了动态更新显示的代码。 一位网友说,应该用计时器刷新实现数字管道的动态显示,而不是delay函数。 是的,在我们实际的工程APP应用中,一般来说计时器的样子是不可缺少的。 之所以能灵活应用计时器,基本上是因为我几乎玩的是单片机。 也可以理解后台的程序框架,一般的工程项目也差不多可以解决。 51单片机的定时器个数有限,如果用于数字管道的显示和密钥检测,一般将定时器作为基本的定时器取出,动态刷新数字管道,同时定时检测密钥当然,串行端口的接收监视也可以放入定时器中断中,从而中断帧。 另外,虽然硬件计时器的数量有限,但通过软件代码扩展软件计时器,可以实现不同的定时时间,处理不同的事件。 以下代码来源于视频课程——单片机应用实践篇的定时计数器中断方式对数字数码管的动态显示更新,https://WWW.I xigua.com/6837437108303430148。
//主. c
/*******************************
功能:通过计时器/计数器的计时器刷新实现数字管的动态显示
接通电源:最初的5S、显示- - - -同时LED闪烁
进入主程序后,显示缓冲区内的数据
* * * *
# #包括re g51.h
# #包括'显示. h '
sbit LED=P1^0;
语音时间r0单元(语音;
void显示器服务(;
无符号整数=4534;
无符号系统定时器=0;
无符号字符系统标志=1;
void主() )
{
Timer0Init (;
o
{
if (系统时间RP==0)
LED=~LED;
while (系统定时器5000; //5s 5000毫秒/1毫秒
系统标志=0;
LED=1;
while(1) )。
{
显示服务(;
}
}
//显示用于填充数据缓冲区的服务函数
void显示器服务(
{
led buf [0]=数字/1000;
led buf [1]=数字/100;
led buf=数字/10;
led buf=数字;
}
语音时间r0初始化(语音)/1毫秒@12.000MHz
{
TMOD=0xF0; //设定计时器模式
TMOD |=0x01; //设定计时器模式
TL0=0x18; //设定计时器初始值
TH0=0xFC; //设定计时器初始值
TF0=0; 清除//TF0标志
ET0=1; //计时器0的中断开关
EA=1; //中断主开关
TR0=1; //计时器0开始计数
}
/****************************
1、中断服务函数一定是无返回值的函数
2、中断服务函数一定是没有参数的函数
3、中断服务函数名后面跟着关键字interrupt
4、interrupt n 0 - 4 5个中断源8*n 0003H
03 hint 0000 BHT 00013 hint 1001 BHT 10023 hes
5、中断服务函数不能由北主程序或其他程序调用
6、n之后是usingm(0-3)工作寄存器组
* * * *
语音计时器0 _ ISR (语音)中断1
{
TR0=0;
if (系统标志==1) ) )。
{
系统定时器;
}
显示(; //用计时器刷新数字管
TL0=0x18; //设定计时器初始值
TH0=0xFC; //设定计时器初始值
TR0=1;
//显示. c
# #包括'显示. h '
无符号字符代码指示灯数据[ ]={//代码管的段代码表
0x3F,//'0'
0x06,//'1'
0x5B,//'2'
0x4F,//'3'
0x66,//'4'
0x6D,//'5'
0x7D,//'6'
0x07,//'7'
0x7F,//'8'
0x6F,//'9'
0x77,//'A ' '
0x7C,//'B ' '
0x39,//'C ' '
0x5E,//'D '
0x79,//'E ' '
0x71,//'F '
0x76,//h '。
0x38,//'L '
0x37,//'n '。
0x3E,//u '
0x73,//'P '。
0x5C,//'o ' '
0x40,//'-'
0x00,//熄灭
(;
unsignedcharledbuf [ ]={ 22,22,22,22 }; //数据显示缓冲器
unsignedcharcodeplace _ code [ ]={0x FE,0xfd,0xfb,0xf7}; //位选择信号
void显示器(
{
静态无符号字符I=0;
//1、发送段代码
//2、位选择
//3,延迟1毫秒10毫秒
//4、消隐
交换机(I ) ) )。
{
case 0:
GPIO_DIG=0x00;
gpio _ dig=led数据;
gpio _放置=放置代码[0];
I;
布莱克;
case 1:
GPIO_DIG=0x00;
gpio _ dig=led数据;
gpio _放置=放置代码[1];
I;
布莱克;
case 2:
GPIO_DIG=0x00;
gpio _ dig=led数据;
gpio _放置=放置代码[2];
I;
布莱克;
case 3:
GPIO_DIG=0x00;
gpio _ dig=led数据;
gpio _放置=放置代码[3];
i=0;
布莱克;
默认:中断;
}
//显示. h
# # ifndef _显示_ h _ _
# #定义_显示_ h _ _
# #包括re g51.h
//IO的声明
#define GPIO_DIG P0 //段代码IO
# #定义gpIO _ place p2//位选择io
#define N 4 //数字管道的个数
无符号字符代码指示灯数据[ ];
扩展符号指示灯缓冲器[ ];
void显示器(;
# # endif
打开初始显示
主程序数据显示
有关具体代码和功能的实现,请参阅视频课程https://www.I xigua.com/6837437108303430148。
本视频课程主要针对单片机初学入门,代码规范有待提高,代码尚需改进,请参考。
因为很多同学都是通过私信求代码的,所以之后有时间的话会陆续分享视频课程的代码大家交流学习。 请指出代码中有不恰当的地方,一起学习交流。