;定義LCD接線位置 LCD_RS EQU P1.0 LCD_RW EQU P1.1 LCD_E EQU P1.2 LCD_DATA EQU P2 ;定義ADV0831接線位置 SCL EQU P1.3 SDA EQU P1.4 CS EQU P1.6 AD_BUF EQU 30H ;儲存AD轉換完成之資料 MOV R5,#1 ;等LCD穩定後再規劃LCD,若LCD無法正常顯示 CALL DELAY ;請加上此延遲程式 CLR LCD_RW ;習慣上直接將LCD的RW接腳直接接地, MOV A,#00111000B ;設定LCD介面為8位元, 2行, 5x7字型 CALL WRIR MOV A,#00001100B ;設定要LCD顯示, 不要有游標和閃爍 CALL WRIR MOV A,#00000110B ;設定寫資料進入LCD時, 顯示器不要動, 游標向右移一格 CALL WRIR MOV A,#1 ;清除LCD CALL WRIR MOV R5,#1 ;延遲等清除LCD命令處理完畢 CALL DELAY SCAN: CALL RD_AD0831 MOV A,#10000000B CALL WRIR MOV A,AD_BUF CALL HEX_TO_ASCII MOV A,#10001000B CALL WRIR MOV A,AD_BUF CALL BIN_TO_DEC MOV R5,#10 CALL DELAY JMP SCAN HEX_TO_ASCII: ;將16進制數值轉成ASCII碼顯示於LCD MOV DPTR,#FONT PUSH ACC ;暫時將累加器內的值儲存於堆疊 SWAP A ;前後四位元資料交換 ANL A,#0FH ;前4位元清除為0 MOVC A,@A+DPTR ;將數值轉成ASCII碼 CALL WRDR ;顯示於LCD POP ACC ANL A,#0FH MOVC A,@A+DPTR CALL WRDR RET FONT: DB '0123456789ABCDEF' BIN_TO_DEC: ;將二進制數值轉成十進制之ASCII碼顯示於LCD MOV B,#10 DIV AB ;將累加器內容除10,累加器內容為商,包含十位和百位,餘數在B,為個位的值 PUSH B ;將個位數暫時存到堆疊 MOV B,#10 DIV AB ;累加器內容為百位,餘數在B,為十位的值 ADD A,#30H ;將百位數加上30H變成ASCII碼, 例如 3 => 33H CALL WRDR MOV A,B ;將十位數移到累加器 ADD A,#30H CALL WRDR POP ACC ;從堆疊取回個位數值存到累加器 ADD A,#30H CALL WRDR RET RD_AD0831: SETB SDA CLR CS MOV R7,#2 CALL DELAY1US SETB SCL MOV R7,#3 CALL DELAY1US CLR SCL MOV R7,#3 CALL DELAY1US MOV R4,#8 RD_AD: SETB SCL ;讀取8位元資料 MOV R7,#3 CALL DELAY1US CLR SCL MOV R7,#3 CALL DELAY1US MOV C,SDA RLC A DJNZ R4,RD_AD MOV R7,#3 CALL DELAY1US SETB CS MOV AD_BUF,A ;儲存轉換結果 RET WRIR: CLR LCD_RS ;寫命令到LCD副程式 SETB LCD_E MOV LCD_DATA,A MOV R7,#50 ;延遲等訊號穩定 DJNZ R7,$ CLR LCD_E ;讓Enable接腳產生負緣訊號 MOV R7,#60 ;延遲等訊號處裡完畢 DJNZ R7,$ RET WRDR: SETB LCD_RS ;寫資料到LCD副程式 SETB LCD_E MOV LCD_DATA,A MOV R7,#50 ;延遲等訊號穩定 DJNZ R7,$ CLR LCD_E ;讓Enable接腳產生負緣訊號 MOV R7,#60 ;延遲等訊號處裡完畢 DJNZ R7,$ RET DELAY: MOV R6,#100 DEL: MOV R7,#100 DJNZ R7,$ DJNZ R6,DEL DJNZ R5,DELAY RET DELAY1US: ;延遲時間 = R7 * 1 us(延遲時間以82G516為準) NOP NOP NOP NOP DJNZ R7,DELAY1US RET END