硬件资源:
1、一片AT89S51单片机
2、由4个88点阵LED模块组成一个16X16点阵LED
3、4个按键开关(功能预留)
4、一个REST手动复位按键
注意:本电路板耗电较大,正常工作时LM7805稳压器比较烫手,有条件的客户可以加装散热器或者直接用5V/1A开关电源供电(跳过7805稳压器)
工作原理分析:
从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。16×16的点阵共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,1 6×16的点阵需要256/8=32个锁存器。这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。
因此在实际应用中的显示屏都不采用这种设计,而采用另一种称为动态扫描的显示方法。动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套列驱动器。具体就1 6×16的点阵来说,把所有同l行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第1行发光管亮灭的数据并锁存,然后选通第l行使其燃亮一定的时间,然后熄灭;再送出第2行的数据并镇存,然后选通第2行使其燃亮相同的时间,然后熄灭;-…第16行之后,又重新燃亮第1行,腹轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形了。
采用扫描方式进行显示时,每行有一个行驱动器,各行的同名列共用一个列驱动器。显示数据通常存储在单片机的存储器中,按8位一个字节的形式顺序排放。显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。从控制电路到列驱动器的数据传输可以采用并行方式或串行方式。显然,采用并行方式时,从控制电路到列驱动器的线路数量大,相应的硬件数目多。当列数很多时,并行传输的方案是不可取的。
采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两个部分。对于串行传输方式来说,列数据准备时间可能相当长.在行扫描周期确定的情况下,留给行显示的时间就太少了,以致影响到LED的亮度。
解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。即在显示本行各列数据的同时,传送下一行的列数据。为了达到重叠处理的目的,列数据的显示就需要具有锁存功能。经过上述分析,可以归纳出列驱动器电路应具备的主要功能。对于列数据准备来说,它应能实现串人并出的移位功能;对于列数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打入并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。
硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路三部分
单片机系统及外围电路:
单片机采用89C51或其兼容系列的芯片,采用24MHz或更高频率的晶振,以获得较高的刷新频率,使显示更稳定。单片机的串口与列驱动器相连,用来送显示数据。P1口低4位与行驱动器相连,送出行选信号;P15~P17口则用来发送控制信号。PO和P2口空着,在有必要时可以扩展系统的ROM和RAM。
列驱动电路:
列驱动电路由集成电路74HC595构成。它具有一个8位串人并出的移位寄存器和一个8位输出锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行各列数据的同时,传送下一行的列数据,即达到重叠处理的目的。
它的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI是串行数据的输入端。引脚SCK是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI的下一个数据打人最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。RCK是输出锁存器的打人信号,其上升沿将移位寄存器的输出打人到输出锁存器。引脚G是输出三态门的开放信号,只有当其为低时锁存器的输出才开放,否则为高阻态。SCLR信号是移位寄存器的靖0输入端,当其为低时移位寄存器的输出全部为o。由于SCK和RCK两个信号是互相独立的,所以能够做到输人串行移位与输出锁存互不干扰。芯片的输出端为QA~QH.最高位QH可作为多片74HC595级联应用时,向上一级的级联输出。但因QH受输出锁存器打人控制,所以还从输出锁存器前引出了QH’,作为与移位寄存器完全同步的级联输出。
行驱动电路:
单片机P1口低4位输出的行号经4/16线译码器4515译码后生成1 6条行选通信号线,再经过驱动器驱动对应的行线。一条行线上要带动16列的LED进行显示,按每一LED器件20 mA电流计算,16个LED同时发光时,需要320 mA电流,选用三极管8550作为驱动管可满足要求。
系统程序的设计
显示屏软件的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,可把显示屏的软件系统分成两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其它控制信号,配合完成LED显示屏的扫描显示工作。显示驱动程序由定时器T0中断程序实现。系统应用程序完成系统环境设置(初始化)、显示效果处理等工作,由主程序来实现。
从有利于实现较复杂的算法(显示效果处理)和有利于程序结构化考虑,显示屏程序适宜采用c语言编写。
显示驱动程序:
显示驱动程序在进人中断后首先要对定时器T0重新赋初值,以保证显示屏刷新率的稳定,1/16扫描显示屏的刷新率(帧频)计算公式如下:
刷新率(帧频)=1/16×T0溢出率=1/16×fosc/12(65536—to) 其中fosc为晶振频率,to为定时器T0初值(工作在16位定时器模式)。
然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打人输出锁存器并锁存,然后再输出新的行号,重新打开显示。
图74 显示驱动程序流程图
系统主程序:
系统主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口;然后向上滚动显示“单片机是工业中最基础的运用”。由于单片机没有停机指令,所以可以设置系统程序不断地循环执行上述显示效果。
装配
以下是部分源程序,不完整,仅供参考,这是完整的资料。
;
;
; 单个1616点阵电子屏字符显示器
; AT89C52 12MHZ晶振
;
;显示字用查表法,不占内存,字符用1616共阳LED点阵,
;效果:向上滚动显示19个字,再重复循环。
;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00-0FH)。
;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。
;;
;中断入口程序;
;;
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
;
;;
; 初始化程序 ;
;;
;
;
;;
; 主程序 ;
;;
;
START: MOV 20H,#00H ;清标志,00H为第16行开始扫描标志,01为1帧扫描结束标志
MOV A,#0FFH ;端口初始化
MOV P1,A
MOV P2,A
MOV P3,A
MOV P0,A
CLR P16 ;串行寄存器打入输出端控制位
MOV TMOD,#01H ;使用T0作16位定时器,行扫描用。
MOV TH0,#0FCH ;1ms初值(12MHZ)
MOV TL0,#18H
MOV SCON,#00H ;串口0方式传送显示字节
MOV IE,#82H ;T0中断允许,总中断允许
MOV SP,#70H
MAIN: LCALL DIS1 ;显示准备,黑屏,15秒
MOV DPTR,#TAB
LCALL MOVDISP ;向上滚动显示一页(8个字)
INC DPH
LCALL MOVDISP ;向上滚动显示一页(8个字)
INC DPH
LCALL MOVDISP ;向上滚动显示一页(8个字)
AJMP MAIN
;
;
;;
; 多字滚动显示子程序 ;
;;
;每次8个字,入口时定义好DPTR值
;
MOVDISP: MOV B,#00H ;向上移动显示,查表偏址暂存(从00开始)
DISLOOP: MOV R3,#07H ;移动速度
DISMOV: MOV R2,#00H ;第0行开始
MOV R1,B ;
SETB TR0 ;开扫描(每次一帧)
WAITMOV: JBC 01H,DISMOV1 ;标志为1扫描一帧结束(16毫秒为1帧,每行1毫秒)
AJMP WAITMOV
DISMOV1: DJNZ R3,DISMOV ;1帧重复显示(控制移动速度)
INC B ;显示字的下一行(每行2字节)
INC B ;
MOV A,R1 ;R1为0,8个字显示完
JZ MOVOUT ;
AJMP DISLOOP ;
MOVOUT: RET ;移动显示结束
;
;
;;
; 单字显示子程序 ;
;;
;显示表中某个字
DIS1: MOV R3,#5AH ;静止显示时间控制(16MS#=16秒)
DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00-0FH)
MOV DPTR,#TAB ;取表首址
MOV R1,#00H ;查表偏址(显示第一个字)
SETB TR0 ;开扫描(每次一帧)
WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束
AJMP WAIT11
DIS111: DJNZ R3,DIS11
RET
;
;
;;
; 扫描程序 ;
;;
;注意省略了一部分
;;
; 扫描文字表 ;
;;
;
TAB: 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 0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 单 --
DB 0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH
DB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;-- 文字: 片 --
DB 0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0EFH
DB 0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;-- 文字: 机 --
DB 0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,0FFH
DB 0FFH,0FFH,0F0H,00FH,0F7H,0EFH,0F0H,00FH,0F7H,0EFH,0F0H,00FH,0FFH,0FFH,000H,001H ;-- 文字: 是 --
DB 0FEH,0FFH,0F6H,0FFH,0F6H,007H,0F6H,0FFH,0EAH,0FFH,0DCH,0FFH,0BFH,001H,0FFH,0FFH
DB 0FFH,0FFH,0C0H,003H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH ;-- 文字: 工 --
DB 0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,000H,001H,0FFH,0FFH,0FFH,0FFH
DB 0FBH,0BFH,0FBH,0BFH,0FBH,0BFH,0FBH,0BBH,0BBH,0B9H,0DBH,0B3H,0DBH,0B7H,0EBH,0AFH ;-- 文字: 业 --
DB 0E3H,0AFH,0EBH,09FH,0FBH,0BFH,0FBH,0BFH,0FBH,0BBH,000H,001H,0FFH,0FFH,0FFH,0FFH
DB 0FEH,0FFH,0FEH,0FFH,0DEH,0F7H,0C0H,003H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 中 --
DB 0DEH,0F7H,0C0H,007H,0DEH,0F7H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH
;
DB 0FEH,0FFH,0FEH,0FFH,0DEH,0F7H,0C0H,003H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 中 --
DB 0DEH,0F7H,0C0H,007H,0DEH,0F7H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH
DB 0E0H,00FH,0EFH,0EFH,0E0H,00FH,0EFH,0EFH,0E0H,00FH,0FFH,0FFH,000H,001H,0DDH,0FFH ;-- 文字: 最 --
DB 0C1H,003H,0DDH,077H,0C1H,0AFH,0DCH,0DFH,0C1H,0AFH,01DH,071H,0FCH,0FBH,0FDH,0FFH
DB 0F7H,0DFH,0F7H,0DFH,080H,003H,0F7H,0DFH,0F0H,01FH,0F7H,0DFH,0F0H,01FH,0F7H,0DFH ;-- 文字: 基 --
DB 000H,001H,0F7H,0DFH,0EEH,0E7H,0C0H,011H,03EH,0FBH,0FEH,0FFH,080H,003H,0FFH,0FFH
DB 0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,000H,001H,0FCH,07FH,0FCH,0BFH,0FAH,0BFH,0FAH,0DFH ;-- 文字: 本 --
DB 0F6H,0EFH,0EEH,0E7H,0D0H,011H,03EH,0FBH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FFH,0FFH
DB 0EFH,07FH,0EFH,07FH,0DFH,07FH,083H,003H,0BAH,0FBH,0BAH,0FBH,0B9H,0FBH,083H,07BH ;-- 文字: 的 --
DB 0BBH,0BBH,0BBH,09BH,0BBH,0DBH,0BBH,0FBH,083H,0FBH,0BBH,0D7H,0BFH,0EFH,0FFH,0FFH
DB 0FEH,0FFH,0FFH,07FH,0C0H,003H,0DFH,0FFH,0DDH,0FFH,0DEH,0F7H,0CFH,073H,0D7H,037H ;-- 文字: 应 --
DB 0DBH,06FH,0DBH,06FH,0D9H,0DFH,0BBH,0DFH,0BFH,0BFH,0A0H,001H,07FH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0E0H,003H,0EFH,07BH,0EFH,07BH,0EFH,07BH,0E0H,003H,0EFH,07BH,0EFH,07BH ;-- 文字: 用 --
DB 0EFH,07BH,0E0H,003H,0EFH,07BH,0EFH,07BH,0DFH,07BH,0DFH,07BH,0BFH,06BH,07FH,077H
DB 0FDH,0FFH,0FEH,0FFH,0FFH,07FH,000H,001H,0FDH,0FFH,0FDH,0FFH,0FCH,00FH,0FDH,0EFH ;-- 文字: 方 --
DB 0FBH,0EFH,0FBH,0EFH,0F7H,0EFH,0F7H,0EFH,0EFH,0EFH,0DFH,06FH,03FH,09FH,0FFH,0FFH
;
DB 0FDH,0FFH,0FEH,0FFH,0FFH,07FH,000H,001H,0FDH,0FFH,0FDH,0FFH,0FCH,00FH,0FDH,0EFH ;-- 文字: 方 --
DB 0FBH,0EFH,0FBH,0EFH,0F7H,0EFH,0F7H,0EFH,0EFH,0EFH,0DFH,06FH,03FH,09FH,0FFH,0FFH
DB 0FFH,05FH,0FFH,067H,0FFH,06FH,080H,003H,0FFH,07FH,0FFH,07FH,0FFH,07FH,0C1H,07FH ;-- 文字: 式 --
DB 0F7H,0BFH,0F7H,0BFH,0F7H,0BFH,0F4H,0DFH,0E3H,0DDH,08FH,0EDH,0DFH,0F5H,0FFH,0FBH
DB 0F9H,0BFH,0C7H,0AFH,0F7H,0B7H,0F7H,0B7H,0F7H,0BFH,000H,001H,0F7H,0BFH,0F7H,0B7H ;-- 文字: 我 --
DB 0F1H,0D7H,0C7H,0CFH,037H,0DFH,0F7H,0AFH,0F6H,06DH,0F7H,0F5H,0D7H,0F9H,0EFH,0FDH
DB 0FFH,007H,0C0H,06FH,0EDH,0EFH,0F6H,0DFH,0C0H,001H,0DDH,0FDH,0BDH,0FFH,0C0H,003H ;-- 文字: 爱 --
DB 0FBH,0FFH,0F8H,00FH,0F3H,0DFH,0F4H,0BFH,0EFH,03FH,09CH,0CFH,073H,0F1H,0CFH,0FBH
DB 0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;-- 文字: 单 --
DB 0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH
DB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;-- 文字: 片 --
DB 0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0EFH
DB 0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;-- 文字: 机 --
DB 0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,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
以下是16x16的点阵LED电子图文显示屏的源程序采用汇编语言编写(也可采用C语言编写,C程序KeiluVision2 V230环境下调试通过。
以下为用汇编语言编写的字符显示控制程序:
;
;
; 单个16x16的点阵电子屏字符显示器
; ATA89C52 12MHz晶振
; 2004211 LRM
;
;显示字用查表法,不占用内存,字符用16x16共阳LED点阵,
;效果:向上滚动显示5个字,再重复循环。
;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00~0FH)。
;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。
;;
;中断入口程序 ;
;;
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTTO
ORG 0013H
ERTI
ORG 001BH
ERTI
ORG 0023H
RETI
ORG 002BH
RETI
;
;;
;初始化程序;
;;
;
;
;;
; 主程序 ;
;;
;
START: MOV 20H,#00H ;清零标志,00H为第16行开始扫描标志,01为1帧
;扫描结束标志
MOV A,#0FFH ;端口初始化
MOV P1,A
MOV P1,A
MOV P3,A
MOV P0,A
CLR P16 ;串行寄存器输入打入输出控制位
MOV TMOD,#01H ;使用T0做16位定时器,行扫描用。
MOV TH0,#0FCH ;1ms初值(12MHz)
MOV TL0,#18H
MOV SCON,#00H ;串口0方式传送显示字节
MOV IE,#82H ;T0中断允许,总中断允许
MOV SP,#70H
MAIN: LCALL DISI ;显示准备,黑屏,15s
MOV DPTR,#TAB
LCALL MOVDISP ;向上滚动显示一页(8个字)
INC DPH
LCALL MOVDISP ;向上滚动显示一页(8个字)
INC DPH
LACLL MOVDISP ;向上滚动显示一页(8个字)
AJMP MAIN
;
;
;;
; 多字滚动显示程序 ;
;;
;每次8个字,入口时定义好DPTR值
;
MOVDISP: MOV B,#00H ;向上移动显示,查表偏值暂存(从00开始)
DISLOOP: MOV R3,#07H ;移动速度
DISMOV: MOV R2,00H ;第0行开始
MOV R1,B
SETB TR0 ;开扫描(每次一帧)
WAITMOV: JBC 01H,DISMOV1 ;标志为1扫描一帧结束(16ms为1帧,每行1ms)
AJMP WAITMOV
DISMOV1: DJNZ R3,DISMOV ;1帧重复显示(控制移动速度)
INC B ;显示字的下一行(每行2字节)
INC B
MOV A,R1 ;R1为0,8个字显示完
JZ MOVOUT
AJMP DISLOOP
MOVOUT: RET ;移动先是结束
;
;
;;
; 单字显示程序 ;
;;
;显示表中某个字;
;;
DIS1: MOV R3,#5AH ;静止显示时间控制(16ms#=16s)
DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00~0FH)
MOV DPTR,#TAB ;取表首址
MOV R1,#00H ;查表偏址(显示第一个字)
SETB TR0 ;开扫描(每次一帧)
WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束
AJMP WAIT11
DIS111: DJNZ R3,DIS11
RET
;
;
;;
; 扫描程序 ;
;;
;1ms刷新一次,每行显示1s
INTT0: PUSH ACC
MOV TH0,#0FCH ;1ms初值重装
MOV TL0,#18H
JBC 00H,GOEND ;16行扫描标志为1,结束
INC R1 ;取行右边字节偏址
MOV A,R1
MOVC A,@A+DPTR ;查表
MOV SBUF,A ;串口0方式发送
WAIT: JBC TI,GO ;等待发送完毕
AJMP WAIT1
GO: DEC R1 ;取行左边字节偏址
MOV A,R1
MOVC A,@A+DPTR
MOV SBUF,A
WAIT1: JBC T1,GO1
AJMP WAIT1
GO1: SETB P17 ;关行显示,准备刷新
NOP ;串口寄存器数据稳定
SETB P16 ;产生上升沿,行数据打入输出端
NOP
NOP
CLR P16 ;恢复低电平
MOV A,R2 ;修改显示行地址
ORL A,#0F0H ;修改显示行地址
MOV R2,A ;修改显示行地址
MOV A,P1 ;修改显示行地址
ORL A,#0FH ;修改显示行地址
ANL A,R2 ;修改显示行地址
MOV P1,A ;修改完成
CLR P17 ;开行显示
INC R2 ;下一行扫描地址值
INC R1
INC R1 ;下一行数据地址
MOV A,R2
ANL A,#0FH
JNZ GO2
SETB 00H ;R2为01H,现为末行扫描,置标志
GO2: POP ACC
RETI
GOEND: CLR TR0 ;一帧扫描完毕,关扫描
SETB 01H ;一帧扫描完毕,置结束标志
POP ACC
RETI ;退出
;
;
;;
; 扫描文字表 ;
;;
;
TAB:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00FFH,0FFH,0FFH ;黑屏
DB
0F9H,0BFH,0C7H,0AFH,0F7H,0B7H,0F7H,0B7H,0F7H,0BFH,000H,001H,0F7H,0BFH,0F7H,0B7H ;我
DB
0F1H,0D7H,0C7H,0CFH,037H,0DFH,0F7H,0AFH,0F6H,06DH,0F7H,0F5H,0D7H,0F9H,0EFH,0FDH ;
DB
0FFH,007H,0C0H,06FH,0EDH,0EFH,0F6H,0DFH,0C0H,001H,0DDH,0FDH,0BDH,0FFH,0C0H,003H ;爱
DB
0FBH,0FFH,0F8H,00FH,0F3H,0DFH,0F4H,0BFH,0EFH,03FH,09CH,0CFH,073H,0F1H,0CFH,0FBH ;
DB
0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;单
DB
0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH
DB
0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片
DB
0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0FFH
DB
0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;机
DB
0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,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
我只弄过汇编的。
就一层循环,控制行,对于每一行,按照 显示——延时——全灭,然后处理下一行
具体结果就像这样。一边的端口按照1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, ……输出下去
另一边配合着输出每一行的信号,即可
记得更改行之前要把输出清零,不然整个led点阵一下子全亮起来了的样子
每屏显示时,列控制码左(右)移,就可实现点阵屏左(右)移动。
以显示“ | ” 从右向左移为例,第1 屏,右边第1 列亮1ms后灭,第2 屏,第2 列亮。。。。8 屏显示后,完成“| ”左移。
一.基于51的点阵屏显示:(1)点亮第一个88点阵:
1首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-88-GREEN(在这里使用绿色的点阵)。在Proteus 69中88的点阵总共有四种颜色,分别为MATRIX-88-GREEN,MATRIX-88-BLUE,MATRIX-88-ORANGE ,MATRIX-88-RED。
在这里请牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。
2在选择完以上三个元件后,我们开始布线,具体如下图:
这里P2是列选,P3连接38译码器后作为行选。
选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好与点阵屏的低电平选中行相对,并且节省了I/O口,大大方便了我们的编程和以后的扩展。
3下面让我们把它点亮,先看一个简单的程序:
(将奇数行偶数列的点点亮,效果如下图)
下面是源代码:
/88LED点阵屏显示/
#include<reg51h>
void delay(int z) //延时函数
{
int x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void main()
{
while(1)
{
P3=0; //行选,选择第一行
P2=0x55; //列选,即该行显示的数据
delay(5); //延时
/下同/
P3=2; //第三行
P2=0x55;
delay(5);
P3=4; //第五行
P2=0x55;
delay(5);
P3=6; //第七行
P2=0x55;
delay(5);
}
}
上面的程序实现了将此88点阵的奇数行偶数列的点点亮的功能。重点让我们看while循环内,首先是行选P3=0,此时38译码器的输入端为000,则输出端为01111111,即B0端为低电平,此时选中了点阵屏的第一行,接着列选我们给P2口赋0x55,即01010101,此时又选中了偶数列,紧接着延时。然后分别对第三、五、七行进行相同的列选。这样就点亮了此点阵屏奇数行偶数列交叉的点。
完成这个程序,我们会发现其实点阵屏的原理是如此简单,和数码管的动态显示非常相似,只不过换了一种方式而已。
对不起啦,我传了三次都没传上,郁闷哪!希望你能理解哈! 不过我有传一份WORD文档在我的空间里面
要用8×8的LED点阵显示数字0~9,先用proteus 画出仿真图,然后用取模软件画出数字8×8点阵图形,并按行取模,每个数字共8个字节数据,显示时取出字模并逐行扫描就行了。
以上就是关于跪求16X16LED点阵汉字显示的原理图,s51单片机汇编源程序,汉字字摸提取工具,可扩展64X16点阵显示。全部的内容,包括:跪求16X16LED点阵汉字显示的原理图,s51单片机汇编源程序,汉字字摸提取工具,可扩展64X16点阵显示。、本人用74HC595驱动(行列)LED点阵16*16,由于编程能力有限,求高手指点,发我调试程序即可 带汉字显示哦、点阵式LED的汉字显示,,c语言编程咋弄啊。。。谢谢各位啦等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)