📄 testlcd.asm
字号:
;未切换工作寄存器区,R0固定传递显示数据的起始地址
;DPTR除几个中间状态外,主要用于传递当前页的字符串的起始地址
;*****************************************
;设置 LCD
SET_LCD:LCALL K50MS; 延时50ms
MOV A,#30H ;设置为8位控制界面
ACALL WRCMD
MOV A,#30H ;
ACALL WRCMD
MOV A,#0CH ;开整体显示
ACALL WRCMD
MOV A,#01H ;清显示
ACALL WRCMD
MOV A,#06H ;初始化原点
ACALL WRCMD
; MOV A,#0FH ;开显示 FLASH
; MOV A,#0EH ;NO FLASH
ACALL WRCMD;
RET;
;*****************************************
;写指令
WRCMD: MOV P2,#0DCH ;写入指令
MOV R1,#0FFH;
MOVX @R1,A;从硬件上保证了写信号的作用
LCALL DLY00 ;延时
RET
;*****************************************
;写数据
WRDATA:MOV P2,#0DDH;
MOV R1,#0FFH;
MOVX @R1,A;
LCALL DLY00;
RET
DLY00:
MOV DLY3,#00H;
DJNZ DLY3,$;
RET;
;***********************************
;显示字符串,字符串以0结尾
; DPTR = 要显示字符串的地址
STR2BUFF:
PUSH DPH;
PUSH DPL;
MOV R0,#DISPBUFF;
FILL: CLR A
MOVC A,@A+DPTR
CJNE A,#00H,LC1
POP DPL;
POP DPH;
RET
LC1: MOV @R0,A;
INC R0;
INC DPTR
SJMP FILL
;****************************************
;键盘检测A中为返回键值
KEY: MOV PSW,#00H
MOV P1,#0FFH
ANL P1,#0FCH;列输入送0
MOV A,P1;读取行输出
ANL A,#1CH;消除不相关位的干扰
XRL A,#1CH;将行输出位取反
JZ KEY
CLR P1.0
SETB P1.1
MOV A,P1
ANL A,#1CH
XRL A,#1CH
JZ KEY0
ACALL DLY15ms ;消抖
JNB P1.4,KEY1 ;S1键
JNB P1.3,KEY3 ;S3键
JNB P1.2,KEY5 ;S5键
KEY0: SETB P1.0
CLR P1.1
MOV A,P1
ANL A,#1CH
XRL A,#1CH
JZ KEY
ACALL DLY15ms ;消抖
JNB P1.4,KEY2 ;S2键
JNB P1.3,KEY4 ;S4键
JNB P1.2,KEY6 ;S6键
SJMP KEY
KEY1:MOV A,#01H;
JNB P1.4,$ ;等待按键抬起
MOV P1,#0FFH
RET
KEY2:MOV A,#02H
JNB P1.4,$ ;等待按键抬起
MOV P1,#0FFH
RET;
KEY3:MOV A,#03H
JNB P1.3,$
MOV P1,#0FFH
RET
KEY4:MOV A,#04H
JNB P1.3,$
MOV P1,#0FFH
RET
KEY5:MOV A,#05H
JNB P1.2,$
MOV P1,#0FFH
RET
KEY6:MOV A,#06H
JNB P1.2,$
MOV P1,#0FFH
RET
DLY15ms:MOV DLY1,#14H ;0.015ms
MOV DLY2,#00H
KTIM1:DJNZ DLY2,KTIM1
DJNZ DLY1,KTIM1
ret;
K50ms: MOV DLY1,#00H ;50ms
MOV DLY2,#00H
KTIM2: DJNZ DLY2,KTIM2
DJNZ DLY1,KTIM2
RET
Init_1820:
SETB WDDATA ;按照时序拉高P3.0
NOP ;延时一个机器周期1微秒
CLR WDDATA ;拉低数据线
MOV R5,#36
LCALL Delay ;调用延时子程序,发出一个540微秒的低脉冲
SETB WDDATA ;再次拉高数据线
NOP
NOP
MOV R0,#36
TZ2: JNB WDDATA,TZ3 ;运行36次跳转指令,等待72微秒,其间收到低脉冲,证明18B20存在,否则不存在
DJNZ R0,TZ2
LJMP TZ4
TZ3: SETB exist1820 ;收到低脉冲,标志位置高,证明18B20存在
LJMP TZ5
TZ4: CLR exist1820 ;没有低脉冲反馈,证明18B20没有连接上,标志位置低
LJMP TZ7 ;TZ7将P3.0拉高
TZ5: MOV R0,#06EH ;复位成功,按照时序延时240微秒
TZ6: DJNZ R0,TZ6
TZ7: SETB WDDATA
ret;
;540微秒延时
Delay:
LOOP:MOV R4,#06H
LOOP1:DJNZ R4,LOOP1
DJNZ R5,LOOP
ret;
;读出转化后温度值的子程序
GetTemp:
setb WDDATA; //定时入口
lcall Init_1820; //运行前先复位
jnb exist1820,gettempend; //如果检测到18B20存在,跳到退出
mov A,#0cch;
lcall Write1820; //调用SKIP ROM命令
mov A,#044h;
lcall Write1820; //调用CONVERT命令,一定要先执行ROM命令再执行RAM命令
MOV R5,#50 ; //根据时序要求延时750微秒等待A/D转换结束
LCALL Delay;
lcall Init_1820; //在读温度值前先复位
mov A,#0ccH;
lcall Write1820; //每下一个命令都要调用写程序写入
mov A,#0BEH;
lcall Write1820;
lcall Read1820;
mov tempL,A; //低位数
lcall Read1820;
mov tempH,A; //高位数
gettempend:
ret;
Write1820:
;程序入口为ACC
;写温度子程序
MOV R2,#8 ;//一个字节共8位
CLR C ;//清空进位位
wr18201: CLR WDDATA ;//拉低总线
MOV R3,#8
DJNZ R3,$ ;//18B20开始工作,对数据进行采样,等待1
RRC A ;
MOV WDDATA,C ;//命令字按位依次送给18B20
MOV R3,#32
DJNZ R3,$ ;//保证写过程持续在60微秒?
SETB WDDATA
NOP
DJNZ R2,WR18201 ;//未写完一个字节的话继续进行
SETB WDDATA
ret;
;读温度子程序,可以读出9个8位数据,分别存入以60H开始的9个地址内
Read1820:
RE0: MOV R2,#8 ;//数据共有8位
RE1: CLR C
SETB WDDATA
NOP
NOP ;//
CLR WDDATA
NOP
NOP
NOP ;//保持低电平2微秒
SETB WDDATA ;//
MOV R3,#09
RE2: DJNZ R3,RE2 ;//等待9微秒,让字节传来
MOV C,WDDATA ;//主机按位依次读入18B20数据
MOV R3,#24
RE3: DJNZ R3,RE3
RRC A ;//读取数据移入A
DJNZ R2,RE1
NOP;
NOP;
NOP;
SETB WDDATA
ret; 返回数据在A中
;温度计算子程序
;整数部分则把61H低四位变为60H高四位,60H原来的高四位变做低四位。如果温度为负则取反即可
Calculate: MOV A,tempL
ANL A,#0F0H ;//取dispbuff1高四位
swap a
MOV R5,A
MOV A,tempH
ANL A,#0FH ;//取dispbuff2低四位
swap a
ORL A,R5 ;//或得到一个新字节
MOV calbuff1,A ;//存入整数部分低位
MOV A,tempH
ANL A,#80H ;//取温度高位上最高位,因为dispbuff2 前5位如果是1,温度为负,?
jnb acc.7,ZHENG ;//如果是0,温度为正,跳转
MOV A,calbuff1 ;//如果是1,温度为负
CPL A ;//温度值取反
INC A
MOV tempsign,#10 ;//给符号位赋值"-"
MOV calbuff1,A
sjmp endCalcul;
ZHENG:MOV tempsign,#00H ;//给符号位赋值"0"
endCalcul:
ret;
;*****************************************
;数据转换,将A中的数据转化为三位BCD码,送显示
CONV:
MOV B,#100;
DIV AB;
ADD A,#30H;
LCALL WRDATA;
MOV A,B;
MOV B,#10 ;分离十位和个位
DIV AB;A中为十位,B中为个位
ADD A,#30H
LCALL WRDATA;
MOV A,B;
ADD A,#30H;
LCALL WRDATA;
MOV A,#":";
LCALL WRDATA;
RET
printinit:
mov bianhao,#00h;
mov bianhao+1,#00h;
mov bianhao+2,#02h;
mov weight,#25h;
mov weight+1,#63h
mov price,#69h;
mov price+1,#00h;
mov shuliang,#05h;
mov zongjia,#99h;
mov zongjia+1,#00h;
mov year,#08h;
mov month,#09h;
mov day,#09h;
mov hour,#22h;
mov minute,#03h;
mov second,#26h;
ret;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -