⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ts1602-lcd.asm

📁 1多功能显示器能通过按键二和按键三来调整LCD显示站名
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;=============================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 + -