基于AT89C51单片机的16x16点阵LED显示器设计

更新时间:2023-05-07 20:51:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

百度文库

1 单片机课程设计报告书

设计题目:

基于AT89C51单片机的16*16点阵LED显示器设计

姓名:

院系:

专业:

学号:

指导教师:

教师职称:

2012年11月25日

目录

摘要 (1)

第1章引言 (1)

LED及LED显示屏 (1)

功能要求 (2)

方案论证 (2)

第2章系统总体方案及硬件设计 (3)

AT89C51的原理及说明 (3)

显示屏总体设计方案 (3)

列驱动电路 (4)

行驱动部分 (4)

第 3 章系统硬件电路的设计 (8)

单片机系统及外围电路 (8)

列驱动电路 (8)

行驱动电路 (9)

第 4 章系统程序的设计 (10)

显示驱动程序 (10)

系统主程序 (11)

单片机汇编程序 (11)

第5章系统调试 (22)

第6章设计心得 (22)

参考文献 (22)

附录 (23)

1

摘要:本设计使用简单单片机AT89C51作为主控制模块,利用简单的外围电路来驱动16×16的点阵LED显示屏。在本设计中主要用两个74HC595来驱动16×16点阵显示屏的列,用AT89C51来驱动16×16点阵显示屏的行,可以最终实现——“十六乘十六点阵可调速显示屏设计”十五个汉字的自动左移,而且它们的“进”和“出”是以滚动形式设计的。也就是说,硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路三部分。从而可以实现一个室内用的16×16点阵LED图文显示屏,在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形或文字应稳定、清晰无串扰,图形或文字显示有静止、移入移出等显示方式。最后,利用烧录器可以很方便的实现单片机与PC机等外围存储设备的数据传输,并能利用软件方便的进行显示内容的多样变化,另一方面,LED点阵显示屏作为一种新兴的显示器件,是由多个独立的LED发光二极管封装而成。进行了单片机AT89C51的软件仿真并成功完成了仿真验证。结果表明包括系统具体的硬件设计方案,软件流程图和部分C语言程序等方面。具有在负载范围内, 只需通过简单的级连就可以对显示屏进行扩展,是一种成本低廉的图文显示方案意义。它在实际生活中具有广泛的应用。

关键词:单片机、16*16点阵、滚动显示

第1章引言

LED及LED显示屏

LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。在实际应用中的显示屏由于成本和可靠性的因素常采用一种称为动态扫描的显示方法。LED 就是Light Emitting Diode(发光二极管)的缩写。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。LED显示屏是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。

LED显示屏分为图文显示屏和视频显示屏,均由LED矩阵块组成。图文显示屏可与计算机同步显示汉字、英文文本和图形;视频显示屏采用微型计算机进行控制,图文、图像并茂,以实时、同步、清晰的信息传播方式播放各种信息,还可显示二维、三维动画、录像、电视、VCD节目以及现场实况。LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工

2

业企业管理和其它公共场所。

它的优点:亮度高、工作电压低、功耗小、微型化、易与集成电路匹配、驱动简单、寿命长、耐冲击、性能稳定。

功能要求

设计一个室内用16×16点阵LED图文显示屏,要求在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形或文字应稳定、清晰无串扰,图形或文字显示有静止、移入移出等显示方式。

方案论证

16×16的点阵显示屏共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,16×16的点阵需要256/8=32个锁存器。这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大的多,这样在锁存器上花的成本将是一个很庞大的数字。因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。

动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套列驱动器。具体就16×16的点阵来说,我们把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第一行使其燃亮一定的时间,然后熄灭;再送出第二行的数据并锁存,然后选通第二行使其燃亮相同的时间,然后熄灭;……第十六行之后又重新燃亮第一行,这样反复轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,我们就能看到显示屏上稳定的图形了。

采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两个部分。对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下,留给行显示的时间就太少了,以至影响到LED的亮度。

解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。即在显示本行各列数据的同时,传送下一行的列数据。为了达到重叠处理的目的,列数据的显示就需要具有锁存功能。经过上述分析,可以归纳出列驱动器电路应具备的主要功能。对于列数据准备来说,它应能实现串入并出的移位功能;对于列数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打入并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。

第2章系统总体方案及硬件设计

3

4

AT89C51的原理及说明

AT89C51是美国Intel 公司生产的低电压,高性能CHMOS8位单片机,片内含4k bytes 的可反复擦写的只读程序存储器(PEROM )和蔼可亲128 bytes 的随机存取数据存储器(RAM ),器件采用Intel 公司的高密度、非易失性存储技术生产,片内置通用4位中央处理器(CPU )和Flash 存储单元,功能强大AT89C51单片机适合于许多较为复杂控制应用场合。

AT89C51引脚图

显示屏总体设计方案

列驱动电路

列驱动电路有集成电路74HC595构成。它具有一个8位串入并出的移位寄存器和一个8位输出锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行列数据的同时,传送下一行的列数据,既达到重叠处理的目的。

单 片 机

LED 显示点阵

行驱动器

列驱动器

5 74HC595的外形及内部结构如图所示。它的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI 是串行数据的输入端。引脚SCK 是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI 的下一个数据打入最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。RCK 是输出锁存器的打入信号,其上升沿将移位寄存器的输出打入输出锁存器。引脚G 是输出三态门的开放信号,只有当其为低时锁存器的输出才开放,否则为高组态。SCLR 信号是移位寄存器清零输入端,当其为低时移位寄存器的输出全部为零。由于SCK 和RCK 两个信号是互相独立的,所以能够做到输入串行移位与输出锁存互不干扰。芯片的输出端为QA ~QH ,最高位QH 可作为多片74HC595级联应用时,向上一级的级联输出。但因为QH 受输出锁存器的打入控制,所以还从输出锁存器前引出QH ,作为与移位寄存器完全同步的级联输出。

行驱动器

由于4点阵显示器有16行,为充分利用单片机的接口,本电路中运用了单片机AT89C51的P1口和P2口,其输入是一个16进制码,解码输出为低态扫描信号,单片机P1口和P2口输出生产16条行选通讯信号线,再经过驱动器驱动对应的线。

74LS241

三态八缓冲器/线驱动器/线接收器(3S,两组控制)

简要说明:

241为三态输出的八组缓冲器和总线驱动器,其主要电器特性的典型值如下(不同厂家具体值有差别):

型号t PLH t phl P D

54LS241/74LS241 12ns 12ns 110mW

引出端符号:

1A1~1A4,2A1~2A4 输入端

/1G, /2G 三态允许端(低电平有效)

1Y1~1Y4,2Y1~2Y4 输出端

逻辑图:

6

7 双列直插封装

极限值:

电源电压…………………………………………. 7V

输入电压………………………………………….

输出高阻态时高电平电压………………………….

工作环境温度

54XXX …………………………………. -55~125℃

74XXX …………………………………. 0~70℃存储温度…………………………………………. -65~150℃功能表

:

推荐工作条件:

54LS244/74LS244

单位

最小额定最大

电源电压Vcc 54 5

V 74 5

输入高电平电V iH 2 V

输入低电平电V iL 54

V 74

输出高电平电流

I OH 54 -12

mA 74 -15

输出低电平电流

I OL 54 12

mA 74 24

动态特性(T A=25℃)

参数测试条件LS244

单位最大

t PLH输出由低到高传输延迟时间Vcc =5V

C L=45pF

R L=667 Ω18 ns

t PHL输出由高到低传输延迟时间18 ns t PZH输出由高阻态到高允许时间23 ns t PZL输出由高阻态到低允许时间30 ns

t PHZ输出由高到高阻态禁止时间Vcc=5V C L=5pF

R L=90 Ω18 ns

t PLZ输出由低到高阻态禁止时间25 ns 静态特性(TA为工作环境温度范围)

参数测试条件【1】

LS244

单位最小最大

