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

📄 key.c

📁 abov公司的单片机器MC80F7208的演示程序,C代码,包含LCD,I2C,KEY,ADC,NVM,TIME等内容,适合初学者熟悉.
💻 C
字号:
//===============================================================
//     file name  : Key.c
//===============================================================

//------------------------------------------------------------------
//	Include file and variable 
//------------------------------------------------------------------

#include <hms800.h>				//
#include "MC80C7208.h"				// SFR define 
#define  USER_EXTERN extern
#include "Variable.h"				//

//------------------------------------------------------------------
//	external prototype function	
//------------------------------------------------------------------

extern void Wait_uSec(ushort);		// Time.c 
extern void REM_Int_Handler();		//
extern void Melody_Out();			//
extern void Key_Display();			//
extern void Clock_Hex_Decimal();		//
extern void Alram_Hex_Decimal();		//

//================================================================== 
//	task  : 8 bit ADC read
//================================================================== 

uchar Get_ADC(uchar ADC_CH)
{
      ADCM	= ADC_CH + 0x02;			// conversion start		 			               	 

	for(i=0;i<0xFF;i++)			//
	{	if (ADSF == ON) break;	}	//

	return	ADCR;				// return 8 bit data 
}							//

//===============================================================
//	task  : Key Function
//=============================================================== 
//------------------------------------------------------------------ 
//	Key Delay 
//------------------------------------------------------------------ 

