📄 set5(old).asm
字号:
;***************************************************
;FILE:LED1
;NAME:带键盘的1602液晶显示器
;date:2007年3月1日
;function: 有一个简单的温度设置和密码设置的界面
; 通过按键可以输入温度和密码
;***************************************************
RS BIT P3.3 ;寄存器选择,1表示数据寄存器,0表示指令寄存器
RW BIT P3.5 ;读写信号线,高电平为读,低电平为写,
;RS RW同时为低表示写指令,RS低RW高则是读忙信号,反之写入数据
E BIT P3.4 ;液晶显示使能,高到低时执行命令
key_bit bit 01h ;键盘标志位
lcd_jd bit 02h ;节电模式标志位
signal equ 31h
gbbuf equ 40h ;光标寄存器
codebuf1 equ 41h ;密码的第一位数寄存器
codebuf2 equ 42h ;密码的第二位数寄存器
codebuf3 equ 43h ;密码的第三位数寄存器
codebuf4 equ 44h ;密码的第四位数寄存器
tempbuf1 equ 45h ;温度的第一位数寄存器
tempbuf2 equ 46h ;温度的第二位数寄存器
keyboard bit P2.6
lcd_bg bit P1.2
output equ p0
org 0000h
ajmp init
org 0003h
ajmp ankey
org 000bh ;T0中断入口
ajmp lowlight ;节电模式
init: mov sp,#80h
clr lcd_bg
clr gbbuf
mov b,#01h ;清屏
lcall enable ;每次操作都要保存
mov b,#38h ;功能选择
lcall enable
mov b,#0fh ;开显示幕
lcall enable
mov b,#06h ;表示光标向右移,屏幕上文字不移动
lcall enable
setb ea ;中断开放
setb ex0 ;允许INT0
setb et0 ;允许T0中断
setb tr0 ;开启T0计时器
mov tmod,#01H ;TO选用方式1,设置定时器
mov tl0, #00h ;50MS定时初值(T0用于节电)
mov th0, #4Ch
mov r4,#100 ;50ms*100=5s,表示三秒没有按键,则节电标志lcd_jd为1
welcome: mov b,#80h ;设定第一行起始地址
lcall enable
mov dptr,#table1
lcall display
mov b,#0c0h
lcall enable
mov dptr,#table2
lcall display
mov b,#0ch ;把光标和显示关闭,防止初始化时按键导致死机
lcall enable
main: jnb key_bit,next
clr key_bit
ajmp key
next: jnb lcd_jd,next1 ;节电模式
clr lcd_jd
setb lcd_bg
next1:nop
ajmp main
;----------根据光标位置判对哪一位加(1)----------------------
lop01: mov b,gbbuf
mov a,b
cjne a,#8ch,lop11
mov a,tempbuf1
inc a
cjne a,#3ah,lop03 ;判断其是否为9的后一个符号,
mov a,#30h ;如果是,则让其清零(查字库得0为30h)
lop03: mov tempbuf1,a
lcall display3
lcall enable
lop11: mov b,gbbuf
mov a,b
cjne a,#8dh,lop21
mov a,tempbuf2
inc a
cjne a,#3ah,lop13
mov a,#30h
lop13: mov tempbuf2,a
lcall display3
lcall enable
lop21: mov b,gbbuf
mov a,b
cjne a,#85h,lop31
mov a,codebuf1
inc a
cjne a,#3ah,lop23
mov a,#30h
lop23: mov codebuf1,a
lcall display3
lcall enable
lop31: mov b,gbbuf
mov a,b
cjne a,#86h,lop41
mov a,codebuf2
inc a
cjne a,#3ah,lop33
mov a,#30h
lop33: mov codebuf2,a
lcall display3
lcall enable
lop41: mov b,gbbuf
mov a,b
cjne a,#87h,lop51
mov a,codebuf3
inc a
cjne a,#3ah,lop43
mov a,#30h
lop43: mov codebuf3,a
lcall display3
lcall enable
lop51: mov b,gbbuf
mov a,b
cjne a,#88h,lop61
mov a,codebuf4
inc a
cjne a,#3ah,lop53
mov a,#30h
lop53: mov codebuf4,a
lcall display3
lcall enable
lop61: ret
;----------------按键处理1--------------------------------
plus: mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
jnb acc.0,plus
mov b,#0cfh
lcall enable
mov a,signal
dec a
lcall display3
mov signal,a
mov a,gbbuf
cjne a,#0c0h,plus1
mov gbbuf,#0c0h
lcall enable
plus1:cjne a,#080h,sign12
mov gbbuf,#0c0h
lcall enable
mov a,signal
cjne a,#32h,sign11
lcall menu2
sign11:cjne a,#34h,sign12
lcall menu3
sign12:lcall lop01
ajmp main
reduce:mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
jnb acc.2,reduce
mov b,#0cfh
lcall enable
mov a,signal
inc a
lcall display3
mov signal,a
mov a,gbbuf
cjne a,#080h,reduc1
mov gbbuf,#0c0h
lcall enable
reduc1:cjne a,#0c0h,sign2
mov gbbuf,#080h
lcall enable
mov a,signal
cjne a,#32h,sign1
lcall menu2
sign1: cjne a,#34h,sign2
lcall menu3
sign2: ajmp main
;----------------按键判断---------------------------------
key: mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
jnb acc.0,plus
jnb acc.1,left
jnb acc.2,reduce
jnb acc.3,right
jnb acc.4,menu
jnb acc.5,enter
ljmp main
;-----------------按键处理2--------------------------------
left: mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
jnb acc.1,left
mov a,gbbuf
dec a
mov gbbuf,a
mov b,gbbuf
lcall enable
mov gbbuf,b
loop9:ajmp main
right:mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
jnb acc.3,right
mov a,gbbuf
inc a
mov gbbuf,a
mov b,gbbuf
lcall enable
mov gbbuf,b
loop8:ajmp main
enter:mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
mov a,signal
cjne a,#31h,ente1
lcall settemp
ente1:cjne a,#32h,ente2
lcall setcode
ente2:cjne a,#33h,ente3
lcall chooseys
ente3:cjne a,#34h,ente4
lcall choosedy
ente4:cjne a,#35h,ente5
lcall ldjz
ente5:cjne a,#35h,ente6
lcall help
ente6:ajmp welcome
menu:mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
jnb acc.4,menu
lcall busy
mov b,#01h
lcall enable
mov b,#0fh
lcall enable
mov b,#81h ;温度的设置
lcall enable
mov dptr,#table3
lcall display
mov b,#0c1h ;密码的设置
lcall enable
mov dptr,#table4
lcall display
mov b,#0cfh
lcall enable
mov a,#signal
lcall display3
mov b,#80h ;光标停在第一行第一个字这里
lcall enable
mov gbbuf,b
ajmp main
;---------------菜单功能2-----------------------
menu2:lcall busy
mov b,#01h
lcall enable
mov b,#0fh
lcall enable
mov b,#81h ;选择元素
lcall enable
mov dptr,#table5
lcall display
mov b,#0c1h ;选择电源
lcall enable
mov dptr,#table6
lcall display
mov b,#80h ;光标停在第一行第一个字这里
lcall enable
mov gbbuf,b
ajmp main
menu3:lcall busy
mov b,#01h
lcall enable
mov b,#0fh
lcall enable
mov b,#81h ;零点校正
lcall enable
mov dptr,#table7
lcall display
mov b,#0c1h ;帮助菜单
lcall enable
mov dptr,#table8
lcall display
mov b,#80h ;光标停在第一行第一个字这里
lcall enable
mov gbbuf,b
ajmp main
;-----------------温度设置子程序--------------------------
settemp:lcall busy
mov b,#01h
lcall enable
mov b,#80h ;温度的设置
lcall enable
mov dptr,#table9
lcall display
mov b,#8ch
mov gbbuf,b
lcall enable
ajmp main
;-----------------密码设置子程序--------------------------
setcode:lcall busy
mov b,#01h
lcall enable
mov b,#80h ;密码的设置
lcall enable
mov dptr,#table10
lcall display
mov b,#85h
mov gbbuf,b
lcall enable
ajmp main
;-----------------选择元素子程序--------------------------
chooseys:lcall busy
mov b,#01h
lcall enable
mov b,#80h ;温度的设置
lcall enable
mov dptr,#table11
lcall display
mov b,#8ch
mov gbbuf,b
lcall enable
ajmp main
;-----------------选择电源--------------------------
choosedy:lcall busy
mov b,#01h
lcall enable
mov b,#80h ;温度的设置
lcall enable
mov dptr,#table12
lcall display
mov b,#8ch
mov gbbuf,b
lcall enable
ajmp main
;-----------------零点校正子程序--------------------------
ldjz: lcall busy
mov b,#01h
lcall enable
mov b,#80h ;温度的设置
lcall enable
mov dptr,#table13
lcall display
mov b,#8ch
mov gbbuf,b
lcall enable
ajmp main
;-----------------帮助子程序--------------------------
help: lcall busy
mov b,#01h
lcall enable
mov b,#80h ;温度的设置
lcall enable
mov dptr,#table14
lcall display
mov b,#8ch
mov gbbuf,b
lcall enable
ajmp main
;---------根据光标位置判对哪一位加----------------------
lop02: mov b,gbbuf
mov a,b
cjne a,#8ch,lop12
mov a,tempbuf1
dec a
cjne a,#2fh,lop04
mov a,#39h
lop04: mov tempbuf1,a
lcall display3
lcall enable
lop12: mov b,gbbuf
mov a,b
cjne a,#8dh,lop22
mov a,tempbuf2
dec a
cjne a,#2fh,lop14
mov a,#39h
lop14: mov tempbuf2,a
lcall display3
lcall enable
lop22: mov b,gbbuf
mov a,b
cjne a,#85h,lop32
mov a,codebuf1
dec a
cjne a,#2fh,lop24
mov a,#39h
lop24: mov codebuf1,a
lcall display3
lcall enable
lop32: mov b,gbbuf
mov a,b
cjne a,#86h,lop42
mov a,codebuf2
dec a
cjne a,#2fh,lop34
mov a,#39h
lop34: mov codebuf2,a
lcall display3
lcall enable
lop42: mov b,gbbuf
mov a,b
cjne a,#87h,lop52
mov a,codebuf3
dec a
cjne a,#2fh,lop44
mov a,#39h
lop44: mov codebuf3,a
lcall display3
lcall enable
lop52: mov b,gbbuf
mov a,b
cjne a,#88h,lop62
mov a,codebuf4
dec a
cjne a,#2fh,lop54
mov a,#39h
lop54: mov codebuf4,a
lcall display3
lcall enable
lop62: ret
;-----------------busy or not-----------------------------
busy: push acc ;正常读写操作之前必须检测LCD控制器状态
mov output,#0ffH
clr rs ;RS=0 RW=1 E=高电平
setb rw
setb e
wait: nop ;DB7: 0 LCD控制器空闲
jb p0.7,wait ; 1 LCD控制器忙
clr e
pop acc
RET
;-----------------写入程序寄存器--------------------------
enable:clr rs ;写指令到寄存器
clr rw
clr e ;先禁止,在第二次进入的时候就有效了
lcall delay
mov output,b
setb e
clr e
ret
;------------------写入数据寄存器,显示-------------------
display: mov r1,#00h
loop1: mov a,r1
movc a,@a+dptr
clr rw ;写数据到寄存器
setb rs
mov output,a
setb e
lcall delay
clr e
inc r1
cjne a,#00h,loop1
ret
;------------------写入数据寄存器,显示temperature-------------------
display1: mov r1,#00h
loop10: mov a,r1
movc a,@a+dptr
clr rw ;写数据到寄存器
setb rs
mov output,a
cjne r1,#0ch,lop1
mov tempbuf1,a
lop1: cjne r1,#0dh,lop2
mov tempbuf2,a
lop2: setb e
lcall delay
clr e
inc r1
cjne a,#00h,loop10
ret
;------------------写入数据寄存器,显示code-------------------
display2: mov r1,#00h
loop11: mov a,r1
movc a,@a+dptr
clr rw ;写数据到寄存器
setb rs
mov output,a
cjne r1,#05h,lop3
mov codebuf1,a
lop3: cjne r1,#06h,lop4
mov codebuf2,a
lop4: cjne r1,#07h,lop5
mov codebuf3,a
lop5: cjne r1,#08h,lop6
mov codebuf4,a
lop6: setb e
lcall delay
clr e
inc r1
cjne a,#00h,loop11
ret
;----------------显示-------------------------------------
display3:clr rw
setb rs
mov output,a
setb e
lcall delay
clr e
ret
;----------------键盘中断---------------------------------
ankey:push acc
push psw
setb key_bit
clr lcd_bg
mov tl1,#00h ;重载定时器初值
mov th1,#4ch
mov r4,#100
pop psw
pop acc
reti
;----------------T0定时计数器-----------------------------
lowlight: push acc
push psw
mov tl1,#00h ;重载定时器初值
mov th1,#4ch
djnz r4, exita
mov r4,#100
setb lcd_jd
exita: pop psw
pop acc
reti
;----------------延时程序---------------------------------
delay:mov r7,#25 ;0.5ms延时
loop2:mov r6,#10
loop3:djnz r6,loop3
djnz r7,loop2
ret
table1:db 'welcome to use ',00h
table2:db 'the system ',00h
table3:db 'set temperature ',00h
table4:db 'set code ',00h
table5:db 'choose element ',00h
table6:db 'choose power ',00h
table7:db 'check zero point',00h
table8:db 'help ',00h
table9:db 'temperature:00',0dfh,'c',00h
table10:db 'code:0000 ',00h
table11:db 'element:H C O F ',00H
table12:db 'power: cell 9vAC',00H
table13:db 'zero: 0-0-0-0 ',00h
table14:db 'ask your friends',00h
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -