📄 main.c
字号:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:数字时钟。 **
//**<功能>:可以显示时实时间,同时可以用按键进行设置。 **
//**<版本说明>:这是第1.2版。 **
//**<作者>:程沛 **
//**<完成时间>:2007年8月7日 **
//**<联系方式>:superyongzhe@163.com **
//*************************************************************************************************
//*************************************************************************************************
#include "includes.h"
#define TIME1H 0x3C
#define TIME1L 0xB0 //定时器1溢出时间:50ms
#define SCANPORT P2 //4×4键盘扫描端口,低4位是行线,高4位是列线。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0; //键盘防抖动标志位。
//当按键中断产生时,首先判断此位。
//0--执行键盘扫描及键码处理程序;1--不执行。
bit b_KillShock=0; //防抖标志清除位:0--不清除;1--清除。
unsigned char uc_KillCount=1; //抖动标志清除计数,使用定时器1。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<键盘扫描开启标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyScan=0; //0--不扫描;
//1--扫描。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD定时刷新时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TIME stCurrentTime; //存储从DS1302获取的时间,以及显示字符串。
bit b_TimeRefresh=0; //定时刷新标志。
unsigned char uc_TimeRefresh=0; //定时刷新计数。
void main()
{
vdInitialize(); //初始化LCD。
vDSInitialize(); //初始化DS1302。
SCANPORT=0x0F; //初始化键盘。
vWriteCMD(0x81);
vShowChar("Date:");
vWriteCMD(0xC1);
vShowChar("Time:");
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; // 中断方式:下降沿。
EX0=1; // 开启外部中断。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //开启定时器1
ET1=1; //开定时器1中断
EA=1;
while(1)
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD定时刷新时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_TimeRefresh==1) //没900ms执行1次,刷新LCD时间显示。
{
b_TimeRefresh=0; //恢复标志。
vDSGetTime(&stCurrentTime); //获取当前时间并将其存入指定数组。
vDateString(&stCurrentTime); //生成日期字符串。
vTimeString(&stCurrentTime); //生成时间字符串。
vWriteCMD(0x86); //向LCD写入当前时间。
vShowChar(stCurrentTime.ucaDateString);
vWriteCMD(0xC6);
vShowChar(stCurrentTime.ucaTimeString);
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<键盘扫描及键码处理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyScan==1) //如果有按键按下,则进行按键扫描和键码处理。
{
b_KeyScan=0;
vKeyProcess(ucKeyScan());
}
}
}
//*************************************************************************************************
//* *
//* ******************************外部中断0,用于开启键盘扫描及键码处理****************** *
//* *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
if(b_KeyShock==0)
{
b_KeyScan=1; //开启键盘扫描标志。
b_KeyShock=1; //设置防抖动标志。
}
else b_KeyShock=0; //如果有抖动则不执行键扫描,恢复防抖动标志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyShock==1)
b_KillShock=1; //如果防抖动标志位开启则开启防抖动标志清除位,
//300ms后清除防抖动标志。
}
//*************************************************************************************************
//* *
//* ****************定时器1中断,用于计时功能和防抖动标志清除以及显示报告**************** *
//* *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KillShock==1)
{
if(uc_KillCount==16) //当防抖动标志位为1时,计时300ms后清除抖动标志位。
{
b_KeyShock=0;
b_KillShock=0;
uc_KillCount=1;
}
else uc_KillCount++;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD定时刷新时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(uc_TimeRefresh==18) //900ms刷新显示1次。
{
b_TimeRefresh=1;
uc_TimeRefresh=0;
}
else
uc_TimeRefresh++;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1溢出时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -