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