V IK输入嵌位电压Vcc=最小,I ik=-18mA V △V T滞后电压Vcc=最小V

V OH输出高电平电压Vcc=最小,V IL=最大,V IH=2V,

I OH=-3mA

V

V OL输出低电平电压Vcc=最小,V IL=最大,

I OL=最大

54

V

74

I I最大输入电压时输

出电流

Vcc=最大,V I=7V mA I IH输入高电平电流Vcc=最大,VIH= 20 uA I IL输入低电

平电流

1A,2A Vcc=最大,V IL= mA I OS输出短路电流Vcc=最大-40 -225 mA

I OZH输出高阻态时高

电平电流Vcc=最大,V IH=2V

V IL=最大,V O=

20 uA

I OZL输出高阻态时低

电平电流Vcc=最大,V IH=2V,V IL=最大

,V O=

-20 uA

Icc电源电流Vcc=

最大

1Y,2Y均为高电平27

mA 1Y,2Y均为低电平46

1Y,2Y均为高阻态54

测试条件中的“最小”和“最大”用推荐工作条件中的相应值。

8

第 3 章系统硬件电路的设计

硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路三部分。单片机

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器,(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器。

(1)AT89C51引脚图如图所:

A T89C51单片机引脚图

(2)AT89C51单片机P口的特点:

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

单片机系统及外围电路

单片机采用89C51或其兼容系列的芯片,采用24M或更高频率的晶振,以获得较高的刷新频率,使显示更稳定。单片机的串口与列驱动器相连,用来送显示数据。P1口与P2口为行驱

9

动器,送出行信号;~口则用来发送控制信号。P0口空着,在有必要时可以扩展系统的ROM 和RAM。16×16点阵显示屏的硬件原理图如图3-1

图3-1 16×16点阵显示屏硬件原理图

列驱动电路

列驱动电路由集成电路74HC595构成,它具有一个8位串入并出的移位寄存器和一个8位输出锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行各列数据的同时,传送下一行的列数据,即达到重叠处理的目的。

74HC595的外形及内部结构如图所示。它的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI是串行数据的输入端。引脚SCK是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI的下一个数据打入最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。RCK是输出锁存器的打入信号,其上升沿将移位寄存器的输出打入到输出锁存器。引脚G是输出三态门的开放信号,只有当其为低时锁存器的输出才开放,否则为高阻态。SCLR信号是移位寄存器的清零输入端,当其为低时移位寄存器的输出全部为零。由于SCK和RCK两个信号是互相独立的,所以能够做到输入串行移位与输出锁存互不干扰。芯片的输出端为QA~QH,最高位QH可作为多片74HC595级联应用时,向上一级的级联输出。但因QH受输出锁存器打入控制,所以还从输出锁存器前引出了QH’,作为与移位寄存器完全同步的级联输出。

10

11

图3-2 74HC595外形及内部逻辑结构图

行驱动电路

单片机P1口与P2口为行驱动器,送出行信号;~口则用来发送控制信号。74LS154译码后生成16条行选通信号线,一条行线上要带动16列的LED 进行显示。

第 4 章 系统程序的设计

显示屏软件的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,我们可把显示屏的软件系统分成两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其它控制信号,配合完成LED 显示屏的扫描显示工作。显示驱动程序由定时器T0中断程序实现。系统应用程序完成系统环境设置(初始化)、显示效果处理等工作,由主程序来实现。

从有利于实现较复杂的算法(显示效果处理)和有利于程序结构化考虑,显示屏程序适宜采用C 语言编写。

显示驱动程序

显示驱动程序在进入中断后首先要对定时器T0重新赋初值以保证显示屏刷新率的稳定,1/16扫描的显示屏的刷新率(帧频)的计算公式如下:

其中fosc 为晶振频率,t0为定时器T0初值(工作在16位定时器模式)。

然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关)

65536(1216116100t f T osc -?=?=溢出率刷新率(帧频)

12 闭显示屏,即消隐,等显示数据打入输出锁存器并锁存,然后再输出新的行号,重新打开显示。图4-1为显示驱动程序(显示屏扫描函数)流程图。

系统主程序

系统主程序开始以后首先是对系统环境初始化,包括设置串口、定时器、中断和端口。然后以“滚动出”效果显示一个字,停留约3秒,接着向左滚动显示“十六乘十六点阵可调速显示屏设计”十五个汉字,停留约3秒,再向左滚动显示“十六乘十六点阵可调速显示屏设计”这十五个汉字,循环重复,由于单片机没有停机指令,所以我们可以设置系统程序不断地循环执行上述显示效果。图4-2是系统主程序的流程图。

单片机汇编程序

#include <>

定时器赋初值 读取行号并增1 送新行显示数据 消隐 切换显示数据 送新行号、打开显示 进入中断 退出中断 图4-1显示驱动程序流程图 系统初始化 “滚动出”显示效果 “加速”显示效果 “减速”显示效果 “默认”显示效果 开始 图4-2系统主程序流程图

sbit SET=P3^5;

sbit ADD=P3^6;

sbit SUB=P3^7;

sbit LOCK=P3^2;

sbit DAT=P3^0;

sbit CLK=P3^1;

unsigned char cnt,cnt2,line,*p,*old,shift,t[4];

char speed,i;

bit sec,key_mark;

unsigned char code Matrix001[32]=

{

/*---转换字符十 ---*/

0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01, 0x00,

0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01, 0x00,

};

unsigned char code Matrix002[32]=

{

/*---转换字符六 ---*/

0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00, 0x00,

0x04,0x40,0x04,0x20,0x08,0x10,0x08,0x08,0x10,0x08,0x20,0x04,0x40,0x04,0x00, 0x00,

};

unsigned char code Matrix003[32]=

13

{

/*---转换字符乘 ---*/

0x00,0xF8,0x3F,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x09,0x24,0xF9,0x38,0x09, 0x22,

0x39,0x22,0xCB,0x9E,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,0x01,0x00,0x01, 0x00,

};

unsigned char code Matrix004[32]=

{

/*---转换字符十 ---*/

0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01, 0x00,

0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01, 0x00,

};

unsigned char code Matrix005[32]=

{

/*---转换字符六 ---*/

0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00, 0x00,

0x04,0x40,0x04,0x20,0x08,0x10,0x08,0x08,0x10,0x08,0x20,0x04,0x40,0x04,0x00, 0x00,

};

unsigned char code Matrix006[32]=

{

/*---转换字符点 ---*/

0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xFC,0x02,0x00,0x02,0x00,0x3F,0xF0,0x20, 0x10,

0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x24,0x88,0x22,0x44,0x42,0x44,0x80, 0x04,

};

14

unsigned char code Matrix007[32]=

{

/*---转换字符阵 ---*/

0x00,0x40,0x7C,0x40,0x44,0x40,0x4B,0xFE,0x48,0x80,0x50,0xA0,0x49,0x20,0x49, 0xFC,

0x44,0x20,0x44,0x20,0x44,0x20,0x6B,0xFE,0x50,0x20,0x40,0x20,0x40,0x20,0x40, 0x20,

};

unsigned char code Matrix008[32]=

{

/*---转换字符可 ---*/

0x00,0x00,0x7F,0xFE,0x00,0x10,0x00,0x10,0x1F,0x10,0x11,0x10,0x11,0x10,0x11, 0x10,

0x11,0x10,0x11,0x10,0x1F,0x10,0x11,0x10,0x00,0x10,0x00,0x10,0x00,0x50,0x00, 0x20,

};

unsigned char code Matrix009[32]=

{

/*---转换字符调 ---*/

0x00,0x00,0x47,0xFC,0x24,0x44,0x24,0x44,0x05,0xF4,0x04,0x44,0xE4,0x44,0x27, 0xFC,

0x24,0x04,0x25,0xF4,0x25,0x14,0x2D,0x14,0x35,0xF4,0x24,0x04,0x04,0x14,0x08, 0x08,

};

unsigned char code Matrix010[32]=

{

/*---转换字符速 ---*/

0x00,0x40,0x20,0x40,0x17,0xFC,0x10,0x40,0x03,0xF8,0x02,0x48,0xF2,0x48,0x13, 0xF8,

0x10,0xE0,0x11,0x50,0x12,0x48,0x14,0x44,0x10,0x40,0x28,0x00,0x47,0xFE,0x00, 15

0x00,

};

unsigned char code Matrix011[32]=

{

/*---转换字符显 ---*/

0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F, 0xF0,

0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00, 0x00,

};

unsigned char code Matrix012[32]=

{

/*---转换字符示 ---*/

0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01, 0x00,

0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02, 0x00,

};

unsigned char code Matrix013[32]=

{

/*---转换字符屏 ---*/

0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x3F,0xF8,0x24,0x10,0x22,0x20,0x2F, 0xF8,

0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x42,0x20,0x44,0x20,0x84,0x20,0x08, 0x20,

};

unsigned char code Matrix014[32]=

{

/*---转换字符设 ---*/

16

0x00,0x00,0x21,0xF0,0x11,0x10,0x11,0x10,0x01,0x10,0x02,0x0E,0xF4,0x00,0x13, 0xF8,

0x11,0x08,0x11,0x10,0x10,0x90,0x14,0xA0,0x18,0x40,0x10,0xA0,0x03,0x18,0x0C, 0x06,

};

unsigned char code Matrix015[32]=

{

/*---转换字符计 ---*/

0x00,0x40,0x20,0x40,0x10,0x40,0x10,0x40,0x00,0x40,0x00,0x40,0xF7,0xFE,0x10, 0x40,

0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x14,0x40,0x18,0x40,0x10,0x40,0x00, 0x40,

};

unsigned char code Matrix016[32]=

{

/*---转换字符代 ---*/

0x08,0x90,0x08,0x88,0x08,0x88,0x10,0x80,0x10,0xBE,0x37,0xC0,0x30,0x80,0x50, 0x40,

0x90,0x40,0x10,0x40,0x10,0x20,0x10,0x22,0x10,0x12,0x10,0x0A,0x10,0x06,0x10, 0x02,

};

unsigned char code Matrix100[32]={0};

unsigned char code end;

void SendData(unsigned char *q)

{

unsigned char i,t;

t=*q;

17

for(i=0;i<16;i++)

{

if(i==8)

t=*(q+1);

if(t&1)

DAT=1;

else

DAT=0;

CLK=0;

CLK=1;

t>>=1;

}

LOCK=0;

LOCK=1;

}

void t0() interrupt 1

{

TH0=-50000>>8;

TL0=-50000;

if(++cnt2>speed)

{

cnt2=0;

sec=1;

}

}

void t1() interrupt 3 18

{

TH1=-1000>>8;

TL1=-1000;

if(++cnt>=0)

{

cnt=0;

if(++line>15)

line=0;

P1=P2=0xff;

t[0]=*(p+(line<<1));

t[1]=*(p+1+(line<<1));

t[2]=*(p+32+(line<<1));

t[3]=*(p+33+(line<<1));

if(shift<=7)

{

t[0]=(t[0]<>(8-shift));

t[1]=(t[1]<>(8-shift));

}

else

{

t[0]=(t[1]<<(shift-8))|(t[2]>>(16-shift));

t[1]=(t[2]<<(shift-8))|(t[3]>>(16-shift));

}

SendData(t);

if(line<8)

P1=~(1<

19

else

P2=~(1<<(line-8));

}

}

void delay()

{

unsigned char i,j;

for(i=0;i<4;i++)

for(j=0;j<100;j++)

;

}

void key()

{

if(!SET)

{

p=Matrix001;

shift=0;

}

else if(!ADD)

{

speed+=4;

}

else if(!SUB)

{

speed-=4;

if(speed<=1)

speed=1;

}

}

void init_t0()

20

本文来源:https://www.bwwdw.com/article/52fe.html

Top