📄 2007-12-26lcd_tempkz.asm
字号:
;*******************************************************************
;
;STC89C52,液晶控制,T6963C-----CM240128 控制
;
;*******************************************************************
DAT1 EQU 50H ;第一参数单元 用到50H~56H
DAT2 EQU 51H ;第二参数/数据单元
COM EQU 52H ;指令代码单元
CODEA EQU 53H ;汉字字符代码
COUNT EQU 54H ;西文字符的个数(8*8)
O_Y EQU 55H ;Y坐标
O_X EQU 56H ;X坐标
C_ADD EQU 6000H ;指令通道地址
D_ADD EQU 4000H ;数据通道地址
QD1 EQU P1.7 ;设定P0.4为总线口 等同于QD1
KEY1 EQU P1.0
KEY2 EQU P1.1
KEY3 EQU P1.2
KEY4 EQU P0.7
;-------------------------------------------------------------------
;定义指令代码常量
SETCUR EQU 21H ;光标指针设置
SETAM EQU 22H ;CGRAM偏置地址设置
SETADP EQU 24H ;地址指针位置
TXTHEA EQU 40H ;文本区首址
TXTWID EQU 41H ;文本区宽度
MAPHEA EQU 42H ;图形区首址
MAPWID EQU 43H ;图形区宽度
;显示方式设置 ;内部字符发生器CGROM
MODS00 EQU 80H ;文本与图形或关系显示
MODS01 EQU 81H ;文本与图形异或关系显示
MODS03 EQU 83H ;文本与图形与关系显示
MODS04 EQU 84H ;文本与图形双字节
;字符发生器CGRAM
MODS10 EQU 88H ;文本与图形或关系显示
MODS11 EQU 89H ;文本与图形异或关系显示
MODS13 EQU 8BH ;文本与图形与关系显示
MODS14 EQU 8CH ;文本与图形双字节
;字属性
WORD0 EQU 00H ;正向显示
WORD5 EQU 05H ;负向显示
WORD3 EQU 03H ;禁止显示正向
WORD4 EQU 04H ;禁止显示负向
;显示状态
DPMD00 EQU 90H ;
DPMD01 EQU 91H ;
DPMD02 EQU 90H
ORG 0000H
LJMP MAIN
;ORG 0003H
;ORG 000BH
;ORG 0013H
;ORG 001BH
;ORG 0023H
;*******************************************************************
;
;主程序区
;
;*******************************************************************
MAIN:
MOV SP,#60H
MOV 7CH,#00H
MOV 75H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 44H,#0AH
MOV 78H,#00H
MOV 79H,#00H
MOV 7AH,#00H
MOV 7BH,#0BH ;+/-#0CH
MAINL: MOV 2CH,#00H ;
MOV 2DH,#00H ;
MOV 2EH,#10 ;光标位置设置
MOV 2FH,#7
CLR 2AH.0 ;标志位
LCALL LCDINT
LCALL CLEAR1
MOV COUNT,#08H
MOV DPTR,#HZD
MOV 4AH,#0
MOV 4BH,#5 ;X
MOV 4CH,#20 ;Y
LCALL SWXS
MOV DPTR,#HZD
INC 4BH
INC 4BH
INC 4AH
LCALL SWXS
MOV DPTR,#HZD
INC 4BH
INC 4BH
INC 4AH
LCALL SWXS
MOV 3FH,4BH
PPP:
LCALL GET_TEMP
LCALL COUTKEY
MOV DPTR,#HZD
MOV 4AH,#3
MOV 4BH,49H ;X
INC 4BH
MOV 4CH,#20 ;Y
LCALL SWXS
LCALL KEYSUB ;
JB 2AH.0,JZH0
LCALL DATACAMP
JZH0:
JB P3.2,PPP
LJMP MAINL
;*******************************************************************
;
;子程序区
;
;*******************************************************************
;*******************************************************************
;
;温度测量数据转换子程序区
;
;*******************************************************************
;*******************************************************************
;DS18B20数字温度传感器程序
;*******************************************************************
GET_TEMP:
CLR PSW.4
SETB PSW.3 ;设置工作寄存器当前所在的区域 1组寄存器
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
LCALL INT ;温度转换完全,再次初使化ds1820
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV R7,A ;读出温度值低字节存入R7
LCALL READ
MOV R6,A ;读出谩度值高字节存入R6
SETB EA
CLR PSW.4
CLR PSW.3
MOV R3,0FH
MOV R2,0EH
RET
INT: ;初始化ds1820子程序
CLR EA
L0:
CLR QD1 ;ds1820总线为低复位电平
MOV R7,#200
L1:
CLR QD1
DJNZ R7,L1 ;总线复位电平保持400us
SETB QD1 ;释放ds1820总线
MOV R7,#30
L4:
DJNZ R7,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号
ORL C,QD1
JC L0 ;存在吗?不存在则重新来
MOV R7,#80
L5:
ORL C,QD1
JC L3
DJNZ R7,L5
SJMP L0
L3:
MOV R7,#240
L2:
DJNZ R7,L2
RET
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R6,#8 ;写入ds1820的bit数,一个字节8个bit
WR1:
SETB QD1
MOV R5,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR QD1 ;开始写入ds1820总线要处于复位(低)状态
WRA2:
DJNZ R5,WRA2 ;ds1820总线复位保持16us
MOV QD1,C ;写入一个bit
MOV R5,#20
WR3:
DJNZ R5,WR3 ;等待40us
DJNZ R6,WR1 ;写入下一个bit
SETB QD1 ;重新释放ds1820总线
RET
READ:
CLR EA
MOV R6,#8 ;连续读8个bit
RE1:
CLR QD1 ;读前总线保持为低
MOV R5,#4
NOP
SETB QD1 ;开始读总线释放
RE2:
DJNZ R5,RE2 ;持续8us
MOV C,QD1 ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3:
DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB QD1 ;重新释放ds1820总线
RET
;*******************************************************************
;数据处理
;*******************************************************************
COUTKEY: ;(R2R3)
MOV A,R3
ANL A,#00FH
MOV 39H,A ;.XXXX,39H小数部分
MOV A,R3
ANL A,#0F0H
SWAP A
MOV 3AH,A
MOV A,R2
ANL A,#07H
SWAP A ;
ORL A,3AH
MOV 3AH,A ;XXXXXXX. 3AH整数部分
MOV A,R2
ANL A,#0F8H
RR A
RR A
RR A
MOV 3BH,A ;+/- 3BH符号部分
MOV A,3BH
CJNE A,#00H,ZZZX ;1F;跳转到负数处理部分
MOV R3,3AH
LJMP ZZZY ;跳转到整数处理部分
ZZZX:
;负数处理部分
MOV R2,3AH
LCALL FSQF
MOV R3,A
ZZZY:
LCALL ZSCL ;整数处理部分
MOV R4,39H ;小数处理部分
LCALL XSCL
MOV A,3BH
CJNE A,#01FH,WECT
MOV 40H,35H
MOV 41H,36H
MOV 42H,37H
MOV 43H,38H
MOV 44H,#0AH
MOV 45H,3CH
MOV 46H,3DH
MOV 47H,3EH
MOV 48H,#0CH
MOV 2DH,48H
MOV 4BH,3FH
SETB RS1
MOV R0,#48H
MOV 4CH,#20
LCALL DISPEN
CLR RS1
MOV R1,#40H
LJMP WEXIT
WECT:
MOV 40H,35H
MOV 41H,36H
MOV 42H,37H
MOV 43H,38H
MOV 44H,#0AH
MOV 45H,3CH
MOV 46H,3DH
MOV 47H,3EH
MOV 48H,#0BH
MOV 2DH,48H
MOV 4BH,3FH
SETB RS1
MOV R0,#48H
MOV 4CH,#20
LCALL DISPEN
CLR RS1
MOV R1,#40H
LJMP WEXIT
WEXIT:
RET
;--------------------------------------------------------------------
FSQF: ;负数取反+1;入口R2
MOV A,R2
XRL A,#07FH
ADD A,#1
RET
ZSCL: ;正数据处理;入口R3
MOV 3CH,#00H ;各位
MOV 3DH,#00H ;十位
MOV 3EH,#00H ;百位
MOV A,R3
MOV B,#10
DIV AB
MOV 3CH,B
MOV B,#10
DIV AB
MOV 3DH,B
MOV B,#10
DIV AB
MOV 3EH,B
RET
XSCL: ;小数处理;入口R4
MOV 35H,#00H ;0.000X
MOV 36H,#00H ;0.00X0
MOV 37H,#00H ;0.0X00
MOV 38H,#00H ;0.X000
MOV 21H,#00H
MOV R5,#01H
MOV A,#01H
ANL A,R4
JNB ACC.0,GOTO01
MOV A,35H
ADD A,#5
MOV 35H,A
MOV A,36H
ADD A,#2
MOV 36H,A
MOV A,37H
ADD A,#6
MOV 37H,A
MOV A,38H
ADD A,#0
MOV 38H,A
SETB 21H.0
GOTO01:
MOV A,#2H
ANL A,R4
JNB ACC.1,GOTO02
MOV A,35H
ADD A,#0
MOV 35H,A
MOV A,36H
ADD A,#5
MOV 36H,A
MOV A,37H
ADD A,#2
MOV 37H,A
MOV A,38H
ADD A,#1
MOV 38H,A
SETB 21H.1
GOTO02:
MOV A,#4H
ANL A,R4
JNB ACC.2,GOTO03
MOV A,35H
ADD A,#0
MOV 35H,A
MOV A,36H
ADD A,#0
MOV 36H,A
JNB 21H.0,CJPE
JNB 21H.1,CJPF
MOV 37H,#3
MOV A,38H
ADD A,#1
MOV 38H,A
LJMP CJPG
CJPF:
MOV 37H,#1
MOV A,38H
ADD A,#1
MOV 38H,A
LJMP CJPG
CJPE:
MOV A,37H
ADD A,#5
MOV 37H,A
CJPG:
MOV A,38H
ADD A,#2
MOV 38H,A
SETB 21H.2
GOTO03:
MOV A,#8H
ANL A,R4
JNB ACC.3,GOTO04
MOV A,35H
ADD A,#0
MOV 35H,A
MOV A,36H
ADD A,#0
MOV 36H,A
MOV A,37H
ADD A,#0
MOV 37H,A
MOV A,38H
ADD A,#5
MOV 38H,A
SETB 21H.3 ;
GOTO04:
RET
DISPEN: MOV DPTR,#WORDDM
MOV 4AH,@R0
INC 4BH
LCALL SWXS
DEC R0
CJNE R0,#3FH,DISPEN
MOV 49H,4BH
;CLR RS1
RET
;*******************************************************************
;
;键盘子程序,
;
;*******************************************************************
KEYEND0:
LJMP KEYENDN
KEYSUB:
JB P1.0,KEYAD
LCALL YS20
JNB P1.0,$
SETB 2AH.0
KEYSUB1:
MOV DPTR,#SETDM
MOV 4AH,#0
MOV 4BH,#5 ;X
MOV 4CH,#50 ;Y ''''''''
LCALL SWXS
MOV DPTR,#SETDM
INC 4BH
INC 4BH
INC 4AH
LCALL SWXS
MOV DPTR,#SETDM
INC 4BH
INC 4BH
INC 4AH
LCALL SWXS
MOV 2BH,4BH
MOV 40H,7CH
MOV 41H,75H
MOV 42H,76H
MOV 43H,77H
MOV 44H,#0AH
MOV 45H,78H
MOV 46H,79H
MOV 47H,7AH
MOV 48H,7BH
MOV 4BH,2BH
SETB RS1
MOV R0,#48H
MOV 4CH,#50
LCALL DISPEN
CLR RS1
MOV DAT1,2EH;#10 ;光标位置设置
MOV R1, #48H ;
MOV DAT2,2FH;#7 ;
LCALL CURSORSET ;
LJMP KEYEND
KEYSNB: LJMP KEYSB
KEYAD:
JB P1.4,KEYSNB ;
LCALL YS20
JNB P1.4,$
KAD1:
MOV A,2CH
CLR C
SUBB A,#00
JNZ KAD2
MOV A,7BH
CJNE A,#0CH,KAD11
MOV 7BH,#0BH
LCALL XS
LJMP KEYUP
KAD11:
MOV 7BH,#0CH
LCALL XS
LJMP KEYEND
KAD2:
MOV A,2CH
CLR C
SUBB A,#01
JNZ KAD3
INC 7AH
MOV A,7AH
CJNE A,#0AH,KADV
MOV 7AH,#00H
LCALL XS
LJMP KEYUP
KAD3:
MOV A,2CH
CLR C
SUBB A,#02
JNZ KAD4
INC 79H
MOV A,79H
CJNE A,#0AH,KADV
MOV 79H,#00H
LCALL XS
LJMP KEYUP
KAD4:
MOV A,2CH
CLR C
SUBB A,#03
JNZ KAD5
INC 78H
MOV A,78H
CJNE A,#0AH,KADV
MOV 78H,#00H
LCALL XS
LJMP KEYUP
KAD5:
MOV A,2CH
CLR C
SUBB A,#04
JNZ KAD6
INC 77H
MOV A,77H
CJNE A,#0AH,KADV
MOV 77H,#00H
LCALL XS
LJMP KEYUP
KADV:
LCALL XS
LJMP KEYEND
KAD6:
MOV A,2CH
CLR C
SUBB A,#05
JNZ KAD7
INC 76H
MOV A,76H
CJNE A,#0AH,KADV
MOV 76H,#00H
LCALL XS
LJMP KEYUP
KAD7:
MOV A,2CH
CLR C
SUBB A,#06
JNZ KAD8
INC 75H
MOV A,75H
CJNE A,#0AH,KADV
MOV 75H,#00H
LCALL XS
LJMP KEYUP
KAD8:
MOV A,2CH
CLR C
SUBB A,#07
JNZ KAD9
INC 7CH
MOV A,7CH
CJNE A,#0AH,KADV
MOV 7CH,#00H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -