?? lichengbiao.a51
字號:
RS BIT P2.0
RW BIT P2.1
E BIT P2.2
SDA BIT P3.1
SCL BIT P3.0
DATE1 EQU 60H ;存儲要顯示的個位數(shù)
DATE2 EQU 61H ;存儲要顯示的十位數(shù)
DATE3 EQU 62H ;存儲要顯示的百位數(shù)
DATE4 EQU 63H ;存儲要顯示的千位數(shù)
DATEN EQU 78H ;存放寫入LCD的數(shù)據(jù)的個數(shù)
DATE EQU 79H ;存放寫入LCD的數(shù)據(jù)
;***************************************************************
;主程序MAIN
;***************************************************************
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: SETB P2.5 ;將P2.5置高電平
JNB P2.5,qinling ;由p2.5判斷是否清零LCD
MOV 50H,#00H ;讀24c02直徑
MOV 51H,#01H
LCALL AT2401RC
CJNE R7,#0,DUSHU
AJMP MAIN
DUSHU: MOV 70H,R7
MOV 50H,#00H ;讀24c02百米脈沖數(shù)
MOV 51H,#02H
LCALL AT2401RC
MOV 71H,R7
MOV 50H,#00H ;讀24c02里程個位數(shù)
MOV 51H,#20H
LCALL AT2401RC
MOV DATE1,R7
MOV 50H,#00H ;讀24c02里程十位數(shù)
MOV 51H,#21H
LCALL AT2401RC
MOV DATE2,R7
MOV 50H,#00H ;讀24c02里程百位數(shù)
MOV 51H,#22H
LCALL AT2401RC
MOV DATE3,R7
MOV 50H,#00H ;讀24c02里程千位數(shù)
MOV 51H,#23H
LCALL AT2401RC
MOV DATE4,R7
ACALL LCDINT
BACKM:ACALL JISHU ;調(diào)用收到脈沖并進(jìn)行處理子程
ACALL LCDXS
JNB P2.5,qinling
AJMP BACKM
;*********************************************************
;24C02讀初始,讀取里程數(shù)
;*********************************************************
AT2401RC:LCALL R2STAR
MOV R7,#10100000B
LCALL R2SEND
MOV A,50H
MOV R7,A
LCALL R2SEND
MOV A,51H
MOV R7,A
LCALL R2SEND
SETB SDA
SETB SCL
LCALL R2STAR
MOV R7,#10100001B
LCALL R2SEND
LCALL R2READ
LCALL R2STOP
RET
;***************************************************************
;LCD清零程序
;***************************************************************
qinling:ACALL LCDINT
MOV DATE1,#0 ;里程數(shù)清零
MOV DATE2,#0
MOV DATE3,#0
MOV DATE4,#0
MOV 70H,#0 ;直徑清零
HERE: JB P2.3,HERE ;由P2.3判斷輪胎直徑的輸入
ACALL DELAY50MS
INC 70H ;40h中存放輸入的直徑
SETB P2.4
JNB P2.4,JISHUAN ;由p2.4判斷是否開始工作顯示
AJMP HERE
;***************************************************************
;計算車行駛100米所需要的脈沖數(shù)的子程序
;***************************************************************
JISHUAN: MOV A,#32 ;32為100/3.14的工作系數(shù)
MOV B,70H
DIV AB
MOV 71H,A ;每跑100M的脈沖數(shù)放入71H
MOV 50H,#00H ;每跑100M脈沖存入24C02
MOV 51H,#02H
MOV R5,71H
LCALL AT2401W
MOV 50H,#00H ;將直徑存入24c02中
MOV 51H,#01H
MOV R5,70H
LCALL AT2401W
ACALL LCDINT
AJMP BACKM
;***********************************************************
;讀取24c02的數(shù)據(jù)
;***********************************************************
R2READ: PUSH ACC ;保存AC
MOV R6,#08H
R2RLOP1:LCALL D15US
SETB SCL ;輸出一個串行時鐘
LCALL D15US
MOV C,SDA ;讀數(shù)據(jù)線上的數(shù)據(jù)到 C
RLC A ;移到 ACC
LCALL D15US
CLR SCL
DJNZ R6,R2RLOP1 ;讀 8 BIT 數(shù)據(jù)
LCALL D15US
CLR SDA
MOV R7,A ;將接收到的數(shù)據(jù)保存到R7
POP ACC ;還原ACC
RET
;******************************************************
;寫到24C02本程序開始及結(jié)束SDA & SCL 均=0 ,發(fā)送數(shù)據(jù)在R7
;******************************************************
R2SEND: PUSH ACC
MOV A,R7
MOV R6,#08H
R2SLOP1: RLC A
MOV SDA,C
LCALL D15US
SETB SCL
LCALL D15US
CLR SCL
DJNZ R6,R2SLOP1
SETB SDA
LCALL D15US
CLR SDA
LCALL D15US
R2SLOP2: MOV C,SDA
JC R2SLOP2
CLR SCL
CLR SDA
POP ACC
LCALL D1MS
RET
;****************************************************
;將要寫的數(shù)據(jù)交給R5,由R5送到存儲器相應(yīng)的地址
;****************************************************
AT2401W:SETB SDA
SETB SCL
LCALL R2STAR
MOV R7,#10100000B
LCALL R2SEND
MOV A,50H
MOV R7,A
LCALL R2SEND
MOV A,51H
MOV R7,A
LCALL R2SEND
MOV A,R5
MOV R7,A
LCALL R2SEND
LCALL R2STOP
LCALL D1MS
RET
;**************************************************************
;設(shè)置開始 ,初始SDA &SCL=1,結(jié)束 SDA & SC
;**************************************************************
R2STAR: SETB SDA
SETB SCL
LCALL D15US ;對2401操作開始
CLR SDA ;在SCL=1時,SDA由1變?yōu)?表示開始
LCALL D15US
CLR SCL
LCALL D15US
RET
;******************************************************
;設(shè)置結(jié)束
;******************************************************
R2STOP:LCALL D15US
SETB SCL
CLR SDA
LCALL D15US
SETB SDA
RET
;**************************************************************
;開始對脈沖計數(shù)并存儲里程數(shù)的子程序
;**************************************************************
JISHU: SETB P2.6
JNB P2.6,JISHU ;P2.6每收到一個脈沖51H加1
INC 73H
MOV R4,73H
CJNE R4,#10,JISHU ;51H加到10后,50就加1
MOV 73H,#0
INC 72H
MOV A,72H
CJNE A,71H,JISHU ;50H脈沖數(shù)與跑100M脈沖比較
MOV 72H,#0
INC DATE1 ;存里程數(shù)
MOV A,DATE1
CJNE A,#10,JIESHU
MOV DATE1,#0
INC DATE2
MOV A,DATE2
CJNE A,#10,JIESHU
MOV DATE2,#0
INC DATE3
MOV A,DATE3
CJNE A,#10,JIESHU
MOV DATE3,#0
INC DATE4
MOV A,DATE4
CJNE A,#0,JIESHU
MOV DATE4,#0
MOV DATE3,#0
MOV DATE2,#0
MOV DATE1,#0
JIESHU: MOV 50H,#00H ;里程數(shù)存入24c02
MOV 51H,#20H
MOV R5,DATE1
LCALL AT2401W
MOV 50H,#00H
MOV 51H,#21H
MOV R5,DATE2
LCALL AT2401W
MOV 50H,#00H
MOV 51H,#22H
MOV R5,DATE3
LCALL AT2401W
MOV 50H,#00H
MOV 51H,#23H
MOV R5,DATE4
LCALL AT2401W
RET
;*************************************************************
;在LCD顯示的子程序
;*************************************************************
LCDXS: MOV DPTR,#TAB2 ;在LCD上寫入MILE:字符
MOV R2,#80H
ACALL WRLCD
MOV DATEN,#6
ACALL WRN
MOV R2,#8CH ;在LCD上寫入里程數(shù)
ACALL WRLCD
MOV DPTR,#TAB1
MOV A,DATE4
MOVC A,@A+DPTR
MOV DATE,A
ACALL WRDATE
MOV R2,#8DH
ACALL WRLCD
MOV A,DATE3
MOVC A,@A+DPTR
MOV DATE,A
ACALL WRDATE
MOV R2,#8EH
ACALL WRLCD
MOV A,DATE2
MOVC A,@A+DPTR
MOV DATE,A
ACALL WRDATE
MOV R2,#8FH
ACALL WRLCD
MOV A,DATE1
MOVC A,@A+DPTR
MOV DATE,A
ACALL WRDATE
MOV DPTR,#TAB3 ;在LCD上寫入DIAMETER:字符
MOV R2,#0C0H
ACALL WRLCD
MOV DATEN,#9
ACALL WRN
MOV R2,#0CCH ;在LCD上寫入直徑
ACALL WRLCD
MOV DPTR,#TAB1
MOV A,70H
MOVC A,@A+DPTR
MOV DATE,A
ACALL WRDATE
ACALL DELAY50MS
RET
;*********************************************************
;LCD顯示程序初始化
;*********************************************************
LCDINT: MOV R2,#01H
ACALL WRLCD
MOV R2,#3CH
ACALL WRLCD
MOV R2,#06H
ACALL WRLCD
MOV R2,#0CH
ACALL WRLCD
RET
;********************************************************
;寫命令的子程序,R2中存放要寫入的命令
;********************************************************
WRLCD: ACALL BUSY
PUSH ACC
MOV A,R2
CLR RS
CLR RW
MOV P0,A
CLR E
ACALL DELAY
SETB E
POP ACC
RET
;********************************************************
;寫一位字符數(shù)據(jù)子程序,DATE中存放要寫入的數(shù)據(jù)
;********************************************************
WRDATE:ACALL BUSY
SETB RS
CLR RW
MOV P0,DATE
CLR E
ACALL DELAY
SETB E
RET
;********************************************************
;寫入LCD表示字符
;********************************************************
WRN: CLR A
MOVC A,@A+DPTR
INC DPTR
MOV DATE,A
ACALL WRDATE
DJNZ DATEN,WRN
RET
;********************************************************
;查詢忙碌子程序
;********************************************************
BUSY: CLR RS
SETB RW
MOV A,P0
CLR E
ACALL DELAY
SETB E
JB ACC.7,BUSY
RET
;*********************************************************
;將R0中存放的里程數(shù)據(jù)分解分個、十、百位
;*********************************************************
COV: MOV A,R0
MOV B,#10
DIV AB
MOV DATE3,B
MOV B,#10
DIV AB
MOV DATE2,B
MOV DATE1,A
RET
;*********************************************************
;延時子程序
;*********************************************************
DELAY: MOV R6,#10H
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R6,D1
RET
;**********************************************************
;延時子程序
;**********************************************************
D1MS: MOV R2,#5 ;延時1ms子程序
D1MS1: MOV R3,#100
D1MS2: DJNZ R3,D1MS2
DJNZ R2,D1MS1
RET
D15US: MOV R3,#7 ;延時1us子程序
D12US1:DJNZ R3,D12US1
RET
DELAY50MS:MOV R7,#200 ;延時50ms子程序
DELAY50MS1:MOV R6,#125
DELAY50MS2:DJNZ R6,DELAY50MS2
DJNZ R7,DELAY50MS1
RET
TAB1: DB '0123456789'
TAB2: DB 'MILES:'
TAB3: DB 'DIAMETER:'
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -