📄 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 ;存储要显示的个位数
DATE2 EQU 61H ;存储要显示的十位数
DATE3 EQU 62H ;存储要显示的百位数
DATE4 EQU 63H ;存储要显示的千位数
DATEN EQU 78H ;存放写入LCD的数据的个数
DATE EQU 79H ;存放写入LCD的数据
;***************************************************************
;主程序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百米脉冲数
MOV 51H,#02H
LCALL AT2401RC
MOV 71H,R7
MOV 50H,#00H ;读24c02里程个位数
MOV 51H,#20H
LCALL AT2401RC
MOV DATE1,R7
MOV 50H,#00H ;读24c02里程十位数
MOV 51H,#21H
LCALL AT2401RC
MOV DATE2,R7
MOV 50H,#00H ;读24c02里程百位数
MOV 51H,#22H
LCALL AT2401RC
MOV DATE3,R7
MOV 50H,#00H ;读24c02里程千位数
MOV 51H,#23H
LCALL AT2401RC
MOV DATE4,R7
ACALL LCDINT
BACKM:ACALL JISHU ;调用收到脉冲并进行处理子程
ACALL LCDXS
JNB P2.5,qinling
AJMP BACKM
;*********************************************************
;24C02读初始,读取里程数
;*********************************************************
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 ;里程数清零
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米所需要的脉冲数的子程序
;***************************************************************
JISHUAN: MOV A,#32 ;32为100/3.14的工作系数
MOV B,70H
DIV AB
MOV 71H,A ;每跑100M的脉冲数放入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的数据
;***********************************************************
R2READ: PUSH ACC ;保存AC
MOV R6,#08H
R2RLOP1:LCALL D15US
SETB SCL ;输出一个串行时钟
LCALL D15US
MOV C,SDA ;读数据线上的数据到 C
RLC A ;移到 ACC
LCALL D15US
CLR SCL
DJNZ R6,R2RLOP1 ;读 8 BIT 数据
LCALL D15US
CLR SDA
MOV R7,A ;将接收到的数据保存到R7
POP ACC ;还原ACC
RET
;******************************************************
;写到24C02本程序开始及结束SDA & SCL 均=0 ,发送数据在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
;****************************************************
;将要写的数据交给R5,由R5送到存储器相应的地址
;****************************************************
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
;**************************************************************
;设置开始 ,初始SDA &SCL=1,结束 SDA & SC
;**************************************************************
R2STAR: SETB SDA
SETB SCL
LCALL D15US ;对2401操作开始
CLR SDA ;在SCL=1时,SDA由1变为0表示开始
LCALL D15US
CLR SCL
LCALL D15US
RET
;******************************************************
;设置结束
;******************************************************
R2STOP:LCALL D15US
SETB SCL
CLR SDA
LCALL D15US
SETB SDA
RET
;**************************************************************
;开始对脉冲计数并存储里程数的子程序
;**************************************************************
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脉冲数与跑100M脉冲比较
MOV 72H,#0
INC DATE1 ;存里程数
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 ;里程数存入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上写入里程数
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
;********************************************************
;写一位字符数据子程序,DATE中存放要写入的数据
;********************************************************
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中存放的里程数据分解分个、十、百位
;*********************************************************
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -