打印

求助一个关于1602液晶的程序修改(带键盘的)

[复制链接]
2045|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
夏之剑客|  楼主 | 2007-3-20 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这段程序在1602上总是总是只显示一行黑屏,谁能帮帮看看哪里有错,这是我写的第二个液晶程序,可能会有低级错误,包含阿!!!

;**************************************************
;file:lcdkey
;name:键盘控制和lcd的运用
;date:2007.3.4
;**************************************************
;功能描述:
;**开机显示 input the code
;             0000
;**通过键盘将一个4位数的输入,键盘一共5个键
;  分别起到加、减、左移、右移、确认的功能
;**************************************************
      RS BIT P3.3     ;寄存器选择,1表示数据寄存器,0表示指令寄存器
      RW BIT P3.5     ;读写信号线,高电平为读,低电平为写,
                      ;RS RW同时为低表示写指令,RS低RW高则是读忙信号,反之写入数据
      E  BIT P3.4     ;液晶显示使能,高到低时执行命令
      OUTPUT EQU P0
      keyboard bit p2.6
      codebufa equ 40h             ;存放第二行的第一个0,依次类推
      codebufb equ 41h             
      codebufc equ 42h
      codebufd equ 43h

      org 0000h
      ajmp main
      org 0003h
      ajmp ankey
main: mov sp,#60h
      mov output,#01h      ;清屏
      lcall enable         ;每次操作都要保存
      mov output,#38h      ;功能选择
      lcall enable 
      mov output,#0eh      ;开显示幕
      lcall enable
      mov output,#06h      ;表示光标向右移,屏幕上文字不移动
      lcall enable  
      mov output,#80h        ;设定第一行起始地址
      lcall enable
       mov r4,#30h           ;存放要显示的字符
      mov r3,#030h           ;存放第二行光标地址
      setb ea                ;中断开放
      setb et0               ;允许INT0
      mov dptr,#table1
      lcall display
      mov output,#0c0h
      lcall enable 
      mov dptr,#table2
      lcall display
      mov output,#0fh        ;开显示幕
      lcall enable
      mov output,#0c0h       ;表示光标停在第二行第一个'0'这里
      lcall enable 
      ajmp $
;-----------------写入程序寄存器--------------------------
enable:clr e          ;先禁止,在第二次进入的时候就有效了
       lcall delay
       clr rs         ;写指令到寄存器
       clr rw
       setb e
       ret
;------------------写入数据寄存器,显示-------------------
display: clr rs0
         clr rs1
     mov r1,#16   ;每行显示十六个字
loop1:   clr a 
         movc a,@a+dptr
     mov output,a
     clr e
     lcall delay
     clr rw       ;写数据到寄存器
     setb rs
     setb e
     inc dptr
         djnz r1,loop1         
     ret
;------------------键盘中断-------------------------------
ankey:push acc
      push psw
      push b
      clr keyboard
      mov a,output
      lcall key
      push b
      push psw
      pop acc
      reti
key:  jnb acc.0,add1
      jnb acc.1,subb1
      jnb acc.2,left
      jnb acc.3,right
      jnb acc.4,enter
      jnb acc.5,undef        ;该键暂时没有定义功能
      ret
;----------------按键处理----------------------------------
enter:lcall delay
      jb acc.4,key
      mov output,#0ch        ;表示光标闪烁关闭
      lcall enable
      ret
undef:lcall delay
      jb acc.4,key
      ret
add1: lcall delay           ;消除抖动,就是判断是否是不小心碰到键
      jb acc.0,key
      lcall bian0            ;判断光标在什么位置,从而确定对哪个数进行运算
      add a,#1
      da a                   ;十进制调整
      lcall loop1
      jnb acc.0,add1         ;检查是否该键再次被按
      ret
subb1:lcall delay
      jb acc.1,key 
      mov output,#0fh        ;表示光标闪烁打开
      lcall enable
      lcall bian0            ;判断光标在什么位置,从而确定对哪个数进行运算
      clr c                  ;subb的减法是带有进位标志的,进位标志清零
      subb a,#1
      da a
      lcall loop1
      jnb acc.1,subb1
      ret
left: lcall delay
      jb acc.2,key
      mov a,output
      add a,#1
      mov output,a 
      lcall enable
      ret
right:lcall delay
      jb acc.3,key
      mov a,output
      dec a 
      mov output,a 
      lcall enable
      ret
bian0:mov r3,output
      cjne r3,#030h,bian1
      mov a,codebufa
bian1:cjne r3,#031h,bian2
      mov a,codebufb
bian2:cjne r3,#032h,bian3
      mov a,codebufc
bian3:cjne r3,#033h,exit
      mov a,codebufd
exit: ret
;----------------延时程序---------------------------------
delay:mov r7,#248          ;50ms延时
loop2:mov r6,#100
loop3:djnz r6,loop3
      djnz r7,loop2
      ret
table1:db 'input the code  '
table2:db '0000            '
       end
 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

11

帖子

0

粉丝