求51汇编语言实现点亮LCD12864上的一个点的程序 20

只要点亮一个点,越简短越好。这是我的程序,太长,不看也罢。多按几次复位键就花屏了。RSEQUP2.0RWEQUP2.1EEQUP2.2LCD_BUSEQUP1CNTEQU... 只要点亮一个点,越简短越好。这是我的程序,太长,不看也罢。多按几次复位键就花屏了。
RS EQU P2.0
RW EQU P2.1
E EQU P2.2
LCD_BUS EQU P1
CNT EQU 30H

ORG 0000H
AJMP START
ORG 002BH
START:
MOV SP,#60H
ACALL INIT_LCD
ACALL DRAW ;绘图
AJMP $

INIT_LCD:
MOV A,#30H
ACALL WRITE_COM
MOV A,#30H
ACALL WRITE_COM
MOV A,#0CH
ACALL WRITE_COM
MOV A,#01H
ACALL WRITE_COM
MOV A,#06H
ACALL WRITE_COM
RET

WRITE_COM: ;写命令,命令在累加器A中
ACALL READ_BUSY
CLR RS
CLR RW
MOV LCD_BUS,A
SETB E
NOP
CLR E
RET
WRITE_DATA: ;写数据,数据在累加器A中
ACALL READ_BUSY
SETB RS
CLR RW
SETB E
MOV LCD_BUS,A
CLR E
RET
READ_BUSY: ;读忙
MOV LCD_BUS,#0ffH
CLR RS
SETB RW
SETB E
JB LCD_BUS.7,$
RET
DRAW: ;绘图
ACALL CLR_GDRAM ;清空GDRAM,防止花屏
MOV A,#034H ;扩展指令集
ACALL WRITE_COM
MOV A,#30H
ACALL DELAY
MOV A,#00110100B ;OFF
ACALL WRITE_COM
MOV A,#30H
ACALL DELAY
;MOV A,#3EH ;绘图打开
;ACALL WRITE_COM
;MOV A,#100
ACALL DELAY
MOV A,#01H
ACALL WRITE_COM
MOV A,#100
ACALL DELAY
;MOV A,#34H ;绘图显示关
;ACALL WRITE_COM
MOV A,#80H ;设定Y
ACALL WRITE_COM
MOV A,#80H;设定X
ACALL WRITE_COM
MOV A,#00H
ACALL WRITE_DATA
MOV A,#01H
ACALL WRITE_DATA
MOV A,#00110110B ;绘图显示开
ACALL WRITE_COM
MOV A,#00110000B ;基本命令
ACALL WRITE_COM
RET

CLR_GDRAM:
PUSH CNT
push acc
MOV A,#034H ;扩展指令集,绘图关
ACALL WRITE_COM
MOV A,#36H ;绘图开
ACALL WRITE_COM
MOV CNT,#0 ;初始化变量i=0
LOOP_EXTER_CNT:
PUSH CNT ;保护变量i
MOV CNT,#0 ;初始化变量j=0
LOOP_INNER_CNT:
MOV A,#80H
ADD A,#CNT
ACALL WRITE_COM ;写Y坐标
POP ACC ;将变量i弹给ACC,方便下面的判断
PUSH ACC ;将i继续压栈保护
CJNE A,#1,WRITE_NEXT_SCREEN ;如果i值为1则写下半屏
MOV A,#80H
ACALL WRITE_COM
BACK_WRITE_NEXT_SCREEN:
PUSH CNT ;保护变量j
MOV CNT,#16 ;置0GDRAM开始
LOOP_K:
MOV A,#0
ACALL WRITE_COM
DEC CNT
MOV A,CNT
CJNE A,#0,LOOP_K
POP CNT ;弹出变量j
INC CNT
MOV R0,CNT
CJNE R0,#32,LOOP_INNER_CNT ;如果变量j增至32则结束该层循环
POP CNT ;弹出变量i
INC CNT ;变量i自加1
MOV R0,CNT
CJNE R0,#2,LOOP_EXTER_CNT ;如果变量i增至2则结束该层循环
MOV A,#30H ;关闭扩展指令集
ACALL WRITE_COM
POP CNT
POP ACC
RET
WRITE_NEXT_SCREEN:
MOV A,#88H
ACALL WRITE_COM
AJMP BACK_WRITE_NEXT_SCREEN

END
展开
 我来答
wangfan2000
2012-09-28 · TA获得超过2549个赞
知道小有建树答主
回答量:586
采纳率:50%
帮助的人:570万
展开全部
E BIT P3.0 ;LCD 使能端
RW BIT P3.1 ;LCD 读/写端
RS BIT P3.2 ;命令/数据控制端
CS1 BIT P3.4 ;左半屏
CS2 BIT P3.3 ;右半屏
WR_DATA DATA 30H ;数据暂存区
Y DATA 31H ;列数据暂存区
;//////主程序开始//////////////////////////////
ORG 0000H
AJMP START
ORG 0030H
START:

MOV SP,#60H ;设置堆栈
;LCALL CLR_Screen ;调用清屏子程序
;LCALL Init ;调用初始化子程序
;------左半屏显示------------------------------
REP: MOV R2,#00H ;用于记录显示个数
MOV Y,#00H ;用于增加LCD列数
MOV DPTR,#TAB ;取字码
;------左上半字显示------------------------------
REP1: MOV R3,#10H ;记录列数
MOV WR_DATA,#0C0H ;设置行数(第一行开始显示)
LCALL WR_Left_COM ;调用左半屏写命令子程序
MOV WR_DATA,#0BBH ;设置页数(第4页)
LCALL WR_Left_COM
CLR A ;设置显示开始列数
ADD A,Y
ADD A,#50H
MOV WR_DATA,A
LCALL WR_Left_COM
REP2: MOV A,#00H
MOVC A,@A+DPTR
MOV WR_DATA,A
LCALL WR_Left_Byte ;调用左半屏写数据子程序
INC DPTR
DJNZ R3,REP2
;------左下半字显示--------------------------------
MOV R3,#10H;左下
MOV WR_DATA,#0C0H
LCALL WR_Left_COM
MOV WR_DATA,#0BCH ;第五页
LCALL WR_Left_COM
CLR A
ADD A,Y
ADD A,#50H
MOV WR_DATA,A
LCALL WR_Left_COM
REP3: MOV A,#00H
MOVC A,@A+DPTR
MOV WR_DATA,A
LCALL WR_Left_Byte
INC DPTR
DJNZ R3,REP3
;------实现左半屏显示3个字---------------------------
INC R2
MOV A,y
ADD A,#10H
MOV Y,A
CJNE R2,#03H,REP1
;------右半屏显示------------------------------------
MOV R2,#00H
MOV Y,#00H
;------右上半字显示----------------------------------
REP4: MOV R3,#10H
MOV WR_DATA,#0C0H
LCALL WR_Right_COM ;调用右半屏写入命令子程序
MOV WR_DATA,#0BBH
LCALL WR_Right_COM
CLR A
ADD A,Y
ADD A,#40H
MOV WR_DATA,A
LCALL WR_Right_COM
REP5: MOV A,#00H
MOVC A,@A+DPTR
MOV WR_DATA,A
LCALL WR_Right_Byte ;调用右半屏写入数据子程序
INC DPTR
DJNZ R3,REP5
;------右下半字显示----------------------------------
MOV R3,#10H
MOV WR_DATA,#0C0H
LCALL WR_Right_COM
MOV WR_DATA,#0BCH
LCALL WR_Right_COM
CLR A
ADD A,Y
ADD A,#40H
MOV WR_DATA,A
LCALL WR_Right_COM
REP6: MOV A,#00H
MOVC A,@A+DPTR
MOV WR_DATA,A
LCALL WR_Right_Byte
INC DPTR
DJNZ R3,REP6
;------实现右半屏显示2个字-----------------------------
INC R2
MOV A,y
ADD A,#10H
MOV Y,A
CJNE R2,#02H,REP4
;------循环显示----------------------------------------
LJMP REP
;//////初始化子程序///////////////////////////////////
Init:
MOV WR_DATA,#3EH ;关显示
LCALL WR_COM ;调用全屏写入命令子程序
MOV WR_DATA,#3FH ;开显示
LCALL WR_COM
RET
;//////左半屏写入字节子程序///////////////////////////
WR_Left_Byte: CLR CS1 ;选择左半屏
SETB CS2
CLR RW ;写
SETB RS ;选择写命令
MOV A,WR_DATA
SETB E
MOV P0,A
CLR E
LCALL DELAY ;调用延时子程序,这里用延时来代替忙信号检测
RET
;//////右半屏写入字节子程序///////////////////////////////
WR_Right_Byte: SETB CS1
CLR CS2
CLR RW
SETB RS
MOV A,WR_DATA
SETB E
MOV P0,A
CLR E
LCALL DELAY
RET
;//////全屏写入字节子程序////////////////////////////////
WR_Byte: CLR CS1
CLR CS2
CLR RW
SETB RS
MOV A,WR_DATA
SETB E
MOV P0,A
CLR E
LCALL DELAY
RET
;//////左半屏写入命令子程序/////////////////////////////
WR_Left_COM: CLR CS1
SETB CS2
CLR RS
CLR RW
MOV A,WR_DATA
SETB E
MOV P0,A
CLR E
LCALL DELAY
RET
;//////右半屏写入命令子程序//////////////////////////////////
WR_Right_COM: SETB CS1
CLR CS2
CLR RS
CLR RW
MOV A,WR_DATA
SETB E
MOV P0,A
CLR E
LCALL DELAY
RET
;//////全屏写入命令字程序/////////////////////////////////////
WR_COM:
CLR CS1
CLR CS2
CLR RS
CLR RW
MOV A,WR_DATA
SETB E
MOV P0,A
CLR E
LCALL DELAY
RET
;//////全屏清屏子程序//////////////////////////////////////////
CLR_Screen:
MOV WR_DATA,#0C0H
LCALL WR_COM
MOV R0,#0B8H
MOV R1,#00H
LOOP: MOV WR_DATA,R0
LCALL WR_COM
MOV WR_DATA,#40H
LCALL WR_COM
LOOP1: MOV WR_DATA,#0FFH ;全屏清黑(这里我是用反色显示汉字的)
LCALL WR_Byte
INC R1
CJNE R1,#80H,LOOP1
INC R0
CJNE R0,#0C0H,LOOP
RET
;//////延时子程序//////////////////////////////////
DELAY: MOV R7,#25H
DJNZ R7,$
RET
;//////字型码表////////////////////////////////////
TAB:
;-- 文字: 不 --
;-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --
DB 0FFH,0FFH,0FFH,0DFH,0CFH,0CFH,0DFH,1FH,1FH,5FH,0DFH,0DFH,0DFH,0FFH,0FFH,0FFH
DB 0FFH,0F7H,0F7H,0F3H,0FBH,0F9H,0FCH,0C0H,0C0H,0FFH,0FEH,0FCH,0F1H,0F3H,0F7H,0F7H
;-- 文字: 亦 --
;-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --
DB 0FFH,0BFH,0BFH,0BFH,3FH,0DFH,1FH,0CFH,0CFH,1FH,0DFH,9FH,9FH,0BFH,0BFH,0FFH
DB 0FFH,0FFH,0EBH,0ECH,0E6H,0F3H,0F8H,0EFH,0EFH,0E0H,0FFH,0FEH,0FDH,0FBH,0FFH,0FFH
;-- 文字: 心 --
;-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --
DB 0FFH,0FFH,7FH,0FFH,7FH,0FFH,0FFH,3FH,8FH,0FFH,7FH,3FH,0BFH,0FFH,0FFH,0FFH
DB 0F7H,0F1H,0F8H,0FFH,0FEH,0FEH,0FCH,0F9H,0F3H,0F1H,0E6H,0E7H,0C7H,0E7H,0E7H,0FFH
;-- 文字: 制 --
;-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --
DB 0FFH,7FH,0BFH,8FH,0BFH,0FH,2FH,3FH,0BFH,0FFH,1FH,0FFH,0CFH,0FH,0FFH,0FFH
DB 0FEH,0FEH,0EEH,0E0H,0FCH,0C0H,0FCH,0F9H,0E1H,0EFH,0E8H,0CFH,0C7H,0E0H,0FFH,0FFH
;-- 文字: 作 --
;-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --
DB 0FFH,9FH,9FH,1FH,1FH,6FH,0BFH,9FH,0CFH,0FH,9FH,9FH,9FH,0BFH,0BFH,0FFH
DB 0FFH,0FFH,0FFH,0E0H,0E0H,0FFH,0FFH,0FFH,0FFH,0C0H,0FAH,0FAH,0FAH,0FAH,0FBH,0FFH
;//////程序结束/////////////////////////////////////////////
END
;→↑← THREE→硬件连接及仿真效果图(仅为仿真目的,不做实际应用)
追问
你这个太大了。我只要画一个点就行了。
不过我今天自己解决了。
万事开头难啊,一点都不错。
谢谢你!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式