📄 speedo1.asm
字号:
SETB RS ;RS=1 DATA
CLR RW ;RW=0 FOR WRITE
MOV LCD,A ;MOVE ACC.DATA TO PORT
CLR EN
NOP
LCALL READY
RET
;****************************LCD SUBROUTINES****************************************
CMD: SETB EN ;H->L PULSE ON E
CLR RS ;RS=0 FOR COMMAND
CLR RW ;RW=0 FOR WRITE
MOV LCD,A ;MOVE ACC. DATA TO PORT
CLR EN
NOP
LCALL READY
RET
;****************************LCD SUBROUTINES****************************************
INIT: MOV A,#030H ;INITIALIZE LCD BY SENDING 30H THREE TIMES.
LCALL CMD
ACALL DDELAY ;INITIAL DELAY 4.1MSEC
MOV A,#030H
LCALL CMD
ACALL DDELAY
MOV A,#030H
LCALL CMD
ACALL DDELAY
MOV A,#038H ; INITIALIZE, 2-LINES, 5X7 MATRIX.
LCALL CMD
ACALL DDELAY
MOV A,#0CH ; INVISIBLE CURSOR ON;
LCALL CMD
MOV A,#01H ; CLEAR LCD SCREEN
LCALL CMD
MOV A,#06H ; SHIFT CURSOR RIGHT
LCALL CMD
MOV A,#80H ; LINE 1
LCALL CMD
MOV DPTR,#MSG_1
LINE1: CLR A
MOVC A,@A+DPTR
JZ NEXTLINE
ACALL DAT
INC DPTR
SJMP LINE1
NEXTLINE: MOV A,#0C0H ; LINE 2
LCALL CMD
MOV DPTR,#MSG_2
LINE11: CLR A
MOVC A,@A+DPTR
JZ DONE
ACALL DAT
INC DPTR
SJMP LINE11
DONE: RET
;****************************LCD SUBROUTINES****************************************
CLEAR: MOV A,#01H
LCALL CMD
RET
;****************************LCD SUBROUTINES****************************************
DDELAY: MOV R5,#41D ; 4.1 mS DELAY
QT2: MOV R6,#50D
QT1: DJNZ R6,QT1
DJNZ R5,QT2
RET
;***********************************************************************
; I2C - SERIAL EEPROM ROUTINES
;***********************************************************************
;**********************************************************
; THIS SUB READS ONE BYTE OF DATA FROM THE EEPROM
;**********************************************************
READ_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS DATA
MOV A,#00H
SETB SDA ; SET SDA HIGH TO ENSURE LINE
; FREE
READ_BITS:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY
RLC A ; ROTATE CARRY-BIT INTO ACC.0
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
DJNZ BITCNT,READ_BITS
; LOOP FOR 8-BITS
JB LASTREAD,ACKN
; CHECK TO SEE IF THIS IS
; THE LAST READ
CLR SDA ; IF NOT LAST READ SEND ACK-BIT
ACKN:
SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CLR SCL ; OR NOT ACKNOWLEDGE BIT
RET
;**********************************************************
; SUB SENDS START CONDITION
;**********************************************************
SEND_START:
SETB _2W_BUSY ; INDICATE THAT 2-WIRE
CLR ACK ; OPERATION IS IN PROGRESS
CLR BUS_FLT ; CLEAR STATUS FLAGS
JNB SCL,FAULT
JNB SDA,FAULT
SETB SDA ; BEGIN START CODITION
SCL_HIGH
CLR SDA
ACALL DEELAY
CLR SCL
RET
FAULT:
SETB BUS_FLT
RET
;**********************************************************
; SUB SENDS STOP CONDITION
;**********************************************************
SEND_STOP:
CLR SDA
SCL_HIGH
SETB SDA
CLR _2W_BUSY
RET
;**********************************************************
; SUB DELAYS THE BUS
;**********************************************************
DEELAY:
NOP ; DELAY FOR BUS TIMING
RET
; *********************************************************
; THIS SUB SENDS 1 BYTE OF DATA TO THE EEPROM
; *********************************************************
SEND_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS
SB_LOOP:
JNB ACC.7,NOTONE ; CHECK TO SEE IF BIT-7 OF
SETB SDA ; ACC IS A 1, AND SET SDA HIGH
JMP ONE
NOTONE:
CLR SDA ; CLR SDA LOW
ONE:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
RL A ; ROTATE ACC LEFT 1-BIT
CLR SCL ; TRANSITION SCL LOW-TO-HIGH
DJNZ BITCNT,SB_LOOP ; LOOP FOR 8-BITS
SETB SDA ; SET SDA HIGH TO LOOK FOR
SCL_HIGH ; ACKNOWLEDGE PULSE
CLR ACK
JNB SDA,SB_EX ; CHECK FOR ACK OR NOT ACK
SETB ACK ; SET ACKNOWLEDGE FLAG FOR
; NOT ACK
SB_EX:
ACALL DEELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
ACALL DEELAY ; DELAY FOR AN OPERATION
RET
; *********************************************************************
; SUB READS FROM THE EEPROM AND WRITES IT TO THE SCRATCHPAD MEMORY
; *********************************************************************
READEEPROM:
MOV R1,#POINT ; START FROM POINT STORAGE LOCATION
MOV BYTECNT,#00H
CLR LASTREAD
LCALL SEND_START
MOV A,#EEPROMW
LCALL SEND_BYTE
MOV A,#00H ; POINT TO 00H ADDRESS OF EEPROM
LCALL SEND_BYTE
LCALL SEND_STOP
LCALL SEND_START
MOV A,#EEPROMR ; READ COMMAND
LCALL SEND_BYTE
READ_LOOP:
MOV A,BYTECNT
CJNE A,#06H,NOT_LAST ; CHECK FOR THE LAST BYTE
SETB LASTREAD
NOT_LAST:
LCALL READ_BYTE
MOV @R1,A
MOV A,BYTECNT
CJNE A,#00H,NOT_FIRST
MOV A,@R1
MOV @R1,A
NOT_FIRST:
INC R1 ;** INC RAM LOCATION **
INC BYTECNT
MOV A,BYTECNT
CJNE A,#07H,READ_LOOP ; CHECK FOR 7th BYTE,IF 7th BYTE THEN STOP TRANSFER
LCALL SEND_STOP
RET
;****************************************************************************************************************************
SEND2EEPROM:
LCALL SEND_START ; SEND 2WIRE START CONDITION
MOV A,#EEPROMW ; LOAD EEPROM WRITE COMMAND
LCALL SEND_BYTE ; SEND WRITE COMMAND
MOV A,#00H ; SET EEPROM DATA POINTER TO 00H (ADDRESS LOCATION)
LCALL SEND_BYTE
MOV A,POINT ; Send POINT
LCALL SEND_BYTE
MOV A,KM ; Send KM
LCALL SEND_BYTE
MOV A,TKM ; Send TKM
LCALL SEND_BYTE
MOV A,HKM ; Send HKM
LCALL SEND_BYTE
MOV A,KKM ; Send KKM
LCALL SEND_BYTE
MOV A,TKKM ; Send TKM
LCALL SEND_BYTE
LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION
RET
;************************************************************************************
PWR_DELAY: ; 15 mSec DELAY FOR LCD TO INTIALIZE AFTER POWER-ON
MOV R4,#30D
H2: MOV R3,#250D
H1: DJNZ R3,H1
DJNZ R4,H2
RET
;************************************************************************************
ORG 0350H
MSG_1: DB 'Kms:',00H
MSG_2: DB 'Speed-Kmph:',00H
FIRST:
DB 0H,0H,1H,2H,2H,3H,4H,4H,5H,6H,6H,7H,8H,8H,9H,0H
SECOND:
DB 0H,6H,3H,0H,7H,4H,0H,7H,4H,1H,8H,4H,1H,8H,5H,0H
THIRD:
DB 0H,8H,6H,4H,2H,0H,8H,6H,4H,2H,0H,8H,6H,4H,2H,0H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -