项目一8×8点阵数字滚动显示LED点阵的元件符号及内部结构图:对应编码:00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;NULL00H, 00H, 3EH, 41H, 41H, 41H, 3EH, 00H ; 000H, 00H, 00H, 00H, 21H, 7FH, 01H, 00H ; 100H, 00H, 27H, 45H, 45H, 45H, 39H, 00H ; 200H, 00H, 22H, 49H, 49H, 49H, 36H, 00H ; 300H, 00H, 0CH, 14H, 24H, 7FH, 04H, 00H ; 400H, 00H, 72H, 51H, 51H, 51H, 4EH, 00H ; 500H, 00H, 3EH, 49H, 49H, 49H, 26H, 00H ; 600H, 00H, 40H, 40H, 40H, 4FH, 70H, 00H ; 700H, 00H, 36H, 49H, 49H, 49H, 36H, 00H ; 800H, 00H, 32H, 49H, 49H, 49H, 3EH, 00H ; 900H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;NULL硬件设计原理:单片机利用外部晶振作为时钟信号输入,RST端口接入上电复位信号使它加电后自动进行复位操作。
将要显示的字符码表编入单片机的程序中,由单片机控制时序输出相应的扫描数据和字符数据。
行码数据由单片机P0口输出,经一个双向总线收发器控制传输方向后进入LED点阵,点亮相应的发光二极管。
列码扫描信号由P3口输出后,直接输入LED点阵控制8列的扫描,每列选通时间为5ms,看上去就像8列同时显示的效果一样。
加上行中相应的LED灯被点亮,就能看到显示的字符了。
三、源程序代码:R_CNT EQU 31H ;列码R_NCT=31H单元NUMB EQU 32H ;行码NUMB=32H单元TCOUNT EQU 33H;拉幕计数值TCOUNT=33H单元ORG 00H ;程序起始地址LJMP STARTORG 0BH;中断入口地址LJMP INT_T0ORG 30H;子程序入口地址START: ;主程序开始MOV R0, #00H ;每列的行码起始序号置0MOV R_CNT, #00H;列:初值00送到31H单元MOV NUMB, #00H;行:初值00送到32H单元MOV TCOUNT, #00H;计数单元初值置0MOV TMOD, #01H;计数定时器选用16位的计数器,工作在方式1MOV TH0, #(65536-5000)/256;定时5ms。
定时器高位初值为236MOV TL0, #(65536-5000) MOD 256;定时器低位初值为120SETB TR0 ;启动C/T的定时器T0MOV IE, #82H;CPU开中断SJMP $ ;中断等待I NT_T0:MOV TH0, #(65536-5000)/256 ;定时5ms,设置定时器T0高位初值为236MOV TL0, #(65536-5000)/256 ; 定时器T0低位初值为120MOV DPTR, #TAB;读列码表首地址,放入DPTRMOV A, R_CNT;读列码偏移地址,放入A中MOVC A, @A+DPTR ;基址变址寻址将寻到的列码数据放入A中MOV P3,A ;将列码数据送P3口输出MOV DPTR, #NUB;装入显示数据的地址MOV A, NUMB;显示幕次的偏移地址MOVC A, @A+DPTR;寻到数据的行码地址MOV P0, A ;将该地址值输出INC NUMB ;行码地址加1NEXT1:INC R_CNT ;扫描列码地址加1MOV A, R_CNT ;把列地址放入A中CJNE A, #8, NEXT2 ;A不等于8,转子程序NEXT2,否则往下执行MOV R_CNT, #00H ;就把列码置0MOV NUMB, R0 ;行码地址送存储单元格中NEXT2:INC TCOUNT ;拉幕计数序号加1MOV A, TCOUNT ;将幕次序号送A中CJNE A, #40, NEXT4;此序号不等于40转Next4,否则往下执行MOV TCOUNT, #00H ;把拉幕时序归0INC R0 ;行码起始地址加1CJNE R0, #88, NEXT3 ;行码自加次数不满11字符×8行/字符=88行就转Next3MOV R0, #00H ;不然就把行码置0NEXT3:MOV NUMB, R0 ;送新的一幕行码起始位给R0NEXT4:RETI;中断返回TAB: ;列码码表DB 0FEH, 0FDH, 0FBH, 0F7H, 0EFH, 0DFH, 0BFH, 7FH ;列扫描从右向左NUB:;行码码表,字符数据DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;NULLDB 00H, 00H, 3EH, 41H, 41H, 41H, 3EH, 00H ; 0DB 00H, 00H, 00H, 00H, 21H, 7FH, 01H, 00H ; 1DB 00H, 00H, 27H, 45H, 45H, 45H, 39H, 00H ; 2DB 00H, 00H, 22H, 49H, 49H, 49H, 36H, 00H ; 3DB 00H, 00H, 0CH, 14H, 24H, 7FH, 04H, 00H ; 4DB 00H, 00H, 72H, 51H, 51H, 51H, 4EH, 00H ; 5DB 00H, 00H, 3EH, 49H, 49H, 49H, 26H, 00H ; 6DB 00H, 00H, 40H, 40H, 40H, 4FH, 70H, 00H ; 7DB 00H, 00H, 36H, 49H, 49H, 49H, 36H, 00H ; 8DB 00H, 00H, 32H, 49H, 49H, 49H, 3EH, 00H ; 9DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;NULLEND ;结束汇编程序流图:项目一8×8点阵数字滚动显示一、设计要求本次设计采用单片机AT89C51驱动8×8点阵LED显示屏,轮流显示0~9的数字。
显示方式采用自左向左拉幕式显示。
二、硬件电路介绍1.AT89C51单片机:P0口:P0口为一个8位漏级开路双向I/O口。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0口能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,当P2口被写“1”时,其管脚被内部上拉电阻拉高,P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输出,由于外部下拉为低电平,它将输出电流。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
A T89C51单片机的外形及引脚排列说明如后页图示。
AT89C51单片机的外形及引脚排列如右图。
2. 74LS373芯片:当三态允许控制端OE 为低电平时,O0~O7 为正常逻辑状态,可用来驱动负载或总线。
当OE 为高电平时,O0~O7 呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。
当锁存允许端LE 为高电平时,O 随数据D 而变。
当LE 为低电平时,O 被锁存在已建立的数据电平.D0~D7 数据输入端OE 三态允许控制端(低电平有效)LE 锁存允许端O0~O7 输出端3. respack-8器件:排阻器件,起上拉电阻的作用。
4. 8×8LED点阵8×8LED点阵可作为信息输出器件。
它是由发光二极管阵列按8排8列的方式排列起来,由x和y引脚输入的电信号对其进行选通,使不同位置的二极管被点亮,相应地显示出文字或图案等信息来。
四、硬件设计仿真:五、设计调试过程及问题在PC机上运行Proteus软件,将电路原理图中的元件找出并相应地连接好线;在Keil汇编软件中输入设计的程序,编译通过后生成十六进制文件,并再把该文件下载到虚拟的AT89C51单片机内。
因为单片机的RST引脚经电容接到了Vcc电源上,同时并联接地,所以系统可以上电后自动执行一次复位操作。
问题一第一次连接硬件电路,由于没有接74LS373双向总线收发器,所以在LED点阵和单片机I/O口之间就直接连接了,结果LED显示屏无法显示单片机输出的结果,所有的LED 灯都不亮。
看来直接跳线时单片机I/O口输出的信号不足以驱动8乘8点阵工作。
当8051单片机的P0口输出八位低地址时,必须接入74LS373作地址锁存器。
问题二仿真时会看到LED点阵中有字显示的地方(前景)灯是灭的,无字显示的地方(背景)灯是亮的,这出现“阴文”显示状态。
产生这种显示的原因是因为8×8点阵LED引脚接反了,应该正端接P3,负端接P0。
即可看到正确的“阳文”方式显示出的数字。
问题三仿真时出现数字是反着的,产生这种显示的原因是因为点阵的列码扫描信号线A~H与单片机的P3.0~P3.7口相应的顺序接反了,把对应的接线顺序倒过来,才正确。