控制/MCU
之前介绍了1602的显示屏的接口(连接:LCD1602显示屏接口介绍)和读写操作的相关函数(连接:LCD1602读写控制与初始化函数)。今日做一个简单1602应用案例----设计一个秒表。要求:具有秒表启动和复位功能按键,秒表计时时间实时显示在LCD1602。
1.系统的硬件电路原理图:
2.系统的程序设计
2.1 头文件、全局变量和函数的声明
#include "LCD_1602.h"
#include
unsigned char Disp_Buffer[10];//这个可以稍微设置大一点,不影 响结果显示,显示的时候遇到字符串结束标志就结束
//定义二个位变量,分别对应按键开始按键和停止复位按键
sbit key_set=P3^2;
sbit key_reset=P3^3;
unsigned char time_count=0;
unsigned int time_S=0;
void timer_inial();//定时器初始化
void delay(unsigned int i);//延时函数
void start();//启动秒表
void stop();//停止复位秒表
void second_cal_show();//秒的计算与显示
2.2 主程序
主程序主要完成显示屏的初始化和初始化显示、定时器的初始化,注意定时初始化的时候不启动。启动有开始按键控制,不按下开始键不启动定时器。初始化完了,在while循环中调用start();确定是否启动定时器,调用stop();根据按键状态确定是否停止秒表并复位;调用second_cal_show(); 进行秒的计算和显示。
void main()
{
InitLcd1602();
LcdShowStr(0, 0, "Current : 0 S");
LcdShowStr(0, 1, "Last : 0 S");
timer_inial();
while(1)
{
start();
stop();
second_cal_show();
}
}
2.3 子程序
2.3.1 初始定时器:定时器T0工作在模式1,定时器定时时间0.02秒。
void timer_inial()
{
TMOD = 0X01;//
TH0=0XB8;//定时0.02s
TL0=0X00;
}
2.3.2 延时函数:软件延时,主要用按键软件消抖
//延时函数
void delay(unsigned int i)
{
unsigned int k;
for(k=0;k
2.3.3 启动函数:检测按键是否按下,按键如果按下则启动定时器T0,并从0开始计数。
void start()
{
if(0==key_set)
{
delay(1200);//10ms消抖
if(0==key_set)//再次检测按键是否按下
{
while(!key_set);//等待按键释放
TR0=1;
time_S=0;
time_count=0;
}
}
}
2.3.4 停止复位函数:检测停止按键是否按下,按键如果按下则停止定时器T0,并更新LCD显示屏信息。
void stop()
{
if(0==key_reset)
{
delay(1200);//10ms消抖
if(0==key_reset)//再次检测按键是否按下
{
while(!key_reset);//等待按键释放
TR0=0;
LcdWriteCmd(0x01); //清屏
LcdShowStr(0, 0, "Current : 0 S");
LcdShowStr(0, 1, "Last : 0 S");
LcdShowStr(10, 1, Disp_Buffer);
}
}
}
2.3.5 秒处理及显示函数:定时器T0每溢出一次,time_count值加1,加50次为秒,秒变量time_S的值加1,然后更新显示屏显示信息。
void second_cal_show()
{
if(TF0==1)
{
TF0=0;
TH0=0XB8;
TL0=0X00;
time_count++;
if(time_count>=50)//50次一秒
{
time_count=0;
time_S++;
sprintf(Disp_Buffer,"%d S",time_S);
LcdShowStr(10, 0, Disp_Buffer);
}
}
}
以上是全部代码,编译情况如下:
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !