[求助] 怎么改善LED点阵左移拖影问题

简糊仙   2012-1-14 23:37 楼主

前阵子我在别的论坛买了一块16×64的点阵屏,带STC89C52RC驱动的,根据实物,我已绘制出其电路,并下载了一个左移程序,但搞了很久,都无法解决重影问题!如果一帧只扫一次的话,没有重影,每行扫频为1ms,但移动速度很多,没什么实用价值,于是设置R2延迟因子,同一帧扫几次,这样左移速度虽然慢下来了,但有重影。请高人指导一二!谢谢!!

电路及汇编程序如下:

 

 

;============================================
; 16*64点阵屏左移程序
;============================================
D_F EQU 40H          ;第一个显示数据缓冲器
D_MB EQU 30H  ;数据位移动次数寄存器
D_AM EQU 31H  ;显示半角字个数寄存器
DAMT EQU 32H  ;显示半角字个数倍数寄存器
OFFSET EQU 33H  ;数据指针偏移量
EN  EQU P2.7  ;消隐信号线
S_I EQU P3.5  ;数据总线
RCK EQU P2.6  ;锁存信号线
SCK EQU P2.5  ;移位时钟信号线
;--------程序入口地址----------------
ORG 0000H
JMP START
ORG 0030H
;====================================
; 初始化
;====================================
START:
MOV SP, #0AH  ;修改堆栈指针
CLR A   ;清累加器
MOV R7, #9
MOV R0, #D_F
ST1: MOV @R0, A
INC R0
DJNZ R7, ST1
MOV R7, #4
MOV R0, #D_MB
ST2: MOV @R0, A
INC R0
DJNZ R7, ST2   ;寄存器清0
MOV P2, #0FFH
MOV DPTR, #DTAB  ;数据表首地址放入DPTR
MOV DAMT, #1  ;显示的半角字的个数的倍数
MOV R2, #4
;====================================
; 主程序
;====================================
MAIN:
MOV R5, #16  ;扫描16行
MOV OFFSET, #00H  ;数据指针偏移量清0
MA1:  CALL QUSHU   ;调用取数子程序
CALL DSEND   ;调用发送子程序
SETB EN    ;关显示
CLR RCK
NOP
    SETB RCK   ;锁存显示数据
    PUSH DPH
PUSH DPL   ;数据保护
MOV DPTR, #TAB         ;定位行选表
MOV A, R5
DEC A    ;修正行选位
MOVC A, @A+DPTR          ;提取行选码
ANL P2, #0F0H          ;将P2低四位清零
ADD A, P2   ;A的低四位行选码和P2的高四位相加
MOV P2, A   ;将结果放回P2
POP DPL
POP DPH
    CLR EN          ;开显示
LCALL DELAY
    DJNZ R5, MA1  ;16行未完继续
DJNZ    R2, MAIN
    MOV     R2, #4;移动速度
  INC D_MB   
MOV A, D_MB
CJNE A, #8,MAIN
MOV D_MB, #0  ;1个半角字符要移动8次
MOV A, #16   
ADD A, DPL
MOV DPL, A
MOV A, DPH
ADDC A, #00H
MOV DPH, A  ;地址指针修改
INC D_AM
MOV A, D_AM
CJNE A, #64, MAIN ;显示的半角字符的个数
MOV D_AM, #00H  
DJNZ DAMT, MAIN
;MOV DAMT, #1         ;显示的半角字的个数的倍数
JMP     START                 ;循环滚动显示
  
;===================================
; 取一行数子程序
;===================================
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
RET   
;===================================
; 数据发送子程序
;===================================
DSEND:
MOV R0, #D_F  ;第一个显示数据缓冲区地址放入R0
MOV R6, #8  ;发送N字节(1行)
DSE1: MOV R7, #8  ;每次发送8位
MOV A, @R0  ;显示数据放入A
;CPL A    ;取反A
DSE2: RLC A   ;将A的内容按位移入C
MOV S_I, C  ;将C的内容送数据总线
CLR SCK  
NOP
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
;CPL A   ;取反A
DSE3: RLC A   ;将A的内容按位移入C
MOV S_I, C  ;将C的内容送数据总线
CLR SCK
NOP
SETB SCK   ;输出移位脉冲
DJNZ R7, DSE3  ;移位次数未完继续
;--------移位时间修正---------------
TAMEND: CLR C   ;清C
MOV A, #7
SUBB A, D_MB  ;需要再延时的次数
JZ D_OUT
MOV R7, A
TA1:   
DJNZ R7, TA1  ;空操作(延时)
D_OUT: RET
;****************************************
DELAY:
MOV R4,#5
D1:MOV R3,#25
DJNZ R3,$
DJNZ R4,D1
RET
;====================================
; 行选表
;====================================        
TAB: DB 00H,08H,04H,0CH,02H,0AH,06H,0EH,01H,09H,05H,0DH,03H,0BH,07H,0FH
;====================================
; 文字编码表
;====================================        

DTAB:

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0DFH,0EEH,0EEH,02H,0FAH,0F6H,0EEH,0C6H,0ABH,6BH,0EFH,0EFH,0EEH,0EEH,0EDH,0EBH
DB 0FFH,07H,0F7H,0F7H,0F7H,0F7H,0F7H,07H,6FH,6FH,6FH,6FH,0EDH,0EDH,0EDH,0F1H;"祝",1

DB 0FEH,0FEH,0FEH,0FEH,0FEH,00H,0FEH,0FDH,0FDH,0FDH,0FBH,0FBH,0F7H,0EFH,0DFH,0BFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,01H,0FFH,7FH,7FH,0BFH,0BFH,0DFH,0EFH,0E7H,0F1H,0FBH;"大",2

DB 0FDH,0FEH,0C0H,0BFH,0A0H,0FEH,0FDH,0F0H,8DH,0FBH,0E6H,99H,0E7H,9FH,0FAH,0FDH
DB 0FFH,0FFH,01H,0FBH,17H,0FFH,0FFH,0DFH,4FH,3FH,3FH,4FH,71H,7BH,0FFH,0FFH;"家",3

DB 0FDH,0FDH,80H,0FBH,0FBH,0F7H,0E7H,0E8H,0CFH,0AFH,6FH,0EFH,0EFH,0E8H,0EFH,0FFH
DB 0FFH,0FFH,01H,0FFH,0FFH,0BFH,0BFH,03H,0BFH,0BFH,0BFH,0BFH,0BFH,01H,0FFH,0FFH;"在",4

DB 0EFH,0F7H,80H,0DDH,0EBH,00H,0F7H,0F7H,00H,0F7H,0D3H,0D5H,0B5H,76H,0D5H,0EFH
DB 0FFH,0F1H,8FH,0BFH,0BFH,81H,0B7H,0B7H,0B7H,0B7H,0B7H,77H,77H,0F7H,0F7H,0F7H;"新",5

DB 0EFH,0EFH,0DFH,83H,0BAH,0BAH,0B9H,83H,0BBH,0BBH,0BBH,0BBH,83H,0BBH,0BFH,0FFH
DB 7FH,7FH,7FH,03H,0FBH,0FBH,0FBH,7BH,0BBH,9BH,0DBH,0FBH,0FBH,0D7H,0EFH,0FFH;"的",6

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,80H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FBH,01H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;"一",7

DB 0F7H,0F0H,0EFH,0EFH,0DFH,0B0H,77H,0F7H,0F7H,0F7H,00H,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,03H,7FH,7FH,7FH,07H,7FH,7FH,7FH,7FH,01H,7FH,7FH,7FH,7FH,7FH;"年",8

DB 0C0H,0DEH,0DEH,0DEH,0C0H,0DEH,0DEH,0C0H,0FEH,0FEH,0C0H,0FEH,0FEH,0FEH,00H,0FFH
DB 07H,0F7H,0F7H,0F7H,07H,0F7H,0F7H,07H,0FFH,0FFH,07H,0FFH,0FFH,0FFH,01H,0FFH;"里",9

DB 0FDH,0FBH,0F0H,0F7H,0F0H,0F7H,0F0H,0F7H,0F7H,80H,0FFH,0FEH,0F9H,0E7H,9FH,0FFH
DB 0FFH,0FFH,0FH,0EFH,0FH,0EBH,09H,0EBH,0E7H,01H,8FH,6FH,0EFH,0EFH,0AFH,0DFH;"身",10

DB 0EFH,0E7H,0EFH,0DFH,0C8H,9FH,5FH,0DEH,0DEH,0DDH,0DBH,0D4H,0DFH,0DFH,0DFH,0FFH
DB 0BFH,0BFH,0BFH,0BFH,03H,3FH,1FH,9FH,0AFH,0B7H,0B1H,0BH,0BFH,0BFH,0BFH,0FFH;"体",11

DB 0EFH,0EFH,0D2H,0DBH,9AH,57H,0D0H,0DDH,0DDH,0CDH,0D2H,0DBH,0D5H,0CEH,0DFH,0FFH
DB 0DFH,0DFH,07H,0D7H,01H,0D7H,07H,0DFH,07H,0DFH,03H,0DFH,0DFH,5FH,03H,0FFH;"健",12

DB 0FEH,0FFH,0C0H,0DFH,0D0H,0DFH,0C0H,0DFH,0D0H,0D7H,0DBH,0DDH,0DBH,0A7H,0B5H,7EH
DB 0FFH,7FH,01H,7FH,07H,77H,01H,77H,07H,7FH,37H,27H,5FH,67H,71H,0FBH;"康",13

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0CFH,0CFH,0EFH,0DFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;",",14

DB 0FFH,81H,0BDH,0B5H,0B5H,0B5H,0B5H,0B5H,0B5H,0B5H,0F7H,0EBH,0EDH,0DCH,0BDH,7FH
DB 0F7H,0F7H,0F7H,0F7H,01H,0E7H,0E7H,0D7H,0D7H,0B7H,0B7H,77H,0F7H,0F7H,0D7H,0EFH;"财",15

DB 0BFH,0D8H,0DBH,0FBH,7AH,0AAH,0EAH,0EAH,0DAH,0DBH,3BH,0BBH,0B6H,0B5H,0AFH,0BFH
DB 0FFH,01H,0BFH,7FH,03H,0FBH,03H,0FBH,03H,0DFH,57H,5BH,0DDH,0DDH,5FH,0BFH;"源",16

DB 0FEH,0FFH,0C0H,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0BFH,0BFH,7FH,0FFH
DB 0FFH,7FH,01H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;"广",17

DB 0FEH,0BEH,0DEH,0C8H,0DEH,0FEH,0FEH,08H,0EEH,0EEH,0EDH,0EDH,0EBH,0D7H,0B8H,0FFH
DB 0EFH,0EFH,0EFH,03H,0EFH,0EFH,0EFH,01H,0EFH,0EFH,0EFH,0EFH,0EFH,0FFH,01H,0FFH;"进",18

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0CFH,0CFH,0EFH,0DFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;",",19

DB 0FFH,80H,0FDH,0FDH,0FDH,0FCH,0FDH,0FBH,0FBH,0FBH,0F7H,0F7H,0EFH,0DFH,0BFH,0FFH
DB 0FFH,01H,0FFH,0FFH,0EFH,07H,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,1FH,0BFH,0FFH;"万",20

DB 0FEH,00H,0FEH,0E0H,0EEH,0E0H,0FEH,0C0H,0FEH,00H,0FEH,0C0H,0FEH,0F6H,0FAH,0FDH
DB 0FFH,01H,0FFH,07H,0F7H,07H,0FFH,07H,0F7H,01H,0F7H,07H,0F7H,0FFH,0FFH,0FFH;"事",21

DB 0FFH,0C3H,0DAH,0DAH,0C2H,0D9H,0DBH,0DBH,0C2H,0DBH,0DBH,0DBH,0BBH,0A8H,77H,0FFH
DB 0DFH,0DFH,0DFH,0DFH,03H,0DFH,0DFH,0DFH,03H,0DFH,0DFH,0DFH,0DFH,01H,0FFH,0FFH;"胜",22

DB 0FEH,0C0H,0F7H,0FBH,00H,0FFH,0E0H,0EDH,0EEH,0E0H,0FFH,0D6H,0D7H,97H,0F8H,0FFH
DB 0FFH,03H,0DFH,0BFH,01H,0FFH,0FH,0EFH,0EFH,0FH,0FFH,0F7H,7BH,0EBH,0FH,0FFH;"意",23

DB 0FFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0FFH,0EFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;"!",24

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

END

回复评论 (17)

看代码是个很累的事情,所以很少有人愿意给你读一遍。
这个问题以前遇到过,拖影的原因在于你不可能同时切换列和行。因此解决上要在列切换前关闭行(通过上下拉电阻)列切换后再开行显。
希望对你有用。
点赞  2012-1-15 18:01
主要的手段是调节驱动占空比和扫描周期。
点赞  2012-1-15 22:14
主要是扫描的周期不合适,自己改一下,多试试,找一个合适的周期!
点赞  2012-1-16 10:19
在关掉和重开中间,有木有消影?

PS:看代码这种事,只有很无聊时才会干
强者为尊,弱者,死无葬身之地
点赞  2012-1-16 12:49

没有实物没有仿真图,是很不想调试程序的·····

点赞  2012-1-16 15:30
2楼真相帝~我也遇到过这种情况,就是扫描后延迟再清空再扫描然后就解决了
点赞  2012-1-16 16:40

回复 7楼 qk333333 的帖子

请兄弟指点一二, 我想让它移动慢一点, 但不闪烁, 仿真效果跟实物有点差异, 差不多就行了,电路图及仿真程序如下:

[ 本帖最后由 简糊仙 于 2012-2-4 21:36 编辑 ]
点赞  2012-2-4 21:33

回复 5楼 辛昕 的帖子

有消隐的
点赞  2012-2-5 12:19

回复 板凳 chunyang 的帖子

我认为与周期关系不大, 每行扫1ms, 16行共16ms, 即62.5Hz, 符合人眼视觉效应!
点赞  2012-2-5 12:21
看来这里没什么高手呀
点赞  2012-2-21 03:33
我是新手了 呵呵 玩过8*8的 也遇到过类似的情况
我觉得是不是 周期太多了 或者延时有点短 移动 太快了 残影是人眼暂留效果啊
还有程序没看 :汇编不会
希望对你有帮助!
看来这里没什么高手呀
这里有很多高手的 至少帮助了我很多
大家主要是给你思路和方向 还是靠自己解决问题的
点赞  2012-2-22 08:34

回复 10楼 简糊仙 的帖子

你大概没有明白拖影的原因 1.拖影在你的数据区数据变化时某些行送出了不正确的数据。 2.行切换时显示数据不正确,比如你没灭上一行就开了下一行或者你已经开了下一行而数据还是上一行的。

如果静态数据扫得再慢也不会拖影,拖影和扫描的关系是扫描频率越高拖影就越严重,因为扫得越快时间差的比值越大。

情况1好解决,用两个缓冲区等刷屏开始时切换缓冲区就行了

情况2是主要的原因,我上面提到的是针对情况2的。

 

 

 

[ 本帖最后由 huo_hu 于 2012-2-22 23:05 编辑 ]
点赞  2012-2-22 22:38

回复 13楼 huo_hu 的帖子

谢谢楼上指点,我保证行切换时显示数据绝对正确! 扫频越高,拖影越重,我认同这个观点,但是如何解决呢? 农业银行门口的显示屏控制卡是如何做到的? 求思路,谢谢!
点赞  2012-2-27 00:37
每天一顶!
点赞  2012-2-28 01:41
j来j去的看汇编太费劲了,没看出毛病;你这样用示波器看看行扫和消隐信号周期稳定否?
点赞  2012-2-29 00:53

回复 14楼 简糊仙 的帖子

那是ARM做的
点赞  2012-11-29 03:44
这个问题应该是你显示一个字符的时候没清掉前面字符造成的。一个数码管显示前先要然那个数码管全部熄灭然后在送字符显示。OK
点赞  2012-12-3 22:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复