본문내용
#########################################################################################
Bits8ToBCDmovBCD3Reg+1,#00H;3-digit BCD 초기화
movTmpReg,a;TmpReg 비트 어드레싱 가능할 것
anlA,#0FH;하위 4비트를 십진수로 변경하기 위한 매스킹
clrAC;보조캐리 클리어 :DA는 C,AC에 영향 받음
clrC;캐리 클리어
daA;하위 4 비트를 십진수로 변경
jnbTmpReg.4,Tmp5Bit
adda,#16H;2^5 = 16
daa
Tmp5BitjnbTmpReg.5,Tmp6Bit
adda,#32H;2^6 =32
daa
Tmp6BitjnbTmpReg.6,Tmp7Bit
adda,#64H;2^7 = 64
daa
jncTmp7Bit
incBCD3Reg+1
Tmp7BitjnbTmpReg.7,SaveBCD0
incBCD3Reg+1;2^7=128의 100
addA,#28H
daa
jncSaveBCD0;캐리 발생?
incBCD3Reg+1
SaveBCD0movBCD3Reg,a;1의 자리값 저장
ret
;#######################################################################################################
;타이머/카운터 0의 인터럽트 처리 프로그램
;레지스터 뱅크 1의 R2를 7-세그먼트 표시 포인터로 사용
;R0에 다음에 표시될 FND 주소가 저장되어 있음
;#######################################################################################################
Tmr0IntSrcmovTH0,#Tmr0Val;TH0 초기값 재설정
pushACC;어큐뮬레이터 저장
pushPSW;PSW 저장
setbRS0;레지스터 뱅크 1로 설정
movFndPort,@R0;((R0)) -> 7-세그먼트 포트
incR0;7-세그먼트 포인터 업데이트
cjneR0,#FND+FndDigit,ExtTmr0Int
movR0,#FND;표시 포인터 초기화
ExtTmr0IntdecDelayReg;지연시간레지스터 업데이트
popPSW;PSW 복원
popACC;어큐뮬레이터 복원
reti;메인프로그램으로 복귀
;#######################################################################################################
;20mS 지연시간 설정
;#######################################################################################################
Wait20m mov DelayReg,#KeyDlyVal;20mS 지연시간 설정
Wait20mSLpmovA,DelayReg
jnzWait20mSLp;DelayReg ==0 일때까지 기다림
ret
;#######################################################################################################
;키 입력 확인
;#######################################################################################################
Key_Inputcall Wait20m
anlKeyPort,#0FH;종방향출력단자을 모두 0으로 출력
nop;안정적으로 읽기 위한 시간 지연
movA,KeyPort;횡방향입력단자 읽기
cplA;A <- (!A)
anlA,#0FH;횡방향 데이터만 선택
ret
;#######################################################################################################
;키를 스캔하여 키값을 결정하는 서브루틴
;사용 레지스터 : B,R6,R7
;출력 : Acc에 키값 저장
;#######################################################################################################
KeyScancall Wait20m
movA,KeyPort;횡방향입력단자 다시 읽기
cplA;A <- (!A)
anlA,#0FH;횡방향 데이터만 선택
jnzDectRowSwx;A=0이면 키가 눌러지지 않음
ret
DectRowSwxmovR6,A;횡방향 스캔값 결정:R6
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
movA,#7FH;종방향 0111
movR7,#04;R7 = 컬럼 수
ColScanLoopmovKeyPort,A;스캔 패턴 출력
xchA,B;스캔패턴 저장:B
movA,KeyPort;횡방향입력단자 읽기
cplA;A <- (!A)
anlA,#0FH;횡방향 데이터만 선택
jnzColDetected;A !=0이면 키가 눌러짐
xchA,B;스캔 패턴 가져오기:B
rrA;다음 스캔 패턴 만들기
djnzR7,ColScanLoop ;4번 수행?
ret;키가 눌러지지 않음
ColDetecteddecR7;col 값 = (R2)-1
movA,R6;(A) <- 횡스캔 값
movR5,#00
jbACC.0,RowDetected ;첫번째 횡방향 비트
incR5
jbACC.1,RowDetected ;두번째 횡방향 비트
incR5
jbACC.2,RowDetected ;세번째 횡방향 비트
incR5
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
RowDetectedmovA,R5;(A)=횡방향 비트 번호
movB,#04;4*횡방향 비트번호(0-3)
mul AB;A=LS Byte, B=MS byte
addA,R7;4*횡방향 비트번호 + 종방향값
mov R4,A
ret
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
END
Bits8ToBCDmovBCD3Reg+1,#00H;3-digit BCD 초기화
movTmpReg,a;TmpReg 비트 어드레싱 가능할 것
anlA,#0FH;하위 4비트를 십진수로 변경하기 위한 매스킹
clrAC;보조캐리 클리어 :DA는 C,AC에 영향 받음
clrC;캐리 클리어
daA;하위 4 비트를 십진수로 변경
jnbTmpReg.4,Tmp5Bit
adda,#16H;2^5 = 16
daa
Tmp5BitjnbTmpReg.5,Tmp6Bit
adda,#32H;2^6 =32
daa
Tmp6BitjnbTmpReg.6,Tmp7Bit
adda,#64H;2^7 = 64
daa
jncTmp7Bit
incBCD3Reg+1
Tmp7BitjnbTmpReg.7,SaveBCD0
incBCD3Reg+1;2^7=128의 100
addA,#28H
daa
jncSaveBCD0;캐리 발생?
incBCD3Reg+1
SaveBCD0movBCD3Reg,a;1의 자리값 저장
ret
;#######################################################################################################
;타이머/카운터 0의 인터럽트 처리 프로그램
;레지스터 뱅크 1의 R2를 7-세그먼트 표시 포인터로 사용
;R0에 다음에 표시될 FND 주소가 저장되어 있음
;#######################################################################################################
Tmr0IntSrcmovTH0,#Tmr0Val;TH0 초기값 재설정
pushACC;어큐뮬레이터 저장
pushPSW;PSW 저장
setbRS0;레지스터 뱅크 1로 설정
movFndPort,@R0;((R0)) -> 7-세그먼트 포트
incR0;7-세그먼트 포인터 업데이트
cjneR0,#FND+FndDigit,ExtTmr0Int
movR0,#FND;표시 포인터 초기화
ExtTmr0IntdecDelayReg;지연시간레지스터 업데이트
popPSW;PSW 복원
popACC;어큐뮬레이터 복원
reti;메인프로그램으로 복귀
;#######################################################################################################
;20mS 지연시간 설정
;#######################################################################################################
Wait20m mov DelayReg,#KeyDlyVal;20mS 지연시간 설정
Wait20mSLpmovA,DelayReg
jnzWait20mSLp;DelayReg ==0 일때까지 기다림
ret
;#######################################################################################################
;키 입력 확인
;#######################################################################################################
Key_Inputcall Wait20m
anlKeyPort,#0FH;종방향출력단자을 모두 0으로 출력
nop;안정적으로 읽기 위한 시간 지연
movA,KeyPort;횡방향입력단자 읽기
cplA;A <- (!A)
anlA,#0FH;횡방향 데이터만 선택
ret
;#######################################################################################################
;키를 스캔하여 키값을 결정하는 서브루틴
;사용 레지스터 : B,R6,R7
;출력 : Acc에 키값 저장
;#######################################################################################################
KeyScancall Wait20m
movA,KeyPort;횡방향입력단자 다시 읽기
cplA;A <- (!A)
anlA,#0FH;횡방향 데이터만 선택
jnzDectRowSwx;A=0이면 키가 눌러지지 않음
ret
DectRowSwxmovR6,A;횡방향 스캔값 결정:R6
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
movA,#7FH;종방향 0111
movR7,#04;R7 = 컬럼 수
ColScanLoopmovKeyPort,A;스캔 패턴 출력
xchA,B;스캔패턴 저장:B
movA,KeyPort;횡방향입력단자 읽기
cplA;A <- (!A)
anlA,#0FH;횡방향 데이터만 선택
jnzColDetected;A !=0이면 키가 눌러짐
xchA,B;스캔 패턴 가져오기:B
rrA;다음 스캔 패턴 만들기
djnzR7,ColScanLoop ;4번 수행?
ret;키가 눌러지지 않음
ColDetecteddecR7;col 값 = (R2)-1
movA,R6;(A) <- 횡스캔 값
movR5,#00
jbACC.0,RowDetected ;첫번째 횡방향 비트
incR5
jbACC.1,RowDetected ;두번째 횡방향 비트
incR5
jbACC.2,RowDetected ;세번째 횡방향 비트
incR5
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
RowDetectedmovA,R5;(A)=횡방향 비트 번호
movB,#04;4*횡방향 비트번호(0-3)
mul AB;A=LS Byte, B=MS byte
addA,R7;4*횡방향 비트번호 + 종방향값
mov R4,A
ret
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
END
소개글