这段时间在学汇编,为了验证自己到底学了多少,于是用汇编的方式写个1602的显示驱动。
由于没有实物,只能用仿真,所以不敢保证在实物上也能正常工作。
初学汇编,不能像高手那样精简代码,程序也可能不完善,希望高手能指点一下,但是请不要指指点点。
因为是仿真,所以就没用“读忙”操作。代码如下(有点乱):
rs equ p2.0; //定义接口,变量地址
rw equ p2.1;
en equ p2.2;
lcd equ p0;
cmd equ 0c0h;
dat equ 0c1h;
x equ 0c2h;
y equ 0c3h;
org 0000h;
ajmp start;
org 30h;
start: lcall delay; //初始化
mov cmd,#38h;
lcall w_cmd;
mov cmd,#0ch;
lcall w_cmd;
mov cmd,#06h;
lcall w_cmd;
mov cmd,#01h;
lcall w_cmd;
loop: mov x,#00h; //显示数据
mov y,#00h;
mov dptr,#tab1;
lcall display;
mov x,#00h;
mov y,#01h;
mov dptr,#tab2;
lcall display;
sjmp $;
display:mov a,y; //判断哪一行显示
cjne a,#01h,dis1;
mov a,#0c0h;
add a,x;
mov cmd,a;
sjmp dis2;
dis1: mov a,#80h;
add a,x;
mov cmd,a;
dis2: lcall w_cmd;
lcall w_dat;
ret;
w_cmd:mov p2,#00h; //写命令call
mov a,cmd;
mov lcd,a;
clr rs;
lcall dims;
clr rw;
lcall dims;
setb en;
lcall dims;
clr en;
ret;
w_dat: mov p2,#00h; //写数据call
mov r5,x;
da1: mov a,r5;
movc a,@a+dptr;
mov lcd,a;
setb rs;
lcall dims;
clr rw;
lcall dims;
setb en;
lcall dims;
clr en;
inc r5;
cjne r5,#0fh,da1;
ret;
dims:mov r7,#25; //延时5ms,晶振为12MHz
di1:mov r6,#50;
di2: djnz r6,di2;
djnz r7,di1;
ret;
delay:mov r7,#100; //延时
d1:mov r6,#100;
d2: djnz r6,d2;
djnz r7,d1;
ret;
tab1: db 20h,57h,57h,57h,2eh,4fh,55h,52h,44h,45h; //“
www.ourdev.cn”
db 56h,2eh,43h,4eh,20h,20h;
tab2: db 20h,20h,4bh,65h,76h,69h,6eh,53h,74h,61h; //"kevinstar888"
db 72h,38h,38h,38h,20h,20h;
end;
1602仿真图.jpg (104.54 KB, 下载次数: 0)
下载附件
2012-5-25 23:43 上传
一周热门 更多>