⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Proteus实例集锦(包括电路图.仿真程序,各种各样的电路
💻 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 + -