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