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

📄 set5(old).asm

📁 用1602和中断式键盘控制一个六层的界面
💻 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 + -