一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 8658|回复: 32

[其他综合] shqi2003老师的2字164屏驱动实验

  [复制链接]
发表于 2010-3-10 11:44 | 显示全部楼层 |阅读模式
沈老师的2字屏到手后只是用原来的板点亮看了看,这两天把老FU给的最小系统板焊好了,就打算就这小板通过杜帮线来驱动这屏试试,顺便学习一下点阵屏的驱动方法。

最小系统板的资料情况见:
https://www.yleee.com.cn/viewthread.php?tid=2377

实验环境,用自制的USBASP给最小系统板下载,最小系统板用杜邦线连在点阵屏上,同时也由点阵屏给系统板供电。电源供应是5V3A电源(北工大产)。

实验环境

实验环境


要驱一个东西先得作电路分析,屏有两种,相对来说对164熟悉一些,另外164驱动的屏(A屏)的接口在侧面,接杜邦线方便,就用先用这个来练手了。电路图:
LED点阵屏实验0.gif

一般点阵LED都是行是LED的正极,列是LED的负极,只要行输出高电位,列输出低电位,则行列交叉点的那个LED就会亮,形成一个像素。由于这种组织方式,点阵式LED屏需要扫描驱动显示,为了节省I/O口线,多用串入并出的164/595一类的逻辑芯片进行驱动。这块LED屏数据是用595,行数据是用164。经过一些驱动电路后,移出的数据最终驱动LED。分析电路后得知,从接口移出的数据均为1时(是移出数据而不是164/595实际存储的数据),交叉点的LED亮。

接口中H-AB是行数据串行输入,L-R是列数据串行输入,L-CLK是列移位时钟。H-MR该板接在595的复位上,而164的复位接高电位(也就是不复位)。L-STR/CLK既当作595的数据装载又当作164的移位时钟。这里说明一下595是有输出锁存的,也就是移位的数据要锁存后才会输出,而164没有锁存,移位时输出会变。该电路巧妙的利用了这一点,把595的锁存信号和164的移位信号合二为一,通过两个非门,作到该信号变为高电位的上升沿595锁存并输出数据,下降沿164移位实现了扫描(164也是上升沿移位的,但在非门后所以反相了)。

分析了电路后就可以开始编程测试了,需要注意的是164没有复位信号,所以在程序中要人为的清一下164数据作一下初始化。
 楼主| 发表于 2010-3-10 11:51 | 显示全部楼层
本帖最后由 cosine 于 2010-3-10 12:12 编辑

接好电路确认无误后就编了一段最简单的程序进行的测试,目标就是点亮屏最角上的第一个LED。程序是汇编的,C的等过两天熊再写出来,C51熊正学。代码如下,本贴所有源程序在KEIL 8.05中编译通过:

;===============================
;mcu=89S52 f=11.0592mhz
;实验内容:FU电路板shqi2003LED板测试
;具体实验:点亮LED屏的一个点
;实验日期:2010-3-10
;===============================
;变量定义部分
temp0 equ 10h    ;定义延时临时变量,用第2组通用寄存器区
temp1 equ 11h
temp2 equ 12h
;===============================
;端口定义部分
H_MR equ P0.0
H_AB equ P0.1
L_STR equ P0.2
L_CLK equ P0.3
L_R  equ P0.4
;===============================
;复位矢量
org  0000h           
ajmp main    ;转主程序                     
;===============================
;主程序部分                              
org     0030h
main:
;-------------------------------
;初始化部分
mov  psw,#00h
mov  sp,#2fh    ;1051 ram only to 40h
mov  tmod,#01h   ;t0 is mod1
mov  tcon,#55h   ;tf1 tr1 tf0 tr0 ie1 it1 ie0 it0
mov  scon,#50h   ;sm0 sm1 sm2 ren tb8 rb8 ti ri
mov  pcon,#00h   ;smod x x x gf1 gf0 pd idl
mov  ie,#00h    ;ea x et2 es et1 ex1 et0 ex0
mov  ip,#00h    ;x x pt2 ps pt1 px1 pt0 px0
;-------------------------------
;程序执行部分
proc:
;清164及595数据
mov  temp0,#10h   ;清2片164共16行
clr  H_AB
setb L_STR    ;列移位时钟置低
clear_164:
clr  L_STR    ;164移位
setb L_STR     
djnz temp0,clear_164
clr  H_MR     ;清595
setb H_MR
clr  L_STR    ;列数据锁存置0
;595置1移位第1列
setb L_R      ;595数据置1
clr  L_CLK    ;595移位给时钟脉冲
setb L_CLK
;164置1扫描第1行
setb H_AB       ;行扫置1
setb L_STR    ;595输出
clr  L_STR    ;行扫移位  
loop:
nop
ajmp loop   
;===============================
;子程序部分
;===============================
delay1ms:            ;11.0592M下延时1ms,每机器周期按1.085微秒计
mov  temp0,#02h   ;temp0=2
delay10ms_1:
mov  temp1,#0e3h   ;temp1=227,外层循环DJNZ补上后循环体刚好1ms
djnz temp1,$
nop
djnz temp0,delay10ms_1
ret
;===============================
end

程序除了标准的初始化外,就是先对595和164进行初始化,让屏全灭,然后给595移一位1,再给164移一位1。这样就点亮了一个LED,如图:

LED点阵屏实验2.jpg

看到结果有些意外,本来根据沈老师的电路图认为第一个LED应该亮在左上角,结果现在亮在左下角,这样扫描时数据的提取就要反过来或是干脆把点阵数据就反过来存。
回复

使用道具 举报

发表于 2010-3-10 11:53 | 显示全部楼层
这个就是双层板的那个吧?
双层板的我有一块,单层板的有三块,另2块买时打算拆件用,回来一测是好的算了先留着吧,啥时后把三块板合成一起不就爽了。
回复

使用道具 举报

 楼主| 发表于 2010-3-10 11:53 | 显示全部楼层
星星之火可以燎原,再点亮一行试试:

LED点阵屏实验3.jpg

程序代码:
fu_02.asm (2 KB, 下载次数: 664)
回复

使用道具 举报

 楼主| 发表于 2010-3-10 11:59 | 显示全部楼层
现在该点亮全屏了。一般扫描显示的原理就是利用人眼视觉暂留的特性,只要扫描的频率足够高,我们就感觉不到闪烁。电影一般是24帧/秒,电视是25帧/秒,也就说要达到这个帧速,实现动画也是同理。实际上不一定非要一秒钟扫描25次,稍低一些也可以,但熊认为不要低于20帧/秒。

全屏点亮的效果,每行扫描时点亮1ms,与7段LED扫描显示点亮的时间相同。

LED点阵屏实验4.jpg

程序代码:

fu_03.asm (2.1 KB, 下载次数: 648)
回复

使用道具 举报

 楼主| 发表于 2010-3-10 12:05 | 显示全部楼层
在前面的基础上用取字模软件取来字模数据,显示在屏上。由于屏是从下往上扫描,而程序是从前往后取数据,所以取字模时进行了上下反相。显示效果:

LED点阵屏实验5.jpg

程序代码:

fu_04.asm (3.1 KB, 下载次数: 654)

程序中列移位时用两个计数器,一个计算移的位数,一个计算移的字节数。此外还设置了一个行数据地址计数器,用来存储行数据与首址的字节偏移量。

改进的程序代码:

fu_05.asm (3.15 KB, 下载次数: 650)

后来考虑到已经有一个行扫描用的计数器,就直接用这个乘以每行字节数生成行数据首址,这样就是从后往前提数据,因此字模数据就不用上下反相了。这样可以节省一个用来存储行地址偏移量的寄存器,但每次计算首址要进行乘法运算,且计算的位置在列数据移位循环体内,实际是以付出计算时间为代价的。大约每行数据要多用十几个机器周期吧。
回复

使用道具 举报

 楼主| 发表于 2010-3-10 12:08 | 显示全部楼层
好了,熊的实验到此就基本结束了,因为滚动翻页等效果熊目前不需要,也就没打算学习,学会基本原理就OK了。最后显示一个笑脸作为结束。

LED点阵屏实验6.jpg

程序代码:
fu_06.asm (2.9 KB, 下载次数: 634)

图案可以到网上搜索16*16的黑白点阵图或是图标图(ICO),然后用取字模软件打开就行。双字屏显示单字时在移每行的数据前一定要对列驱动IC复位,不然右半边会有东西显示。
回复

使用道具 举报

发表于 2010-3-10 12:09 | 显示全部楼层
从屏后的接口in,out来看,觉得沈老师原来的程序其实是倒过来显示的。
回复

使用道具 举报

 楼主| 发表于 2010-3-10 12:10 | 显示全部楼层
这个就是双层板的那个吧?
双层板的我有一块,单层板的有三块,另2块买时打算拆件用,回来一测是好的算了先 ...
社建电子 发表于 2010-3-10 11:53 https://www.yleee.com.cn/images/common/back.gif



    连一块不难,每块屏都有输出口的,时钟对时钟,数据对数据,就是列输入得是前一块屏的最后一片595的移出口。然后写程序时列移位多移一块屏的字节数就行,取数据时相应多取一块屏的字数。
回复

使用道具 举报

发表于 2010-3-10 12:11 | 显示全部楼层
哈哈,熊新做的最小系统和USB下载线就用上了啊。一开始还没反应过来,这最小系统边上是个啥东西呢?
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-5 06:01 , Processed in 0.039675 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表