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

[复制链接]
2661|0
 楼主| 夏之剑客 发表于 2007-3-20 13:42 | 显示全部楼层 |阅读模式
这段程序在1602上总是总是只显示一行黑屏,谁能帮帮看看哪里有错,这是我写的第二个液晶程序,可能会有低级错误,包含阿!!!<br /><br />;**************************************************<br />;file:lcdkey<br />;name:键盘控制和lcd的运用<br />;date:2007.3.4<br />;**************************************************<br />;功能描述:<br />;**开机显示&nbsp;input&nbsp;the&nbsp;code<br />;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0000<br />;**通过键盘将一个4位数的输入,键盘一共5个键<br />;&nbsp;&nbsp;分别起到加、减、左移、右移、确认的功能<br />;**************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RS&nbsp;BIT&nbsp;P3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;寄存器选择,1表示数据寄存器,0表示指令寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RW&nbsp;BIT&nbsp;P3.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;读写信号线,高电平为读,低电平为写,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;RS&nbsp;RW同时为低表示写指令,RS低RW高则是读忙信号,反之写入数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;&nbsp;BIT&nbsp;P3.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;液晶显示使能,高到低时执行命令<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;EQU&nbsp;P0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyboard&nbsp;bit&nbsp;p2.6<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codebufa&nbsp;equ&nbsp;40h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;存放第二行的第一个0,依次类推<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codebufb&nbsp;equ&nbsp;41h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codebufc&nbsp;equ&nbsp;42h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codebufd&nbsp;equ&nbsp;43h<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org&nbsp;0000h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ajmp&nbsp;main<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org&nbsp;0003h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ajmp&nbsp;ankey<br />main:&nbsp;mov&nbsp;sp,#60h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#01h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;清屏<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;每次操作都要保存<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#38h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;功能选择<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#0eh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;开显示幕<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#06h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;表示光标向右移,屏幕上文字不移动<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#80h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设定第一行起始地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r4,#30h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;存放要显示的字符<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r3,#030h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;存放第二行光标地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;ea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;中断开放<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;et0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;允许INT0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;dptr,#table1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;display<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#0c0h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;dptr,#table2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;display<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#0fh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;开显示幕<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#0c0h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;表示光标停在第二行第一个'0'这里<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ajmp&nbsp;$<br />;-----------------写入程序寄存器--------------------------<br />enable:clr&nbsp;e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;先禁止,在第二次进入的时候就有效了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;delay<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr&nbsp;rs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;写指令到寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr&nbsp;rw<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />;------------------写入数据寄存器,显示-------------------<br />display:&nbsp;clr&nbsp;rs0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr&nbsp;rs1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,#16&nbsp;&nbsp;&nbsp;;每行显示十六个字<br />loop1:&nbsp;&nbsp;&nbsp;clr&nbsp;a&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movc&nbsp;a,@a+dptr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,a<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr&nbsp;e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;delay<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr&nbsp;rw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;写数据到寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;rs<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inc&nbsp;dptr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r1,loop1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />;------------------键盘中断-------------------------------<br />ankey:push&nbsp;acc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;psw<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;b<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr&nbsp;keyboard<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,output<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;b<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;psw<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;acc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reti<br />key:&nbsp;&nbsp;jnb&nbsp;acc.0,add1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;acc.1,subb1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;acc.2,left<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;acc.3,right<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;acc.4,enter<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;acc.5,undef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;该键暂时没有定义功能<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />;----------------按键处理----------------------------------<br />enter:lcall&nbsp;delay<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jb&nbsp;acc.4,key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#0ch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;表示光标闪烁关闭<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />undef:lcall&nbsp;delay<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jb&nbsp;acc.4,key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />add1:&nbsp;lcall&nbsp;delay&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;消除抖动,就是判断是否是不小心碰到键<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jb&nbsp;acc.0,key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;bian0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;判断光标在什么位置,从而确定对哪个数进行运算<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;a,#1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;da&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;十进制调整<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;loop1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;acc.0,add1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;检查是否该键再次被按<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />subb1:lcall&nbsp;delay<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jb&nbsp;acc.1,key&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,#0fh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;表示光标闪烁打开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;bian0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;判断光标在什么位置,从而确定对哪个数进行运算<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;subb的减法是带有进位标志的,进位标志清零<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subb&nbsp;a,#1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;da&nbsp;a<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;loop1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;acc.1,subb1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />left:&nbsp;lcall&nbsp;delay<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jb&nbsp;acc.2,key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,output<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;a,#1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,a&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />right:lcall&nbsp;delay<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jb&nbsp;acc.3,key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,output<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dec&nbsp;a&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;output,a&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcall&nbsp;enable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />bian0:mov&nbsp;r3,output<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cjne&nbsp;r3,#030h,bian1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,codebufa<br />bian1:cjne&nbsp;r3,#031h,bian2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,codebufb<br />bian2:cjne&nbsp;r3,#032h,bian3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,codebufc<br />bian3:cjne&nbsp;r3,#033h,exit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,codebufd<br />exit:&nbsp;ret<br />;----------------延时程序---------------------------------<br />delay:mov&nbsp;r7,#248&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;50ms延时<br />loop2:mov&nbsp;r6,#100<br />loop3:djnz&nbsp;r6,loop3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r7,loop2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />table1:db&nbsp;'input&nbsp;the&nbsp;code&nbsp;&nbsp;'<br />table2:db&nbsp;'0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部