📄 main.c
字号:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:LED动态扫描显示及键盘输入扫描。 **
//**<功能>:将键盘输入转换成相应的输出并显示在LED上。 **
//**<作者>:LastRitter **
//**<完成时间>:2007年7月28日 **
//**<联系方式>:E-Mail:superyongzhe@163.com;QQ:314665345。 **
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************头文件及宏定义************************** *
//* *
//*************************************************************************************************
#include "includes.h"
#define TIME0H 0xFC
#define TIME0L 0x18 //定时器0溢出时间:5ms
#define TIME1H 0x44
#define TIME1L 0x80 //定时器1溢出时间:48ms
#define SCANPORT P2
//*************************************************************************************************
//* *
//* ********************************全局变量****************************** *
//* *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0定时刷新LED计数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uc_DisCount=1;
unsigned long ul_Number=0; //LED实时显示数字。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0; //键盘防抖动标志位。
//当按键中断产生时,首先判断此位。
//0--执行键盘扫描及键码处理程序;1--不执行。
bit b_KillShock=0; //防抖标志清除位:0--不清除;1--清除。
unsigned char uc_KillCount=0; //抖动标志清除计数,使用定时器1。
//*************************************************************************************************
//* *
//* ********************************主函数****************************** *
//* *
//*************************************************************************************************
void main()
{
SCANPORT=0x0F; //初始化键盘接口。
TMOD=0x11; //定时器0:模式一;定时器0:模式一.
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0,用于LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH0=TIME0H;
TL0=TIME0L;
TR0=1; //开启定时器0
ET0=1; //开定时器0中断
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //开启定时器1
ET1=1; //开定时器1中断
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于执行键盘扫描和键处理程序>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; //外部中断0,中断方式:下降沿
EX0=1; //开启外部中断0
PT0=1; //把定时器0设为高优先级,防止在按键的时候LED产生闪烁。
EA=1; //开启总中断
while(1);
}
//*************************************************************************************************
//* *
//* ***************************外部中断0,调用键盘扫描程序************************* *
//* *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
EX0=0; //在键扫描处理时,关闭外部中断0,防抖动。
if(b_KeyShock==0)
{
vKeyProcess(ucKeyScan()); //当判断有按键按下时,扫描键盘,并把扫描结果进行处理。
}
else b_KeyShock=0; //如果有抖动则不执行键扫描,恢复防抖动标志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyShock==1)
b_KillShock=1; //如果防抖动标志位开启则开启防抖动标志清除位,
//300ms后清除防抖动标志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前初始状态 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EX0=1; //恢复按键中断。
}
//*************************************************************************************************
//* *
//* **********************定时器1中断,用于防抖动标志清除************************ *
//* *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KillShock==1)
{
if(uc_KillCount==7) //当防抖动标志位为1时,计时300ms后清除抖动标志位。
{
b_KeyShock=0;
b_KillShock=0;
uc_KillCount=0;
}
else uc_KillCount++;
}
TH1=TIME1H;
TL1=TIME1L;
}
//*************************************************************************************************
//* *
//* ***************************定时器0,定时刷新LED************************* *
//* *
//*************************************************************************************************
void vTimer0(void) interrupt 1
{
vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),uc_DisCount); //在LED上显示1位数字。
if(uc_DisCount<5)
uc_DisCount++; //定时器0在每次被触发时,改变LED显示。
else uc_DisCount=0; //从第一位到第六位循环显示。
TH0=TIME0H; //恢复定时器0初始值。
TL0=TIME0L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -