标题:帮忙差错一个带键盘的液晶显示程序
只看楼主
justinzheng
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-10-1
 问题点数:0 回复次数:2 
帮忙差错一个带键盘的液晶显示程序

这段程序在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

[此贴子已经被作者于2007-3-18 16:15:37编辑过]

搜索更多相关主题的帖子: 液晶显示 lcd 键盘 低级错误 
2007-03-18 16:13
justinzheng
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-10-1
得分:0 

怎么没有人帮忙看看阿,虽然可能比较烂阿!!

2007-03-20 13:52
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
得分:0 
太复杂了,看不懂

2007-03-20 15:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-124969-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.501631 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved