📄 key.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 + -