📄 ts1602-lcd.asm
字号:
;=============================LCD显示子程序===================================;
DISPLAY:
;第一行=================================
MOV A,#10000000B ;设定第一行起始地址
LCALL WRINT
MOV R0,#16
MOV R1,#30H
K11: MOV A,@R1
LCALL WRDATA ;显示第一行
INC R1
DJNZ R0,K11
;第二行=================================
MOV A,#11000000B ;设定第二行起始地址
LCALL WRINT
MOV R0,#16
MOV R1,#40H
K22: MOV A,@R1
LCALL WRDATA ;显示第二行
INC R1
DJNZ R0,K22
RET
;=============================================================================;
CHANGE:
MOV A,TEMPER_H ;去掉高字节的符号位,保留低四位
ANL A,#0FH
SWAP A
MOV R2,A ;低四位放在高四位,暂存在R2
MOV A,TEMPER_L
ANL A,#0F0H ;保留低字节的高四位
SWAP A ;高四位放在第四位
ORL A,R2 ;取高字节的低四位为高四位,低字节的高四位为低四位组成一个字节就是要显示的温度值
MOV A_BIT,A ;要显示的温度值放在 A_BIT中
MOV A,A_BIT ;将温度值的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
CLR C
DIV AB
CLR C
ADD A,#30H
MOV TEMP_H,A ;十位在TEMP_H
MOV A,B
CLR C
ADD A,#30H
MOV TEMP_L,A ;个位在TEMP_L
RET
;================================读取温度值===================================;
GET_TEMP:
;CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INTS ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#44H
LCALL WRITE ;送入温度转换命令
LCALL INTS ;温度转换完全,再次初使化ds1820
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV TEMPER_L,A ;读出温度值低字节存入TEMPER_L
LCALL READ
MOV TEMPER_H,A ;读出温度值高字节存入TMEPER_H
RET
;初始化ds1820子程序=====================
INTS:
L0:
CLR DS1820_DQ ;ds1820总线为低复位电平
MOV R2,#200
L1:
CLR DS1820_DQ
DJNZ R2,L1 ;总线复位电平保持400us
SETB DS1820_DQ ;释放ds1820总线
MOV R2,#30
L4:
DJNZ R2,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号
ORL C,DS1820_DQ
JC L0 ;存在吗?不存在则重新来
MOV R6,#80
L5:
ORL C,DS1820_DQ
JC L3
DJNZ R6,L5
SJMP L0
L3:
MOV R2,#240
L2:
DJNZ R2,L2
RET
;向DS1820写操作命令子程序===============
WRITE:
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1:
SETB DS1820_DQ
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR DS1820_DQ ;开始写入ds1820总线要处于复位(低)状态
WR2:
DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV DS1820_DQ,C ;写入一个bit
MOV R4,#20
WR3:
DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB DS1820_DQ ;重新释放ds1820总线
RET
;向DS1820读操作命令子程序===============
READ:
;CLR EA
MOV R6,#8 ;连续读8个bit
RE1:
CLR DS1820_DQ ;读前总线保持为低
MOV R4,#4
NOP
SETB DS1820_DQ ;开始读总线释放
RE2:
DJNZ R4,RE2 ;持续8us
MOV C,DS1820_DQ ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3:
DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB DS1820_DQ ;重新释放ds1820总线
RET
;==============================LCD初始化设定==================================;
LCDINT:
MOV A,#00001000B ;关闭显示屏
LCALL WRINT
MOV A,#00111000B ;设定为8BIT,2行,5*7字形
LCALL WRINT
MOV A,#00000001B ;清除显示屏
LCALL WRINT
MOV A,#00001111B ;开启显示屏,游标与闪烁
LCALL WRINT
MOV A,#00000110B ;设定AC+1
LCALL WRINT
CALL WR_CG ;自建字符摄氏度及箭头
RET
;指令写入子函数=========================
WRINT:
LCALL CHECKBF ;判断是否忙碌
CLR RS ;写初始化设定
CLR RW ;指令写入命令
SETB EN
MOV LCD,A
CLR EN
RET
;检查是否忙碌状态=======================
CHECKBF:
PUSH A
BUSY:
CLR RS
SETB RW
SETB EN ;读取LCD设置,使能位EN下降沿触发
MOV A,LCD
CLR EN
JB ACC.7,BUSY
POP A
RET
;开始写子函数===========================
WRSTR:
MOV R1,#0
NEXTT:
MOV A,R1
MOVC A,@A+DPTR
LCALL WRDATA
INC R1
DJNZ R0,NEXTT
RET
;数据写入子函数=========================
WRDATA:
LCALL CHECKBF
SETB RS
CLR RW
SETB EN
MOV LCD,A
CLR EN
RET
;=======================自建字符子函数--摄氏度、箭头==========================;
WR_CG:
MOV A,#01000000B ;指定CG RAM 的起始地址
CALL WRINT
MOV R2,#16 ;指定所要写入的字符数
MOV R0,#0
MOV DPTR,#CHAR
NEXT_C: MOV A,R0
MOVC A,@A+DPTR
CALL WRDATA
INC R0
DJNZ R2,NEXT_C
RET
;=============================================================================;
;;=============================TIME0中断子函数================================;
TIME0:
PUSH A
MOV TH0,#04CH ;如计数不足20次 重新赋计数初值
MOV TL0,#000H
CLR C
MOV A,NUM
SUBB A,#10
JZ KK1
KK2:
JNB F0,RR1
MOV 34H,#0FEH
RR2:
DJNZ NUM,DOUT ;计数20次
MOV NUM,#20
INC SECONG ;每一秒,秒钟加一
MOV A,SECONG
CJNE A,#60,STARTM ;不足60秒转
INC MINUTE ;60秒加一分钟
MOV SECONG,#00H
LJMP STARTM
RR1:
MOV 34H,#03AH
LJMP RR2
KK1:
CPL F0
LJMP KK2
STARTM:
MOV A,MINUTE
CJNE A,#60,DISM ;不足60分转显示
INC HOUR
MOV MINUTE,#00H ;第60分钟显示00
MOV MIN_H,#030H
MOV MIN_L,#030H
STARTH:
MOV A,HOUR
CJNE A,#24,DISH ;24小时,不足转跳出
INC DATE ;日期加一
MOV HOUR,#00H ;第24小时显示00
MOV HOUR_H,#030H
MOV HOUR_L,#030H
STARTD:
MOV A,DATE ;日期30天,
CJNE A,#31,DISD
INC MONTH
MOV DATE,#01H
MOV DATE_H,#031H
MOV DATE_L,#030H
STARTMO:
MOV A,MONTH
CJNE A,#11,DISMO
MOV MONTH,#00H
LJMP DOUT
DOUT:
POP A
RETI
DISM:
MOV B,#10
DIV AB
ADD A,#30H
MOV MIN_H,A
MOV A,B
ADD A,#30H
MOV MIN_L,A
LJMP STARTH
DISH:
MOV B,#10
DIV AB
ADD A,#30H
MOV HOUR_H,A
MOV A,B
ADD A,#30H
MOV HOUR_L,A
LJMP STARTD
DISD:
MOV B,#10
DIV AB
ADD A,#30H
MOV DATE_H,A
MOV A,B
ADD A,#30H
MOV DATE_L,A
LJMP STARTMO
DISMO:
NOP
LJMP DOUT
;=================================延时子程序==================================;
DELAY: MOV R6,#15
DDD1:
MOV R7,#200
DJNZ R7,$
DJNZ R6,DDD1
RET
;**********延时约5ms子程序********************
;晶振f=11.0592Mhz
;延时时间=(1+(1+2*100+2)*25)*12/11.0592=5507us(约5ms)
DELAY_5ms:
MOV R7,#25
DELAY1:
MOV R6,#100
DELAY2:
DJNZ R6,DELAY2
DJNZ R7,DELAY1
RET
;刷新站点=====================================================================;
TAB1: ;上海 无锡 南京 徐州 济南 唐山 天津 北京
DB 'S','W','N','X','J','T','T','B'
DB 'H','X','J','Z','N','S','J','J'
DB 'a','i','i','h','a','h','i','i'
DB 'i',' ','n','o','n','a','n','n'
DB ' ',' ',' ','u',' ','n',' ',' '
TAB2: ;一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月
DB 'J','F','M','A','M','j','j','A''S','O','N','D'
DB 'a','e','a','p','a','u','u','u''e','c','o','e'
DB 'n','b','r','r','y','n','l','g''p','t','v','c'
;=============================================================================;
;自建字符--摄氏度编码=========================================================;
CHAR:
DB 08H,14H,0BH,04H
DB 04H,04H,03H,00H
;自建字符--箭头编码===========================================================;
DB 00H,04H,06H,1FH
DB 06H,04H,00H,00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -