|
;KEY PAD<br />;------------------------------------------------------------------------------------------<br />;output: PD0 PA3 PA2 PA1 PA0 ;------------------------------------------------------------------------------------------<br />;KeyValue: | input:<br />; 32 24 16 8 0 | PB0<br />; 33 25 17 9 1 | PB1<br />; 34 26 18 10 2 | PB2<br />; 35 27 19 11 3 | PB3<br />; 36 28 20 12 4 | PC0<br />; 37 29 21 13 5 | PC1<br />; 38 30 22 14 6 | PC2<br />; 39 31 23 15 7 | PC3<br />;==========================================================================================<br />KEY_DEBOUNCE_TIMER EQU 32 ;adjust sensitive here(20ms)<br />;--------------------------------------------------------------------------------------<br />ScanKeyIO: <br /> ; set PD0=0 and then accumulate the value of PB & PC <br /> ;then set PA3=0 and then accumulate the value of PB & PC<br /> ;then set PA2=0 and then accumulate the value of PB & PC<br /> ;then set PA1=0 and then accumulate the value of PB & PC<br /> ;then set PA0=0 and then accumulate the value of PB & PC<br /> ;at last the accumulated value is save in zKeyTMP[H,L] regs and its regards <br /> ;as current keyState<br /> ;---------scan the key ----------- <br /> ldi zKeyTMP_L ,0x00<br /> ldi zKeyTMP_H ,0x00 <br /> ;-------------------------------------<br /> ;PA0:<br /> ldi rzPDOUT ,0000b ;PA0 output low,others all float<br /> ldi rzPD ,0000b<br /> ldi rzPAOUT ,0001b<br /> ldi rzPA ,0000b <br /> call AccumulateMatrixKey<br /> ;PA1:<br /> ;ldi rzPDOUT ,0000b ;PA1 output low,others all float<br /> ;ldi rzPD ,0000b<br /> ldi rzPAOUT ,0010b<br /> ldi rzPA ,0000b <br /> call AccumulateMatrixKey <br /> ;PA2:<br /> ;ldi rzPDOUT ,0000b ;PA2 output low,others all float<br /> ;ldi rzPD ,0000b<br /> ldi rzPAOUT ,0100b<br /> ldi rzPA ,0000b <br /> call AccumulateMatrixKey <br /> ;PA3:<br /> ;ldi rzPDOUT ,0000b ;PA3 output low,others all float<br /> ;ldi rzPD ,0000b<br /> ldi rzPAOUT ,1000b<br /> ldi rzPA ,0000b <br /> call AccumulateMatrixKey <br /> ;PD0: <br /> ldi rzPDOUT ,0001b ;PD0 output low,others all float<br /> ldi rzPD ,0000b<br /> ldi rzPAOUT ,0000b <br /> ldi rzPA ,0000b<br /> call AccumulateMatrixKey<br /> ;all float<br /> ldi rzPDOUT ,0000b <br /> ldi rzPD ,0000b<br /> ;ldi rzPAOUT ,0000b<br /> ;ldi rzPA ,0000b <br /> ;----- Result save in zKeyTMP-------<br /> lda zKeyTMP_H ,0<br /> rtni <br />;-------------------------------------------------------------------------------------- <br />AccumulateMatrixKey:<br /> ;init all input port<br /> ldi rzPB ,1111b<br /> ldi rzPC ,1111b<br /> ;------------------------------------------ <br /> lda rzPB ,0<br /> nop<br /> addm zKeyTMP_L ,0<br /> eor zKeyTMP_L ,0<br /> adcm zKeyTMP_H ,0<br /> lda rzPC ,0<br /> nop<br /> addm zKeyTMP_L ,0<br /> eor zKeyTMP_L ,0<br /> adcm zKeyTMP_H ,0<br /> ;------------------------------------------<br /> rtni <br />;-----------------------------------------------------------------------------------------<br />ReadKeyValue: <br /> ;init all input port<br /> ldi rzPB ,1111b<br /> ldi rzPC ,1111b <br /> ;------------------------------------------ <br /> ldi zKShiftCount ,0x00 <br /> ?loadKeyValue: <br /> lda rzPB ,0<br /> nop<br /> sta zKTmpL ,0<br /> lda rzPC ,0<br /> nop<br /> sta zKTmpH ,0 <br /> eorim zKTmpL ,1111b<br /> eorim zKTmpH ,1111b<br /> ?shiftKeyValue:<br /> adim zKIndex ,0x01<br /> eor zKIndex ,0<br /> adcm zKIndexH ,0<br /> ;shift right one bit<br /> lda zKTmpL ,0<br /> shr<br /> sta zKTmpL ,0<br /> bc ?saveKeyValue<br /> ?continueShiftKeyValue:<br /> lda zKTmpH ,0<br /> ba0 $+2<br /> jmp $+2<br /> orim zKTmpL ,1000b<br /> lda zKTmpH ,0<br /> shr<br /> sta zKTmpH ,0<br /> jmp ?nextBit<br /> ?saveKeyValue: <br /> adim zKPressCount ,0x01<br /> sbi zKPressCount ,0x01<br /> baz ?saveKeyValue1<br /> sbi zKPressCount ,0x02<br /> baz ?saveKeyValue2<br /> sbi zKPressCount ,0x03<br /> baz ?saveKeyValue3<br /> ?moreThanThreeKeys: ;prevent zKPressCount overflow <br /> ldi zKPressCount ,0x04<br /> jmp ?continueShiftKeyValue <br /> ?saveKeyValue3: <br /> lda zKIndex ,0<br /> sta zKeyValue_L3 ,0<br /> lda zKIndexH ,0<br /> sta zKeyValue_H3 ,0<br /> jmp ?continueShiftKeyValue <br /> ?saveKeyValue2: <br /> lda zKIndex ,0<br /> sta zKeyValue_L2 ,0<br /> lda zKIndexH ,0<br /> sta zKeyValue_H2 ,0<br /> jmp ?continueShiftKeyValue <br /> ?saveKeyValue1: <br /> lda zKIndex ,0<br /> sta zKeyValue_L ,0<br /> lda zKIndexH ,0<br /> sta zKeyValue_H ,0<br /> jmp ?continueShiftKeyValue<br /> ?nextBit:<br /> adim zKShiftCount ,0x01<br /> ?judgeFinish:<br /> sbi zKShiftCount ,0x08<br /> bnz ?shiftKeyValue <br /> rtni <br />;======================================================================================<br />; ScanKey<br />;====================================================================================== <br />ScanKey:<br /> ;prepare to scan key<br /> ldi rzPAOUT ,0000b <br /> ldi rzPA ,1111b<br /> ldi rzPDOUT ,0000b <br /> ldi rzPD ,0011b<br /> ldi rzPBOUT ,0000b <br /> ldi rzPB ,1111b<br /> ldi rzPCOUT ,0000b <br /> ldi rzPC ,1111b <br /> ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br /> ;whether ever get different key value than the last key state<br /> lda zKdebounce ,0 <br /> ;yes,check whether maintain stable<br /> ba0 ContinueScanKey <br /> ;no,check whether get different Key value <br />LookUpKeyState: <br /> call ScanKeyIO <br /> ;lda zKeyTMP_H ,0<br /> eor zKeyState_H ,0 <br /> ;if different from the last stable state<br /> bnz BeginScanKey <br /> lda zKeyTMP_L ,0<br /> eor zKeyState_L ,0 <br /> ;if different from the last stable state<br /> bnz BeginScanKey <br /> ;if equal to the last state <br /> jmp Finish_ScanKey<br />BeginScanKey:<br /> ;save current state to zKeyState buffer<br /> lda zKeyTMP_L ,0<br /> sta zKeyState_L ,0 <br /> lda zKeyTMP_H ,0<br /> sta zKeyState_H ,0 <br /> ;----- Reload Debounce counter and clear debounce done flag -----<br /> ldi zKeyPeriod_H ,(KEY_DEBOUNCE_TIMER>>4)&0x0f<br /> ldi zKeyPeriod_L ,(KEY_DEBOUNCE_TIMER )&0x0f<br /> ;----------------------------------------------------------------<br /> ;mark ever get different Key value than the last Key state flag<br /> orim zKdebounce ,0001b <br /> jmp Finish_ScanKey ;exit <br />ContinueScanKey:<br /> call ScanKeyIO <br /> ;lda zKeyTMP_H ,0<br /> eor zKeyState_H ,0 <br /> ;if different from the last stable state again<br /> bnz BeginScanKey <br /> lda zKeyTMP_L ,0<br /> eor zKeyState_L ,0 <br /> ;if different from the last stable state again<br /> bnz BeginScanKey <br /> ;if still equal to the last state<br />DebounceScanKey:<br /> ;the key state must be stable here<br /> ;Judge whether finish debouncing work.<br /> sbim zKeyPeriod_L ,01h<br /> eor zKeyPeriod_L ,0<br /> sbcm zKeyPeriod_H ,0<br /> bnc VerifyKeyValue<br /> jmp Finish_ScanKey<br />VerifyKeyValue:<br /> ; andim zKdebounce ,1110b<br /> ; ;prevent enter ISR and send the wrong code while the key value is being <br /> ; ;determined below.<br /> ; andim zKeyPressFlag ,0011b <br /> andim zKeyPressFlag ,0010b<br />;----------------------------------------------------------------------------------------<br />GetKeyValue:<br /> zKIndex EQU zKeyPeriod_L ;key code table index<br /> zKIndexH EQU zKeyPeriod_H ;<br /> zKTmpL EQU zWk0 ;current port state<br /> zKTmpH EQU zWk1 ;current port state<br /> zKShiftCount EQU zWk2 ;<br /> zKPressCount EQU zWk3 ;how many key is press<br /> ldi zKPressCount ,0x00<br /> ldi zKIndex ,0x0f<br /> ldi zKIndexH ,0x0f<br /> ;ScanPA0:<br /> ldi rzPDOUT ,0000b ;PA0 out put low,others float<br /> ldi rzPD ,0000b<br /> ldi rzPAOUT ,0001b<br /> ldi rzPA ,0000b <br /> call ReadKeyValue<br /> ;ScanPA1:<br /> ;ldi rzPDOUT ,0000b ;PA1 out put low,others float<br /> ;ldi rzPD ,0000b<br /> ldi rzPAOUT ,0010b<br /> ldi rzPA ,0000b <br /> call ReadKeyValue<br /> ;ScanPA2:<br /> ;ldi rzPDOUT ,0000b ;PA2 out put low,others float<br /> ;ldi rzPD ,0000b<br /> ldi rzPAOUT ,0100b<br /> ldi rzPA ,0000b <br /> call ReadKeyValue <br /> ;ScanPA3:<br /> ;ldi rzPDOUT ,0000b ;PA3 out put low,others float<br /> ;ldi rzPD ,0000b<br /> ldi rzPAOUT ,1000b<br /> ldi rzPA ,0000b <br /> call ReadKeyValue<br /> ;ScanPD0:<br /> ldi rzPDOUT ,0001b ;PD0 out put low,others float<br /> ldi rzPD ,0000b<br /> ldi rzPAOUT ,0000b<br /> ldi rzPA ,0000b <br /> call ReadKeyValue <br /> ;all float <br /> ldi rzPDOUT ,0000b <br /> ldi rzPD ,0000b<br /> ;ldi rzPAOUT ,0000b<br /> ;ldi rzPA ,0000b <br />;----------------------------------------------------------------------------------------<br />JudgeKeyValue:<br /> lda zPoweronEntry ,0<br /> bnz ContinuePowerOn<br />FirstPowerOn:<br /> sbi zKPressCount ,0x03<br /> bnz ?customerMode<br /> sbi zKeyValue_L ,(KEY25_INDEX)&0x0f<br /> bnz ?customerMode<br /> sbi zKeyValue_H ,(KEY25_INDEX>>4)&0x0f<br /> bnz ?customerMode<br /> sbi zKeyValue_L2 ,(KEY26_INDEX)&0x0f<br /> bnz ?customerMode<br /> sbi zKeyValue_H2 ,(KEY26_INDEX>>4)&0x0f<br /> bnz ?customerMode<br /> sbi zKeyValue_L3 ,(KEY27_INDEX)&0x0f<br /> bnz ?customerMode<br /> sbi zKeyValue_H3 ,(KEY27_INDEX>>4)&0x0f<br /> bnz ?customerMode<br />?factoryMode:<br /> orim zMode ,0100b<br /> jmp ?next<br />?customerMode:<br /> andim zMode ,1011b<br />?next: <br /> ldi zPoweronEntry ,0x0f<br />;------------------------------------------------------------------------------------------<br />ContinuePowerOn:<br /> lda zKPressCount ,0<br /> baz ReleaseAllKey<br /> sbi zKPressCount ,0x01<br /> baz PressOneKey<br />PressMultiKey: <br />PressInvalidKey:<br /> ; ;since multi key or invalid key,the request to return to customer mode is<br /> ; ;inefficacy<br /> ; andim zKeyPressFlag ,1101b <br /> ; ;set invalid key press<br /> ; orim zKeyPressFlag ,1000b<br /> ldi zKeyPressFlag ,1000b<br /> jmp Finish_ScanKey<br />PressOneKey: <br /> ;set back to customer mode request<br /> sbi zOption ,RC2143801<br /> bnz ?36key<br /> ?38key: <br /> sbi zKeyValue_L ,(KEY38_INDEX)&0x0f<br /> bnz ?next<br /> sbi zKeyValue_H ,(KEY38_INDEX>>4)&0x0f<br /> bnz ?next<br /> jmp ?setReturnCustomerRequest <br /> ?36key: <br /> sbi zKeyValue_L ,(KEY36_INDEX)&0x0f<br /> bnz ?next<br /> sbi zKeyValue_H ,(KEY36_INDEX>>4)&0x0f<br /> bnz ?next<br /> ?setReturnCustomerRequest: <br /> orim zKeyPressFlag ,0010b<br /> ?next: <br /> ;invert toggle bit<br /> eorim zToggle ,1000b<br /> ;set valid key press<br /> orim zKeyPressFlag ,0100b <br /> jmp Finish_ScanKey<br />ReleaseAllKey: <br /> ;return customer mode<br /> lda zKeyPressFlag ,0<br /> ba1 $+2<br /> jmp $+2<br /> ;set current mode as customer mode<br /> andim zMode ,1011b <br /> ; ;clear back to custom mode request<br /> ; andim zKeyPressFlag ,1101b <br /> ldi zKeyPressFlag ,0000b<br />;-----------------------------------------------------------------------------------------<br />Finish_ScanKey: <br /> jmp Exit_ScanKey<br />;----------------------------------END-----------------------------------------------------
|