00001 /********************************************************* 00002 * Function: key button driver 00003 * 00004 * File: key.c 00005 * Author: Book Chen 00006 * Date 2009.07.06 00007 *********************************************************** 00008 */ 00009 #include "includes.h" 00010 00011 #define KeyIdleState 0 00012 #define KeyReleaseState 1 00013 #define KeyPressTransitionState 2 00014 #define KeyPressState 3 00015 #define KeyReleaseTransitionState 4 00016 00017 #define Keys PORTA 00018 00019 KEY_CONTROL KeyCtrl; 00020 /***************** 00021 * KeyInit: 00022 * Initialize variables for key input 00023 ****************** 00024 */ 00025 void KeyInit(void){ 00026 //PORTA is set to gpio in gpio.c 00027 TRISA=0x3f; //set all porta pins input 00028 KeyCtrl.HasKey=FALSE; 00029 KeyCtrl.State=KeyReleaseState; 00030 KeyCtrl.Timer=2; 00031 } 00032 /***************** 00033 * KeySvc: 00034 * Service key input events 00035 ****************** 00036 */ 00037 void KeySvc(void){ 00038 if(KeyCtrl.State==KeyIdleState) return; // key is not in use 00039 if(KeyCtrl.Timer!=0) return; 00040 KeyCtrl.Timer=1; 00041 switch(KeyCtrl.State){ 00042 case KeyReleaseState: 00043 if((Keys&0x3f)!=0x3f){ 00044 //DebugStringPrint("0."); 00045 KeyCtrl.KeyValue=Keys&0x3f; 00046 KeyCtrl.ReadKeyCounter=0; 00047 KeyCtrl.HitKeyCounter=0; 00048 KeyCtrl.State=KeyPressTransitionState; 00049 } 00050 break; 00051 case KeyPressTransitionState: 00052 if((Keys&0x3f)!=0x3f){ 00053 if((Keys&0x3f)==KeyCtrl.KeyValue){ 00054 //DebugStringPrint("1."); 00055 KeyCtrl.HitKeyCounter++; 00056 } 00057 else{ 00058 KeyCtrl.KeyValue=Keys&0x3f; 00059 KeyCtrl.HitKeyCounter=0; // reset HitKeyCounter 00060 } 00061 } 00062 KeyCtrl.ReadKeyCounter++; 00063 if(KeyCtrl.ReadKeyCounter>=KEY_DEBOUNCE_NUMBER){ 00064 if(KeyCtrl.HitKeyCounter>=KEY_ACCEPT_NUMBER){ 00065 //DebugStringPrint("2."); 00066 if(KeyCtrl.HasKey==FALSE){ 00067 //DebugStringPrint("3."); 00068 KeyCtrl.HasKey=TRUE; 00069 KeyCtrl.HasKeyValue=KeyCtrl.KeyValue; 00070 KeyCtrl.State=KeyPressState; 00071 } 00072 else{ 00073 KeyCtrl.State=KeyPressState; 00074 } 00075 } 00076 else{ 00077 KeyCtrl.State=KeyReleaseState; 00078 } 00079 } 00080 break; 00081 case KeyPressState: 00082 if((Keys&0x3f)!=KeyCtrl.HasKeyValue){ 00083 KeyCtrl.ReadKeyCounter=0; 00084 KeyCtrl.HitKeyCounter=0; 00085 KeyCtrl.State=KeyReleaseTransitionState; 00086 } 00087 else{ 00088 // time delay for key repeat 00089 } 00090 break; 00091 case KeyReleaseTransitionState: 00092 KeyCtrl.ReadKeyCounter++; 00093 if((Keys&0x3f)!=0x3f){ 00094 if(KeyCtrl.ReadKeyCounter>=KEY_DEBOUNCE_NUMBER){ 00095 KeyCtrl.ReadKeyCounter=0; 00096 KeyCtrl.HitKeyCounter=0; 00097 } 00098 } 00099 else{ 00100 KeyCtrl.HitKeyCounter++; 00101 if(KeyCtrl.ReadKeyCounter>=KEY_DEBOUNCE_NUMBER){ 00102 if(KeyCtrl.HitKeyCounter>=KEY_ACCEPT_NUMBER){ 00103 KeyCtrl.State=KeyReleaseState; 00104 } 00105 else{ 00106 KeyCtrl.ReadKeyCounter=0; 00107 KeyCtrl.HitKeyCounter=0; 00108 } 00109 } 00110 } 00111 break; 00112 } 00113 } 00114 /***************** 00115 * KeyReset: 00116 * Reset variables for key input 00117 ****************** 00118 */ 00119 void KeyReset(void){ 00120 //PORTA is set to gpio in gpio.c 00121 TRISA=0x3f; //set all porta pins input 00122 KeyCtrl.HasKey=FALSE; 00123 KeyCtrl.State=KeyReleaseState; 00124 KeyCtrl.Timer=1; 00125 } 00126 /***************** 00127 * KeyRun: 00128 * Run key service 00129 ****************** 00130 */ 00131 void KeyRun(void){ 00132 KeyCtrl.State=KeyReleaseState; 00133 } 00134 /***************** 00135 * KeyStatusCheck: 00136 * Check if any key is in. 00137 ****************** 00138 */ 00139 BOOL KeyStatusCheck(void){ 00140 if(KeyCtrl.HasKey==TRUE) return TRUE; 00141 else return FALSE; 00142 } 00143 /***************** 00144 * KeyGet: 00145 * Get current key Value 00146 ****************** 00147 */ 00148 INT8U KeyGet(void){ 00149 if(KeyCtrl.HasKey==TRUE){ 00150 KeyCtrl.HasKey=FALSE; 00151 return KeyCtrl.HasKeyValue; 00152 } 00153 else return 0; 00154 }