This code reads samples from the three highest bits of port 1. It stores consecutive samples in a circular buffer. If all the samples in the buffer are the same, it returns the value of the sample in D7..D5 with D0 set to indicate a stable value.
This is part of a bit-banging scheme to read data on the processor to peripheral bus of an analog cellphone.;********************************************************************* ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; FILE: $Workfile: MBSAMPL.A51 $ ; ; AUTHOR: Timothy Fox ; ; PURPOSE: ; ; ;******************************************************************** ; ; -------------------------------------------------------------------- ; Version control history: ; ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; $NOMOD51 ; $INCLUDE (..\INC\REG52.INC) ; $INCLUDE (..\INC\EQUATE.INC) $REGISTERBANK(0,1,2,3) NAME MBSAMPLE ?MBSAMPL SEGMENT CODE RSEG ?MBSAMPL USING 2 ; EXTRN BIT (TD,CD,RDA) ; P1 EXTRN DATA (PhData1,PhData2,PhData5) R0B2 DATA 010H R1B2 DATA 011H R2B2 DATA 012H R3B2 DATA 013H R4B2 DATA 014H R5B2 DATA 015H R6B2 DATA 016H R7B2 DATA 017H ;mbsample equ PhData1 ;debounce_array equ PhData2 ;// 2..4 ;dba_limit equ PhData5 PUBLIC InitMBSampler InitMBSampler: ;sets constant values into R0 in bank 2, and dba_limit push psw mov psw,#010H push acc mov a,#PhData2 ; get the _address_ of the debounce_array mov R0,a add a,#3 mov PhData5,a ; R0 must always be <= PhData5 pop acc pop psw ret PUBLIC Read_MBUS_state Read_MBUS_state: ;Bank 2 Register usage ;R0 = pointer to byte array in immediate memory ;R4 = loop counter ; push psw mov psw,#010H ; force Bank 2 push acc mov acc,p1 ; get a sample of DATA1..3 anl acc,#0E0H ; mask off everything but DATA1..3 mov @R0,acc ; store this sample inc R0 mov acc,R0 cjne a,PhData5,nowrap mov R0,#PhData2 ; start of debounce array nowrap: push R0B2 ; save rotating pointer (debounce array index) ; now see if all the samples match mov R0,#PhData2 ; point to the start of the debounce array mov R4,#2 ; R4 is now the loop repeat down-counter debounce_loop: mov a,@R0 inc R0 xrl a,@R0 ; compare with the next sample jnz nomatch djnz R4,debounce_loop ; all samples match - reload a sample and set D0 mov acc,@R0 orl acc,#1 nomatch: pop R0B2 mov PhData1,acc pop acc pop psw ret END