목차
본문내용
play in HEX
CALLLCD_COMMAND
DDRAM의 41번지(1010 0001)에 해당하는 둘째 줄 둘째 칸에 A/D변환한 결과를 4자리의 16진수로 표시한다.
MOVAH,BH
MOVAL,BL
CALLLCD_4HEX
LDILCD_BUFFER,0xC9; display in temperature(XX.X)
DDRAM의 49(1010 1001)번지에 해당하는 둘째 줄 아홉 번째 칸에 A/D변환한 결과를 XX.X의 형태로 출력한다.
CALLLCD_COMMAND
LDIAH,high(500); Temp = ADC1*50/512
LDIAL,low(500)
CALLMUL16
AH,AL과 BH,BL의 값을 곱하고 32비트 값의 결과로 저장하게 하기 위한 명령
LDIDH,high(512)
LDIDL,low(512)
CALLDIV16
LDIBL,100
32비트의 BH:BL:AH:AL을 DH:DL로 나누어서 AH:AL 몫, BH:BL 나머지로 설정한다.
CALLDIV8
몫 AH:AL을 BL로 나누어서 몫은 AL, 나머지 AH로 설정
MOVR5,AL; for 7-segment LED
MOVLCD_BUFFER,AL
ORILCD_BUFFER,'0'
CALLLCD_DATA
R5에 컨버젼한 결과의 몫(10^1자리의 수)를 옮겨놓고 LCD에 출력한다.
MOVAL,AH
CLRAH
LDIBL,10
CALLDIV8
연산을 수행한 나머지를 다시 10으로 나누어 몫과 나머지를 분리한다.
MOVR6,AL; for 7-segment LED
MOVLCD_BUFFER,AL
ORILCD_BUFFER,'0'
CALLLCD_DATA
R6에 컨버젼한 결과의 몫(10^0자리의 수)를 옮겨놓고 LCD에 출력한다.
LDILCD_BUFFER,'.'
CALLLCD_DATA
MOVR7,AH; for 7-segment LED
MOVLCD_BUFFER,AH
ORILCD_BUFFER,'0'
CALLLCD_DATA
나머지는 R7에 저장하고 LCD에 표시한다.
A/D 변환의 결과가 0~5V의 입력전압에 대응한다. 대응되는 온도는 A/D 컨버터로 읽어들인 값으로 설정된다.
;------------------------------------------------
;Display Temperature on 7-Segment LED
;------------------------------------------------
LDICL,100; display for 500 ms
LOOP3:MOVAL,R5; ?X.X 'C
CALLBIN2LED
STSLCD_DATABUS,AL
LDIAL,0b01000000
STSDIG_SELECT,AL
CALLD1MS
10의 자리수를 표시한다.
MOVAL,R6; X?.X 'C
CALLBIN2LED
ORIAL,0b00000001
STSLCD_DATABUS,AL
LDIAL,0b00100000
STSDIG_SELECT,AL
CALLD1MS
1의 자리를 표시하고 00000001과 ORI하여 점을 찍는다.
MOVAL,R7; XX.? 'C
CALLBIN2LED
STSLCD_DATABUS,AL
LDIAL,0b00010000
STSDIG_SELECT,AL
CALLD1MS
나머지를 표시한다.
LDIAL,0b01000000; '
STSLCD_DATABUS,AL
LDIAL,0b00001000
STSDIG_SELECT,AL
CALLD1MS
‘ 표시를 출력한다.
LDIAL,0x0C; C
CALLBIN2LED
STSLCD_DATABUS,AL
LDIAL,0b00000100
STSDIG_SELECT,AL
CALLD1MS
C 문자를 출력한다.
LED에 표시할 문자의 모양을 결정하고, 어느 위치의 7세그먼트 LED에 출력할 것인지 결정하고 출력한다.
DECCL
BRNELOOP3
LDIAL,0b00000000; clear 7-segment LED
STSDIG_SELECT,AL
JMPLOOP
;------------------------------------------------
;Convert Binary to 7-segment LED Pattern
;------------------------------------------------
; Input : AL = 8-bit binary(from 0b00000000 to 0b00001111), "-", "."
; Output : AL = 7-segment LED pattern data
BIN2LED:PUSHZH
PUSHZL
CPIAL,'-'; if AL="-", AL=0x10
BRNEBIN2L1
LDIAL,0x10
RJMPBIN2L2
BIN2L1:CPIAL,'.'; if AL=".",AL=0x11
BRNEBIN2L2
LDIAL,0x11
BIN2L2:LDIZH,high(LED_TABLE << 1); Z = start address of LED data
LDIZL,low(LED_TABLE << 1)
ADDZL,AL; Z = Z + AL
CLRAL
ADCZH,AL
LPMAL,Z; read LED data from Z address
POPZL
POPZH
RET
LED_TABLE:; 7-segment LED data table
.db0b11111100,0b01100000; 0,1
.db0b11011010,0b11110010; 2,3
.db0b01100110,0b10110110; 4,5
.db0b10111110,0b11100100; 6,7
.db0b11111110,0b11110110; 8,9
.db0b11101110,0b00111110; A,b
.db0b10011100,0b01111010; C,d
.db0b10011110,0b10001110; E,F
.db0b00000010,0b00000001; -,.
;===================================================================
;Include User Subroutine File
;===================================================================
.include "OK128SUB.INC"; include OK-128 subroutine file
②순서도
CALLLCD_COMMAND
DDRAM의 41번지(1010 0001)에 해당하는 둘째 줄 둘째 칸에 A/D변환한 결과를 4자리의 16진수로 표시한다.
MOVAH,BH
MOVAL,BL
CALLLCD_4HEX
LDILCD_BUFFER,0xC9; display in temperature(XX.X)
DDRAM의 49(1010 1001)번지에 해당하는 둘째 줄 아홉 번째 칸에 A/D변환한 결과를 XX.X의 형태로 출력한다.
CALLLCD_COMMAND
LDIAH,high(500); Temp = ADC1*50/512
LDIAL,low(500)
CALLMUL16
AH,AL과 BH,BL의 값을 곱하고 32비트 값의 결과로 저장하게 하기 위한 명령
LDIDH,high(512)
LDIDL,low(512)
CALLDIV16
LDIBL,100
32비트의 BH:BL:AH:AL을 DH:DL로 나누어서 AH:AL 몫, BH:BL 나머지로 설정한다.
CALLDIV8
몫 AH:AL을 BL로 나누어서 몫은 AL, 나머지 AH로 설정
MOVR5,AL; for 7-segment LED
MOVLCD_BUFFER,AL
ORILCD_BUFFER,'0'
CALLLCD_DATA
R5에 컨버젼한 결과의 몫(10^1자리의 수)를 옮겨놓고 LCD에 출력한다.
MOVAL,AH
CLRAH
LDIBL,10
CALLDIV8
연산을 수행한 나머지를 다시 10으로 나누어 몫과 나머지를 분리한다.
MOVR6,AL; for 7-segment LED
MOVLCD_BUFFER,AL
ORILCD_BUFFER,'0'
CALLLCD_DATA
R6에 컨버젼한 결과의 몫(10^0자리의 수)를 옮겨놓고 LCD에 출력한다.
LDILCD_BUFFER,'.'
CALLLCD_DATA
MOVR7,AH; for 7-segment LED
MOVLCD_BUFFER,AH
ORILCD_BUFFER,'0'
CALLLCD_DATA
나머지는 R7에 저장하고 LCD에 표시한다.
A/D 변환의 결과가 0~5V의 입력전압에 대응한다. 대응되는 온도는 A/D 컨버터로 읽어들인 값으로 설정된다.
;------------------------------------------------
;Display Temperature on 7-Segment LED
;------------------------------------------------
LDICL,100; display for 500 ms
LOOP3:MOVAL,R5; ?X.X 'C
CALLBIN2LED
STSLCD_DATABUS,AL
LDIAL,0b01000000
STSDIG_SELECT,AL
CALLD1MS
10의 자리수를 표시한다.
MOVAL,R6; X?.X 'C
CALLBIN2LED
ORIAL,0b00000001
STSLCD_DATABUS,AL
LDIAL,0b00100000
STSDIG_SELECT,AL
CALLD1MS
1의 자리를 표시하고 00000001과 ORI하여 점을 찍는다.
MOVAL,R7; XX.? 'C
CALLBIN2LED
STSLCD_DATABUS,AL
LDIAL,0b00010000
STSDIG_SELECT,AL
CALLD1MS
나머지를 표시한다.
LDIAL,0b01000000; '
STSLCD_DATABUS,AL
LDIAL,0b00001000
STSDIG_SELECT,AL
CALLD1MS
‘ 표시를 출력한다.
LDIAL,0x0C; C
CALLBIN2LED
STSLCD_DATABUS,AL
LDIAL,0b00000100
STSDIG_SELECT,AL
CALLD1MS
C 문자를 출력한다.
LED에 표시할 문자의 모양을 결정하고, 어느 위치의 7세그먼트 LED에 출력할 것인지 결정하고 출력한다.
DECCL
BRNELOOP3
LDIAL,0b00000000; clear 7-segment LED
STSDIG_SELECT,AL
JMPLOOP
;------------------------------------------------
;Convert Binary to 7-segment LED Pattern
;------------------------------------------------
; Input : AL = 8-bit binary(from 0b00000000 to 0b00001111), "-", "."
; Output : AL = 7-segment LED pattern data
BIN2LED:PUSHZH
PUSHZL
CPIAL,'-'; if AL="-", AL=0x10
BRNEBIN2L1
LDIAL,0x10
RJMPBIN2L2
BIN2L1:CPIAL,'.'; if AL=".",AL=0x11
BRNEBIN2L2
LDIAL,0x11
BIN2L2:LDIZH,high(LED_TABLE << 1); Z = start address of LED data
LDIZL,low(LED_TABLE << 1)
ADDZL,AL; Z = Z + AL
CLRAL
ADCZH,AL
LPMAL,Z; read LED data from Z address
POPZL
POPZH
RET
LED_TABLE:; 7-segment LED data table
.db0b11111100,0b01100000; 0,1
.db0b11011010,0b11110010; 2,3
.db0b01100110,0b10110110; 4,5
.db0b10111110,0b11100100; 6,7
.db0b11111110,0b11110110; 8,9
.db0b11101110,0b00111110; A,b
.db0b10011100,0b01111010; C,d
.db0b10011110,0b10001110; E,F
.db0b00000010,0b00000001; -,.
;===================================================================
;Include User Subroutine File
;===================================================================
.include "OK128SUB.INC"; include OK-128 subroutine file
②순서도