[ บทความ : Lib11 ]

จากการที่ผมเขียนโปรแกรมกับ 68HC811E2 มาบ้างพอสมควร ผมพบว่า ตัวอย่างที่ได้มาจากทาง ETT นั้นมีประโยชน์มาก แต่ว่า มันไม่ได้ถูกเรียบเรียงให้เป็นเรื่องเป็นราว ผมเลยถือโอกาส เอาฟังก์ชันมาปรับปรุง และรวบรวมใหม่เสียเลย จนเป็นที่มาของ Lib11 คิดว่าคงมีประโยชน์แก่ผู้อ่านบ้างพอสมควรนะครับ ... ส่วนรายละเอียดว่าโปรแกรมย่อยแต่ละอัน ทำหน้าที่อะไรนั้น ผมก็ได้เขียนคำอธิบาย แบบย่อ ๆ เอาไว้ให้แล้วครับ ... ก็หวังว่า Lib11คงช่วยให้ผู้ที่สนใจเขียนโปรแกรมกับ 68HC811E2 ด้วยภาษาแอสเซมบลี เอาไว้เป็น ตัวอย่าง หรือปรับปรุงได้ตามความต้องการครับ
รายละเอียดของ Lib11 เป็นดังนี้ครับ
	;**************************************
	;
	; Filename  : lib11.asm
	; Assembler : as11new
	;
	;**************************************

	            ORG     $F800

	            JMP     main

	; ------ Constant

	L4PORT      EQU     $1004           ; LCD Port (PortB)
	L4BUFF      EQU     $00             ; LCD Buffer Write Port
	L4DATA      EQU     $01             ; LCD Data Buffer

	PORTB       EQU     $1003
	PORTC       EQU     $1004

	BAUD        EQU     $102B           ; SCI Baud rate control Reg.
	SCCR1       EQU     $102C           ; SCI Control Register1
	SCCR2       EQU     $102D           ; SCI Control Register2
	SCSR        EQU     $102E           ; SCI Status Register
	SCDR        EQU     $102F           ; SCI Data (RDR=Read,TDR=Write)
	
	ADCTL       EQU     $1030           ; ADC Control Register
	ADR1        EQU     $1031           ; ADC Result Register1
	ADR2        EQU     $1032           ; ADC Result Register2
	ADR3        EQU     $1033           ; ADC Result Register3
	ADR4        EQU     $1034           ; ADC Result Register4
	OPTION      EQU     $1039
	
	CONFIG      EQU     $103F           ; Config Register
	
	; ---- Function call
	;
	; Hex2Asc   = Convert hex value in reg A to 2 digit ascii.
	; H2A       = Convert hex (0-F) to ascii.
	; Hex2Bin   = Convert hex ASCII to binary value.
	;
	; Init9600  = Initial RS232 with 9600bps
	; Init1200  = Initial RS232 with 1200bps
	; InitSCI   = Initial RS232 baud rate.
	;
	; ToUpper   = Convert ASCII alphabet to upper case.
	;
	; PutCh     = Send 1 BYTE to SCI port
	; GetCh     = Recieve 1 Byte from SCI port
	;
	; Delay5ms  = Delay 5 milisecond.
	; Delay10ms = Delay 10 milisecond.
	;
	; L4Init    = Initial LCD with 4 bit operation.
	; L4Cmd     = Send command to LCD.
	; L4PutCh   = Send 1 ASCII to LCD.
	; L4Goto    = Move LCD cursor position.
	; L4Write   = Write 1 line to LCD (must use ascii $00 for finish).
	;
	; ---- End of function call
	
	
	;**************************************
	;* Function = Convert hex value  in reg.A to 2 ascii
	;* INPUT    =  A                 
	;* OUTPUT   =  A = hi-byte       
	;*             B = low-byte      
	;**************************************
	
	Hex2Asc     PSHA
	            JSR     H2A
	            TAB                 ; transfer B <- A (B = Lo byte)
	            PULA
	            RORA                ; swap A
	            RORA
	            RORA
	            RORA
	            JSR     H2A
	            RTS
	
	;**************************************
	;*  Convert hex (0-F) to ascii       
	;*  INPUT   = Reg.A contain hex value
	;*  OUTPUT  = reg.A in ascii format  
	;**************************************
	
	H2A         CLC                 ; clear carry bit
	            ANDA    #%00001111
	            CMPA    #$09
	            BNE     H2A1
	            SEC                 ; set carry bit
	H2A1        BCC     H2A2       ; > 0AH
	            ORAA    #$30        ;< 0AH
	            JMP     EndH2A 
	H2A2        SBCA    #$09        ;> 0AH
	            ORAA    #$40
	EndH2A      RTS
	
	
	;**************************************
	;* Initialize RS232 with 9600 bps, Data 8, 1 stop
	;**************************************
	
	Init9600    LDAA    #%00110000  ; Set Baud rate 9600
	            JSR     InitSCI 
	
	;**************************************
	;* Initialize RS232 with 1200 bps, Data 8, 1 stop
	;**************************************

	Init1200    LDAA    #%00110011  ; Set Baud rate 1200
	            JSR     InitSCI 
	
	;**************************************
	;* Initialize the SCI for 68HC11 with 8MHz
	;* Input : reg A = Baud rate value.
	;**************************************
	
	InitSCI     STAA    BAUD
	            LDAA    #$00
	            STAA    SCCR1       ; Set 8bit data,1 Stop bit
	            LDAA    #$0C        ; Enable RXD,TXD pin
	            STAA    SCCR2
	            RTS
	
	;**************************************
	;* Convert to  Upper case
	;**************************************
	            ;
	ToUpper     CMPA #'a'
	            BLT  ToUpper1       ; jump if < a
	            CMPA #'z'
	            BGT  ToUpper1       ; jump if > z
	            SUBA #$20           ; convert
	ToUpper1    RTS
	
	
	;**************************************
	;*  Transmit ASCII 1byte to SCI  
	;*  Input    : A (ASCII Code)    
	;*  Output   : ASCII to SCI Port 
	;*  Register : A,B               
	;**************************************
	
	PutCh       PSHB
	PutCh1      LDAB    SCSR        ; read status
	            BITB    #$80
	            BEQ     PutCh1      ; wait ready to send (TDRE=1)
	            STAA    SCDR        ; send character
	            PULB
	            RTS
	
	;**************************************
	;*  Receive data from SCI  
	;*  INPUT   :  SCI Port    
	;*  OUTPUT  :  ACC         
	;**************************************
	
	GetCh       LDAA    SCSR        ; read status reg
	            ANDA    #$20        ; check rdrf
	            BEQ     GetCh       ; jump if no data
	            LDAA    SCDR        ; read data
	            RTS
	
	
	;**************************************
	;* Convert HEX to BINARY
	;* Input  : ACC (ASCII) 
	;* Output : ACC (Binary)
	;**************************************
	
	Hex2Bin     CMPA    #"0"
	            BLT     HEXRTS              ; Jump if A < $30
	            CMPA    #"9"
	            BLE     HEXNMB              ; Jump if A is Number 0-9
	            CMPA    #"A"
	            BLT     HEXRTS              ; Jump if $39> A <$41
	            CMPA    #"F"
	            BGT     HEXRTS              ; jump if A > $46
	            ADDA    #09H                ; convert $A-$F
	HEXNMB      ANDA    #0FH                ; convert to binary
	HEXRTS      RTS
	
	
	;**************************************
	;*  Delay 10 mSec at E=2MHz 
	;**************************************
	
	Delay10ms   PSHX
	            LDX     #$0D06      ; 10 mSec counter
	Delay10     DEX
	            BNE     Delay10
	            PULX
	            RTS
	
	
	;**************************************
	;* (Delay 5 mSec)   
	;**************************************
	
	Delay5ms    PSHX
	            LDX     #$0632       ; 5 mSec counter
	Delay5      DEX
	            BNE     Delay5
	            PULX
	            RTS
	
	
	;**************************************
	;*   Initial LCD   : 4-Bit Interface 
	;**************************************
	L4Init      LDAA    #$33                    ; Set DL=1 3-time
	            JSR     L4Cmd
	            LDAA    #$32                    ; Clear DL=0 1-time
	            JSR     L4Cmd
	            LDAA    #$28                    ; Function set
	            JSR     L4Cmd                 ; DL=0 4Bit,N=1 2Line,F=0 5X7
	            LDAA    #$0C                    ; Display on/off Control
	            JSR     L4Cmd                 ; Entry display,cursor off,cursor not blink
	            LDAA    #$06                    ; Entry mode set
	            JSR     L4Cmd                 ; I/D=1 Increment,S=0 cursor shift
	            LDAA    #$01                    ; Clear display
	            JSR     L4Cmd                 ; clear display,set DD RAM address=0
	            RTS

	;**************************************
            	;* Write Instruction LCD  *
	;* Input  : ACC (Command) *
	;**************************************
	;
	L4Cmd       STAA    L4DATA
	            ANDA    #%11110000
	            STAA    L4BUFF            ; High Byte
	            ;
	            ORAA    #%00000010          ; Disable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            LDAA    L4PORT
	            ANDA    #%11111100          ; Enable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            ;
	            LDAA    L4DATA
	            ASLA                        ; D7 <-- D0 <- 0
	            ASLA
	            ASLA
	            ASLA
	            STAA    L4BUFF            ; Low Byte
	            ;
	            ORAA    #%00000010          ; Disable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            LDAA    L4PORT
	            ANDA    #%11111100          ; Enable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            RTS

	;**************************************
            	;* Write Data(ASC) to LCD *
            	;* Input  : ACC (ASCII)   *
	;**************************************
	            ;
	L4PutCh     STAA    L4DATA
	            ANDA    #%11110000
	            STAA    L4BUFF            ; High Byte
	            ;
	            ORAA    #%00000011          ; Disable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            LDAA    L4PORT
	            ANDA    #%11111101          ; Enable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            ;
	            LDAA    L4DATA
	            ASLA                        ; D7 <-- D0 <- 0
	            ASLA
	            ASLA
	            ASLA
	            STAA    L4BUFF            ; Low Byte
	            ;
	            ORAA    #%00000011          ; Disable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            LDAA    L4PORT  
	            ANDA    #%11111101          ; Enable EN LCD
	            STAA    L4PORT  
	            JSR     Delay5ms            ; Busy delay time
	            RTS

	;**************************************
	;* GOTO Position of LCD *
	;* INPUT : A (Address)  *
	;**************************************
	
	L4Goto      STAA    L4DATA
	            ANDA    #%11110000
	            STAA    L4BUFF            ; High Byte
	            ;
	            ORAA    #%10000010          ; Disable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            LDAA    L4PORT
	            ANDA    #%11111100          ; Enable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            ;
	            LDAA    L4DATA
	            ASLA                        ; D7 <-- D0 <- 0
	            ASLA
	            ASLA
	            ASLA
	            STAA    L4BUFF            ; Low Byte
	            ;
	            ORAA    #%00000010          ; Disable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            LDAA    L4PORT
	            ANDA    #%11111100          ; Enable EN LCD
	            STAA    L4PORT
	            JSR     Delay5ms            ; Busy delay time
	            RTS

	;**************************************
	;*  Write ASCII To LCD Until $00 Detect *
	;*  Input  : IX (ASCII Code Table)      *
	;*  Output : ASCII Code to LCD 4Bit     *
	;*         : Stop If Detect $00         *
	;**************************************
	;
	L4Write     LDAA    0,X         ; Get ASCII
	            CMPA    #$00        ; End of Text
	            BEQ     EndWrite    ; Detect 00H Stop
	            JSR     L4PutCh
	            INX
	            JMP     L4Write
	EndWrite    RTS


	; -- - - - M A I N - Program ----------------------------

	main        JSR     L4Init
	            LDX     #LCD_DISP
	            JSR     L4Write
	loops       jmp     loops


	LCD_DISP    FCC     'DnR mobileRobot'
	            FCB     $00

	            ORG     $FFFE
	            FDB     main

	            END


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsarati
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง : ๒๗ ก.ย. ๒๕๔๓