?? testlcd.asm
字號:
;未切換工作寄存器區(qū),R0固定傳遞顯示數(shù)據(jù)的起始地址
;DPTR除幾個中間狀態(tài)外,主要用于傳遞當(dāng)前頁的字符串的起始地址
;*****************************************
;設(shè)置 LCD
SET_LCD:LCALL K50MS; 延時50ms
MOV A,#30H ;設(shè)置為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
;*****************************************
;寫數(shù)據(jù)
WRDATA:MOV P2,#0DDH;
MOV R1,#0FFH;
MOVX @R1,A;
LCALL DLY00;
RET
DLY00:
MOV DLY3,#00H;
DJNZ DLY3,$;
RET;
;***********************************
;顯示字符串,字符串以0結(jié)尾
; 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;消除不相關(guān)位的干擾
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 ;拉低數(shù)據(jù)線
MOV R5,#36
LCALL Delay ;調(diào)用延時子程序,發(fā)出一個540微秒的低脈沖
SETB WDDATA ;再次拉高數(shù)據(jù)線
NOP
NOP
MOV R0,#36
TZ2: JNB WDDATA,TZ3 ;運行36次跳轉(zhuǎn)指令,等待72微秒,其間收到低脈沖,證明18B20存在,否則不存在
DJNZ R0,TZ2
LJMP TZ4
TZ3: SETB exist1820 ;收到低脈沖,標(biāo)志位置高,證明18B20存在
LJMP TZ5
TZ4: CLR exist1820 ;沒有低脈沖反饋,證明18B20沒有連接上,標(biāo)志位置低
LJMP TZ7 ;TZ7將P3.0拉高
TZ5: MOV R0,#06EH ;復(fù)位成功,按照時序延時240微秒
TZ6: DJNZ R0,TZ6
TZ7: SETB WDDATA
ret;
;540微秒延時
Delay:
LOOP:MOV R4,#06H
LOOP1:DJNZ R4,LOOP1
DJNZ R5,LOOP
ret;
;讀出轉(zhuǎn)化后溫度值的子程序
GetTemp:
setb WDDATA; //定時入口
lcall Init_1820; //運行前先復(fù)位
jnb exist1820,gettempend; //如果檢測到18B20存在,跳到退出
mov A,#0cch;
lcall Write1820; //調(diào)用SKIP ROM命令
mov A,#044h;
lcall Write1820; //調(diào)用CONVERT命令,一定要先執(zhí)行ROM命令再執(zhí)行RAM命令
MOV R5,#50 ; //根據(jù)時序要求延時750微秒等待A/D轉(zhuǎn)換結(jié)束
LCALL Delay;
lcall Init_1820; //在讀溫度值前先復(fù)位
mov A,#0ccH;
lcall Write1820; //每下一個命令都要調(diào)用寫程序?qū)懭? mov A,#0BEH;
lcall Write1820;
lcall Read1820;
mov tempL,A; //低位數(shù)
lcall Read1820;
mov tempH,A; //高位數(shù)
gettempend:
ret;
Write1820:
;程序入口為ACC
;寫溫度子程序
MOV R2,#8 ;//一個字節(jié)共8位
CLR C ;//清空進位位
wr18201: CLR WDDATA ;//拉低總線
MOV R3,#8
DJNZ R3,$ ;//18B20開始工作,對數(shù)據(jù)進行采樣,等待1
RRC A ;
MOV WDDATA,C ;//命令字按位依次送給18B20
MOV R3,#32
DJNZ R3,$ ;//保證寫過程持續(xù)在60微秒?
SETB WDDATA
NOP
DJNZ R2,WR18201 ;//未寫完一個字節(jié)的話繼續(xù)進行
SETB WDDATA
ret;
;讀溫度子程序,可以讀出9個8位數(shù)據(jù),分別存入以60H開始的9個地址內(nèi)
Read1820:
RE0: MOV R2,#8 ;//數(shù)據(jù)共有8位
RE1: CLR C
SETB WDDATA
NOP
NOP ;//
CLR WDDATA
NOP
NOP
NOP ;//保持低電平2微秒
SETB WDDATA ;//
MOV R3,#09
RE2: DJNZ R3,RE2 ;//等待9微秒,讓字節(jié)傳來
MOV C,WDDATA ;//主機按位依次讀入18B20數(shù)據(jù)
MOV R3,#24
RE3: DJNZ R3,RE3
RRC A ;//讀取數(shù)據(jù)移入A
DJNZ R2,RE1
NOP;
NOP;
NOP;
SETB WDDATA
ret; 返回數(shù)據(jù)在A中
;溫度計算子程序
;整數(shù)部分則把61H低四位變?yōu)?0H高四位,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 ;//或得到一個新字節(jié)
MOV calbuff1,A ;//存入整數(shù)部分低位
MOV A,tempH
ANL A,#80H ;//取溫度高位上最高位,因為dispbuff2 前5位如果是1,溫度為負,?
jnb acc.7,ZHENG ;//如果是0,溫度為正,跳轉(zhuǎn)
MOV A,calbuff1 ;//如果是1,溫度為負
CPL A ;//溫度值取反
INC A
MOV tempsign,#10 ;//給符號位賦值"-"
MOV calbuff1,A
sjmp endCalcul;
ZHENG:MOV tempsign,#00H ;//給符號位賦值"0"
endCalcul:
ret;
;*****************************************
;數(shù)據(jù)轉(zhuǎn)換,將A中的數(shù)據(jù)轉(zhuǎn)化為三位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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -