2745|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

16*32的汇编问题!谢谢帮我解决下吧。 [复制链接]

这个是论坛里面的一个16*32的程序,行选通用的154,列用的595 。我不太明白是如何查表送数并显示到点阵屏上的,希望谁能帮我看下。我是初学者,只道道595是串行输入,通过脉冲信号和对用的码表传数据,希望谁能帮我下。。。最好以“欢迎”为例子对应说下,谢谢了,如何取消左移显示两个汉字。
16*32点阵左移显示程序(汇编),如外接64KROM可以显示2000多个汉字 由于限制上传字数后面的码表没有传
行154,列595
;============================================
; 16*32点阵屏左滚动显示n个汉字程序
;============================================
D_F EQU 40H   ;第一个显示数据缓冲器
D_MB EQU 30H  ;数据位移动次数寄存器
D_AM EQU 31H  ;显示半角字个数寄存器
DAMT EQU 32H  ;显示半角字个数倍数寄存器
OFFSET EQU 33H  ;数据指针偏移量
SPEED EQU 34H  ;移动速度寄存器
S_I BIT P1.4  ;数据总线
RCK BIT P1.5  ;锁存信号线
SCK BIT P1.6  ;移位时钟信号线
EN BIT P1.7  ;消隐信号线
;--------程序入口地址----------------
ORG 0000H
JMP START
ORG 0030H
;====================================
; 初始化
;====================================
START:
MOV SP, #0AH  ;修改堆栈指针
CLR A   ;清累加器
MOV R7, #5
MOV R0, #D_F
ST1: MOV @R0, A
INC R0
DJNZ R7, ST1
MOV R7, #20H
MOV R0, #D_MB
ST2: MOV @R0, A
INC R0
DJNZ R7, ST2   ;寄存器清0
MOV P1, #00H
MOV DPTR, #DTAB  ;数据表首地址放入DPTR
MOV DAMT, #1  ;显示的半角字的个数的倍数
MOV SPEED, #1
;====================================
; 主程序
;====================================
MAIN:
MOV R5, #16  ;扫描16行
MOV OFFSET, #00H  ;数据指针偏移量清0
MA1: CALL QUSHU   ;调用取数子程序
SETB EN    ;关显示
DEC P1   ;修改行值
CLR RCK  
SETB RCK   ;锁存显示数据
CLR EN   ;开显示
DJNZ R5, MA1  ;16行未完继续
    DJNZ SPEED, MAIN  
MOV SPEED, #4  ;移动速度
  INC D_MB   
MOV A, D_MB
CJNE A, #8, M_OUT
MOV D_MB, #0  ;1个半角字符要移动8次
MOV A, #16   
ADD A, DPL
MOV DPL, A
CLR A
ADDC A, DPH
MOV DPH, A  ;地址指针修改
INC D_AM
MOV A, D_AM
CJNE A, #151, M_OUT ;显示的半角字符的个数
MOV D_AM, #00H  
DJNZ DAMT, M_OUT
MOV DAMT, #1  ;显示的半角字的个数的倍数
MOV DPTR, #DTAB  ;循环滚动显示
MOV P1, #00H
M_OUT: JMP MAIN
;===================================
; 取出并发送一行数据子程序
;===================================
QUSHU:
MOV R7, #9  ;取出半角字数据的个数
MOV R0, #D_F  ;数据缓冲区首地址存入R0
PUSH DPH
PUSH DPL   ;数据保护
MOV A, OFFSET  ;查表偏移量放入A
QUSH1: ADD A, DPL
MOV DPL, A
MOV A, DPH
ADDC A, #00H  
MOV DPH, A
CLR A   
MOVC A, @A+DPTR  ;查表取数
MOV @R0, A  ;存储数据
INC R0   ;修改地址指针
MOV A, #16  ;修改查表偏移量
DJNZ R7, QUSH1  ;数据未取完继续
POP DPL
POP DPH
INC OFFSET   ;查表偏移量+1   
;-----------------------------------
; 数据发送子程序
;-----------------------------------
DSEND:
MOV R0, #D_F  ;第一个显示数据缓冲区地址放人R0
MOV R6, #8  ;发送n字节(1行)
DSE1: MOV R7, #8  ;每次发送8位
MOV A, @R0  ;显示数据放入A
DSE2: RLC A   ;将A的内容按位移入C
MOV S_I, C  ;将C的内容送数据总线
CLR SCK  
SETB SCK   ;输出移位脉冲
DJNZ R7, DSE2  ;8位未发送完继续
INC R0   ;修改地址指针
DJNZ R6, DSE1  ;字节数未发送完继续
;--------屏幕左移一位---------------
MOV A, D_MB  ;移动位次数放入A
JZ TAMEND   ;为0转移
MOV R7, D_MB  ;移动位次数放入R7
MOV A, @R0  ;移入的数据存入A
DSE3: RLC A   ;将A的内容按位移入C
MOV S_I, C  ;将C的内容送数据总线
CLR SCK
SETB SCK   ;输出移位脉冲
DJNZ R7, DSE3  ;移位次数未完继续
;--------移位时间修正---------------
TAMEND: CLR C   ;清C
MOV A, #7
SUBB A, D_MB  ;需要再延时的次数
JZ D_OUT
MOV R7, A
TA1: NOP   
NOP
NOP
NOP
NOP
DJNZ R7, TA1  ;空操作(延时)
D_OUT: RET
;====================================
; 文字编码表
;====================================         
DTAB:
DB 07FH,07FH,07FH,001H,0FBH,0B7H,0BFH,0BFH,0BFH,09FH,05FH,06FH,0E7H,0F1H,0FBH,0FFH;"欢",0
DB 0BFH,0DEH,0C9H,0DBH,0FBH,0FBH,01BH,0DBH,0DAH,0D9H,0DBH,0DFH,0DFH,0AFH,070H,0FFH;
DB 0FFH,07FH,083H,0BBH,0BBH,0BBH,0BBH,0BBH,0BBH,0ABH,0B7H,0BFH,0BFH,0FFH,001H,0FFH;"迎",0
DB 0FEH,0DEH,0E6H,0F2H,0F6H,0FEH,080H,0FBH,0FBH,0FBH,0FBH,0F7H,0F7H,0EFH,0DFH,0BFH;
END
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表