void Key_Delay(void)
{
	asm("
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
		nop					; 1us 	
	  ");
}

//------------------------------------------------------------------ 
//	Key data table 
//------------------------------------------------------------------ 

CODE unsigned char Key_Table[] = 
{	
	0xFE,			// 1111_1110b	0
	0xFD,			// 1111_1101b	1
	0xFB,			// 1111_1011b	2
	0xF7,			// 1111_0111b	3
	0xEF,			// 1110_1111b	4
	0xDF,			// 1101_1111b	5
	0xBF,			// 1011_1111b	6
	0x7F,			// 0111_1111b	7
	0xFF			// 1111_1111b	8
};

//----------------------------------------------------------------
//	task  : Key Scan by 4x5 metrix 
//	output: 00h~13h   
//----------------------------------------------------------------

void Key_Scan(void)					// 20 key(4x5) scan out 				
{
	uchar	k;						//
	
	R3PU		= 0xF0;				// pullup 		 				 
	R3OD		= 0xF0;				// open drain 
	R3IO		= 0x0F;				// KS7~KS4 input   				 		    

	R2	= 0xE0;					// R24 strobe out
	Key_Delay();					//
	Key_Delay();					//
	i 	= (R3 >> 4) & 0x0F;			//
	
	R2	= 0xD0;					// R25 strobe out 
	Key_Delay();					//
	Key_Delay();					//
	i	|= R3 & 0xF0;				//
	R2	= 0xF0;					//
	
	for(k=0;k<9;k++)					//			
	{	if(i == Key_Table[k])			//
			break;				//
	}		

	if (k != 0x08)					// no key 
	{	if (k == rKey_Buffer)			//
		{	if (rScan_Count)			//
				rScan_Count--;		//
			else 
			{	if (k == rKey_Data)	//
					f_Repeat = ON;	//
				rKey_Data = k;		//
				rScan_Count = 5;		// 100ms repeat key 
				f_Command_Ok = ON;	//
			}
		}
		else						//
		{	rKey_Buffer = k;			//
			rScan_Count = 2;			//
		}
	}
	else
	{	if(rCmd_Count) rCmd_Count--;		//
		else
		{	rKey_Data 	 = 0xFF;		//
			rKey_Command = 0xFF;		//
			rKey_Buffer	 = 0xFF;		//
			rCmd_Count	 = 1;			// 
		}
	}
}

/*
;================================================================
;	Remote Command pulse 
;================================================================

;----------------------------------------------------------------
;	Remote control output for NEC uPD16xx series code type  
;
;	RMR = x100_1101b			f main = 4 MHz 
;
;	Carrier 500 nsec x CFHS(17) = 8.5 usec   f carrier = 38.46kHz  
;		  500 nsec x CFLS(35) = 17.5 usec	total 26.usec	
;
;	Clock 64 usec  	x 140 = 8.96  (9.0 msec)  Start  = 13.504(8.96+4.544)  
;		      	x  71 = 4.544 (4.5 msec)  
;				x   9 = 0.576 (0.56 msec) Logic 0 = 1.152(576+576)
;				x   9 = 0.576 (1.125 msec) 
;				x  26 = 1.664 (2.25 msec) Logic 1 = 2.24 (576+1.664)
;
;         *                                          * 
;          ________     _   _     _             _   _ 
;         |	       |   | | | |   | |           | | | |
;         |        |   | | | |   | |           | | | |
;	____|        |___| |_| |___| |_ ........_| |_| |____
;
;           start        0    1                  0  stop
;   
;
;      interrupt   v   ^ v ^ v   ^ v           ^ v ^ v
;
;   RDD0  1        0   1 0 1 0   1 0           1 0 1 0 
;   ROB0  0        1   0 1 0 1   0 1           0 1 0 1 
;
;----------------------------------------------------------------
*/

void Remcon_Out(void)
{	
	rRem_Buf[0] = rCustom_Code;	//
	rRem_Buf[1] = ~rCustom_Code;	//
	rRem_Buf[2] = rKey_Data;	//
	rRem_Buf[3] = ~rKey_Data;	//

	rCG_Count	= 0;			// 

	RMR	= 0x5B;			//  0101_1101b			 
	CFHS	= 17;				// carrier high
	CFLS	= 35;				// carrier low  
	RDHR	= 140;			// start pulse high
	if(f_Repeat)
		RDLR	= 36;			// repeat pulse low 
	else	RDLR	= 71;			// start pulse low 

	ROD0	= ON;				// carrier out 
	ROB0	= OFF;			// carrier ON/OFF at next interrupt  
	CGE	= ON;				// Interrupt enable
}

//==================================================================
//	KEy execute 
//==================================================================

//------------------------------------------------------------------ 
//	task	: Select_Key 
//------------------------------------------------------------------ 
void Select_Key(void)			// test 
{
	rMelody_Mode = BEEP_ERROR;	//
}

//------------------------------------------------------------------ 
//	task	: Up Key 
//------------------------------------------------------------------ 
void Up_Key(void)					//
{
	if(rLcd_Mode == MODE_ALRAM)		//
	{	rAlram_Minute++;			//
		if(rAlram_Minute > 59) 		//
			rAlram_Minute = 0;	//
		Alram_Hex_Decimal();		//
	}
	else						// 
	{	rMinute++;				//
		if(rMinute > 59) 			//
			rMinute = 0;		//
		WTR  	= 0xF7;	 		// 0x80 | (119+1) = (1盒) 
		Clock_Hex_Decimal();		//
	}
}

//------------------------------------------------------------------ 
//	task	: Down Key 
//------------------------------------------------------------------ 
void Down_Key(void)				//
{
	if(rLcd_Mode == MODE_ALRAM)		//
	{	rAlram_Hour++;			//
		if(rAlram_Hour > 23) 		//
			rAlram_Hour = 0;		//
		Alram_Hex_Decimal();		//
	}
	else						// 
	{	rHour++;				//
		if (rHour > 23) 			//
			rHour = 0;			// 
		WTR  	= 0xF7;	 		// 0x80 | (119+1) = (1盒) 
		Clock_Hex_Decimal();		//
	}
}
//------------------------------------------------------------------ 
//	task	: Clock Key 
//------------------------------------------------------------------ 
void Clock_Key(void)			//
{
	rLcd_Mode = MODE_CLOCK;		//
}
//------------------------------------------------------------------ 
//	task	: Alarm Key 
//------------------------------------------------------------------ 
void Alarm_Key(void)			//
{
	rLcd_Mode = MODE_ALRAM;		//
}


//==================================================================
//	task	: KEY Process 
//==================================================================
//------------------------------------------------------------------ 
//	task	: Key scan & execute 
//	input	:
//	output: rKey_Data = 0~19
//------------------------------------------------------------------ 

void Process_Key(void)
{
	if (rTimer_4ms[TIME_Key])		//  
		return;				// 

	rTimer_4ms[TIME_Key] = 5;		// 4 x 5 = 20msec 			

	if(rStop_Timer) rStop_Timer--;	// 

	Key_Scan();					//

	if (!(f_Command_Ok)) 			// 
		return;				// key in !

	f_Command_Ok= OFF;			//

	Remcon_Out();				// remote control signal out start !!!

	Key_Display();				//

	rCmd_Count = 12;				// debounce time = 240 ms  
	if (rKey_Command == rKey_Data) 	// ban the repeat key entry 
		return;				//
	rKey_Command = rKey_Data;		// 

	rStop_Timer	= 250;			// STOP mode in after 5sec delay  

	switch(rKey_Command)			//	
	{	
		case  0:
			Select_Key();		//   
		break;

		case  1:
			Up_Key();			//   
		break;

		case  3:
			Down_Key();			//  
		break;

		case  5:
			Clock_Key();		// 
		break;

		case  7:
			Alarm_Key();		// 		
		break;

	}
}							 



//================================================================
//	Remote code Generation Interrupt suvroutine  
//================================================================

//------------------------------------------------------------------ 
//	Bit mask table 
//------------------------------------------------------------------ 
CODE unsigned char CodeBit_tab[] =  
{	
	0x01,		// 0000_0001b		
	0x02,		// 0000_0010b		
	0x04,		// 0000_0100b		
	0x08,		// 0000_1000b		

	0x10,		// 0001_0000b		
	0x20,		// 0010_0000b		
	0x40,		// 0100_0000b		
	0x80		// 1000_0000b		
};

//------------------------------------------------------------------ 
//	Remote Control Signal Interrupt Task
//------------------------------------------------------------------ 

void REM_Int_Handler(void)
{
	if (ROB0) ROB0 = OFF;			//
	else	    ROB0 = ON;			//

	if(ROB0)					// carrier off term 
	{	kTemp = rCG_Count;		//
		if(!(kTemp))			// rCG_Count == 0 ? 
		{	if(f_Repeat)		//
			{	RDLR = 26;		// Repeat pulse carrier off term 
				rCG_Count = 32;	// last pulse out 
				f_Repeat = OFF;	//
			}				// 
			else	RDLR = 71;		// Start pulse carrier off term 
		}
		else					//
		{	kTemp--;					// 
			iTemp = rRem_Buf[kTemp/8];		//544+576  = 1120 (1125)
			if(iTemp & CodeBit_tab[kTemp%8])	//544+1696 = 2440 (2250)
				RDLR = 26;				// Next low 1 
			else	RDLR = 9;				// Next low 0 
		}
		RDHR =  9;				// Next High 
		if (rCG_Count > 32)		// mCG_Count == 29 means END pulse carrier off term  
		{	RMR  = 0x15;		// 0001_0101b = last pulse ??? 
			ROD0 = OFF;			// carrier off 
			CGE  = OFF;			// last stop pulse 
		}					// 
	}
	else	rCG_Count++;			// carrier ON term 
}

//================================================================== 
/*     the End of KEY.c								*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -