[ บทความ : 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