16×16点阵显示综合实验
- 格式:doc
- 大小:141.00 KB
- 文档页数:12
EDA 综合课程设计(四)——16X16点阵显示综合实验16X16点阵控制接口一、 实验要求设计一个共阴16X16点阵控制接口,要求:在时钟信号的控制下,使点阵动态点亮,点亮方式自行设计,其中列选信号为16-4编码器编码输出。
控制器的引脚功能图如上图所示,其中:DIN[3..0]为显示花样模式选择,高电平有效;CLK 为时钟输入端;DOTOUT[15..0]为行驱动信号输出;SELOUT[3..0]为列选信号输出,为16-4编码信号。
图案1实现16X16点阵的16列同时从上往下依次点亮,全亮后16列又同时从下往上依次熄灭。
列选信号:采用与7段数码管的位选信号一样的处理方法,即列扫描信号频率大于24HZ 。
行驱动信号:可以采用移位的方法,可先定义一个16位的信号,若最高位置为‘1’,我们采用右移的方法,使每一位都置‘1’,这就实现依次点亮;当第0位也置‘1’后,给第0位置‘0’,二、实验内容16X16点阵控制接口引脚功能再采用左移的方法将每一位又重新置‘0’,这样就实现了反相依次熄灭,等第15位为‘0’时,又重新开始,以此循环。
对于其他的显示花样,请自行设计。
三、实验连线将CP端接时钟输出,并使输入频率约为1MHZ,DIN[3..0]分别接4位拨码开关,DOTOUT[15..0]分别接显示模块的L15~L0,SELOUT[3..0]分别接显示模块的SEL3~SEL0。
16X16点阵字符发生器一、实验目的:1、了解点阵字符的产生和显示原理。
2、了解E2PROM和16×16点阵LED的工作机理。
3、加强对于总线产生,地址定位的CPLD实现的理解。
二、硬件要求:1.主芯片EPF10K10LC84-4。
2.可变时钟源。
3.带有事先编程好字库/字符的E2PROM 2864。
4.16×16扫描LED点阵。
三、实验原理:16×16扫描LED点阵的工作原理同8位扫描数码管类似。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯。
16×16 LED点阵显示实验一、实验目的1、了解16×16矩阵LED显示的基本原理和功能2、掌握16×16矩阵LED和单片机的硬件接口和软件设计方法二、实验说明汉字显示屏广泛应用与汽车报站器,广告屏等。
实验介绍一种实用的汉字显示屏的制作,考虑到电路元件的易购性,采用了16×16的点阵模块;汉字显示的原理我们以UCDOS中文宋体字库为例,每一个字由16行16列的点阵组成显示。
即国标汉字库中的每一个字均由256点阵来表示。
我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。
所以在这个汉字屏上不仅可以显示汉字,也可以显示在256像素范围内的任何图形。
我们以显示汉字“大”为例,来说明其扫描原理:在UCDOS中文宋体字库中,每一个字由16行16列的点阵组成显示。
如果用8位的AT89C51单片机控制,由于单片机的总线为8位,一个字需要拆分为2个部分。
一般我们把它拆分为上部和下部,上部由8*16点阵组成,下部也由8*16点阵组成。
在本例中单片机首先显示的是左上角的第一列的上半部分,即第0列的p00---p07口。
方向为p00到p07 ,显示汉字“大”时,p05点亮,由上往下排列,为p0.0 灭,p0.1 灭, p0.2 灭p0.3 灭, p0.4 灭, p0.5 亮,p0.6 灭,p0.7 灭。
即二进制00000100,转换为16进制为 04h.。
上半部第一列完成后,继续扫描下半部的第一列,为了接线的方便,我们仍设计成由上往下扫描,即从p27向p20方向扫描,从上图可以看到,这一列全部为不亮,即为00000000,16进制则为00h。
然后单片机转向上半部第二列,仍为p05点亮,为00000100,即16进制04h。
这一列完成后继续进行下半部分的扫描,p21点亮,为二进制00000010,即16进制02h. 依照这个方法,继续进行下面的扫描,一共扫描32个8位,可以得出汉字“大”。
综合实践总结报告综合实践名称: EDA技术与实践综合实践地点、时间一.题目功能分析和设计实验的要求有如下三点:1.用16*16点阵的发光二极管显示字符;2.可显示字符为0~9的数字字符与A~F英文字母的大写;3.输入为四位二进制矢量;按照要求可知,LED点阵模块,共由16×16=256个LED发光二极管组成,如何在该点阵模块上显示数字和字母是本实验的关键。
先将要显示的每一幅图像画在一个16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布以数字8为例,点阵分布为:0000000000000000000000000000000000011111111110000001111111111000000110000001100000011000000110000001100000011000000111111111100000011111111110000001100000011000000110000001100000011000000110000001111111111000000111111111100000000000000000000000000000000000考虑到实际物理实验平台上点阵发光二极管的原理,以下为16×16点阵LED外观图,只要其对应的X、Y轴顺向偏压,即可使LED 发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
所以我采用行列扫描的方法,用四位二进制数做列选信号(总共16列),如选中第一列,则扫描第一列之中哪些行是高电平(1),哪些行是低电平(0);为高电平的则点亮,为低电平的不亮。
(列信号都接地)。
如此,列选信号由“0000”变到“1111”时,16列扫描完毕,一个字也就出来了,列选信号重新由“0000”开始扫描。
注意扫描频率必须要足够快,才能保证显示一个数字或字母时所有灯在肉眼看来是同时在闪烁的。
邮电与信息工程学院课程设计说明书课题名称:16×16点阵LED电子显示屏的设计学生学号:1002030205专业班级:计科02班学生姓名:龚建新学生成绩:指导教师:王会清课题工作时间:2013年5月6日至5月20日课程设计评审标准(指导教师用)附代码:***************************************; * *; * 单个16x16的点阵电子屏字符显示器 *; * ATA89C52 12MHz晶振 *; * 2013.5.19 *; ***************************************;显示字用查表法,不占用内存,字符用16x16共阳LED点阵,;效果:向上滚动显示5个字,再重复循环。
;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00~0FH)。
;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。
;*************;;中断入口程序;;*************;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHLJMP INTTOORG 0013HERTIORG 001BHERTIORG 0023HRETIORG 002BHRETI;;***********;;初始化程序;;***********;;;;***********;;主程序;;***********;;START: MOV 20H,#00H ;清零标志,00H为第16行开始扫描标志,01为1帧;扫描结束标志MOV A,#0FFH ;端口初始化MOV P1,AMOV P1,AMOV P3,AMOV P0,ACLR P1.6 ;串行寄存器输入打入输出控制位MOV TMOD,#01H ;使用T0做16位定时器,行扫描用。
MOV TH0,#0FCH ;1ms初值(12MHz)MOV TL0,#18HMOV SCON,#00H ;串口0方式传送显示字节MOV IE,#82H ;T0中断允许,总中断允许MOV SP,#70HMAIN: LCALL DISI ;显示准备,黑屏,1.5sMOV DPTR,#TABLCALL MOVDISP ;向上滚动显示一页(8个字)INC DPHLCALL MOVDISP ;向上滚动显示一页(8个字)INC DPHLACLL MOVDISP ;向上滚动显示一页(8个字)AJMP MAIN;;;***********************;;多字滚动显示程序;;***********************;;每次8个字,入口时定义好DPTR值;MOVDISP: MOV B,#00H ;向上移动显示,查表偏值暂存(从00开始)DISLOOP: MOV R3,#07H ;移动速度DISMOV: MOV R2,00H ;第0行开始MOV R1,BSETB TR0 ;开扫描(每次一帧)WAITMOV: JBC 01H,DISMOV1 ;标志为1扫描一帧结束(16ms为1帧,每行1ms) AJMP WAITMOVDISMOV1: DJNZ R3,DISMOV ;1帧重复显示(控制移动速度)INC B ;显示字的下一行(每行2字节)INC BMOV A,R1 ;R1为0,8个字显示完JZ MOVOUTAJMP DISLOOPMOVOUT: RET ;移动先是结束;;;****************;;单字显示程序;;****************;;显示表中某个字;;****************;DIS1: MOV R3,#5AH ;静止显示时间控制(16ms*#=1.6s)DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00~0FH)MOV DPTR,#TAB ;取表首址MOV R1,#00H ;查表偏址(显示第一个字)SETB TR0 ;开扫描(每次一帧)WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束AJMP WAIT11DIS111: DJNZ R3,DIS11RET;;;************;;扫描程序;;************;;1ms刷新一次,每行显示1sINTT0: PUSH ACCMOV TH0,#0FCH ;1ms初值重装MOV TL0,#18HJBC 00H,GOEND ;16行扫描标志为1,结束INC R1 ;取行右边字节偏址MOV A,R1MOVC A,@A+DPTR ;查表MOV SBUF,A ;串口0方式发送WAIT: JBC TI,GO ;等待发送完毕AJMP WAIT1GO: DEC R1 ;取行左边字节偏址MOV A,R1MOVC A,@A+DPTRMOV SBUF,AWAIT1: JBC T1,GO1AJMP WAIT1GO1: SETB P1.7 ;关行显示,准备刷新NOP ;串口寄存器数据稳定SETB P1.6 ;产生上升沿,行数据打入输出端NOPNOPCLR P1.6 ;恢复低电平MOV A,R2 ;修改显示行地址ORL A,#0F0H ;修改显示行地址MOV R2,A ;修改显示行地址MOV A,P1 ;修改显示行地址ORL A,#0FH ;修改显示行地址ANL A,R2 ;修改显示行地址MOV P1,A ;修改完成CLR P1.7 ;开行显示INC R2 ;下一行扫描地址值INC R1INC R1 ;下一行数据地址MOV A,R2ANL A,#0FHJNZ GO2SETB 00H ;R2为01H,现为末行扫描,置标志GO2: POP ACCRETIGOEND: CLR TR0 ;一帧扫描完毕,关扫描SETB 01H ;一帧扫描完毕,置结束标志POP ACCRETI ;退出;;;***************;;扫描文字表;;***************;;TAB:DB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00FFH,0FFH,0FFH ;黑屏DB0F9H,0BFH,0C7H,0AFH,0F7H,0B7H,0F7H,0B7H,0F7H,0BFH,000H,001H,0F7H,0BFH,0F7H, 0B7H ;我DB0F1H,0D7H,0C7H,0CFH,037H,0DFH,0F7H,0AFH,0F6H,06DH,0F7H,0F5H,0D7H,0F9H,0EFH, 0FDH ;DB0FFH,007H,0C0H,06FH,0EDH,0EFH,0F6H,0DFH,0C0H,001H,0DDH,0FDH,0BDH,0FFH,0C0H, 003H ;爱DB0FBH,0FFH,0F8H,00FH,0F3H,0DFH,0F4H,0BFH,0EFH,03FH,09CH,0CFH,073H,0F1H,0CFH, 0FBH ;DB0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH, 0F7H ;单DB0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH, 0FFHDB0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH, 0FFH ;片DB0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH, 0FFHDB0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH, 077H ;机DB0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH, 0FFH ;DB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH ;黑屏DB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH ;END。
16*16点阵显示实验报告一、实验目的(1)学习点阵显示字符的基本原理。
(2)掌握用数控分频控制速度,实现点阵扫描的基本方式。
(3)会使用Quartus II软件中的Verilog HDL语言实现点真的行列循环显示。
二、实验设备与器件Quartus II 软件、EP2C8Q208C8实验箱三、实验方案设计1.实验可实现的功能可通过编写Verilog HDL语言,实现点阵的行列交替扫描。
先是行扫描,扫描间隔为1s,16行都扫描完之后开始列扫描,扫描间隔仍然为1s,16列扫描完之后,行继续扫描,依次循环。
2.点阵基本知识16*16扫描LED点阵只要其对应的X、Y轴顺向偏压,即可使LED发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
应用时限流电阻可以放在X轴或Y轴。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯。
LED点阵每个点都有一个红色的发光二极管。
点阵内的二极管间的连接都是行共阳,列共阴。
本实验采用共阴,当二极管的共阳极为高电平,共阴极为低电平时,所接点发光;反之处于截止状态,不放光。
3.系统工作原理本系统用了两个模块,其中dianzhen.v是顶层文件,而hangsaomiao.v和liesaomiao.v是两个子模块,总体的系统功能框图如图3.3.1所示。
图3.3.1 系统功能图示通过流程图可以看到,体统是先将试验箱的50MHz时钟信号分频为1s,因为要实现16*16的点阵扫描,所以用一个16s的计时器计时,每经过16s行扫描与列扫描的状态转换一次,通过点阵显示出来。
4.模块化程序设计(1)点阵显示顶层程序设计module dianzhen (clk50mhz,row,sel0,sel1,sel2,sel3,line);input clk50mhz; //实验箱提供50MHz时钟信号output sel0,sel1,sel2,sel3; //设置引脚选通点阵output reg [15:0] row; //行output reg [3:0] line; //列wire [15:0] row1,row2;wire [3:0] line1,line2;reg [24:0] cnt=0; //1Hz计数子reg [4:0] cnt1=0; //16s计数子assign sel0=1'b0;assign sel1=1'b1;assign sel2=1'b0;assign sel3=1'b0;always@(posedge clk50mhz)beginif(cnt>=25'd5*******)begincnt<=25'b0; //1Hz计时器cnt1<=cnt1+1; //16s计时器endelsecnt<=cnt+1;endhangsaomiao u1(.clk50mhz(clk50mhz),.row(row1),.line(line1)); liesaomiao u2(.clk50mhz(clk50mhz),.row(row2),.line(line2));always@(*)if(cnt1<=5'd15)beginrow<=row1; //行扫描line<=line1;endelsebeginrow<=row2; //列扫描line<=line2;endendmodule(2)行扫描模块hangsaomiao.v程序设计module hangsaomiao(clk50mhz,line,row);input clk50mhz; //实验箱输入50MHz时钟信号output reg [15:0] row; //列output reg [3:0] line; //行reg [24:0] cnt1,cnt2; //计数子reg clkrow,clkline; //行脉冲、列脉冲always@(posedge clk50mhz)beginif(cnt1>=25'd5*******)begincnt1<=25'b0;clkrow=~clkrow; //1s列脉冲endelsecnt1<=cnt1+1;endalways@(posedge clk50mhz)beginif(cnt2>=25'd500)begincnt2<=25'b0;clkline=~clkline; //50KHz行脉冲endelsecnt2<=cnt2+1;endalways@(posedge clkline)begincase(line)4'd0:line<=4'd1; //高速行扫描4'd1:line<=4'd2;4'd2:line<=4'd3;4'd3:line<=4'd4;4'd4:line<=4'd5;4'd5:line<=4'd6;4'd6:line<=4'd7;4'd7:line<=4'd8;4'd8:line<=4'd9;4'd9:line<=4'd10;4'd10:line<=4'd11;4'd11:line<=4'd12;4'd12:line<=4'd13;4'd13:line<=4'd14;4'd14:line<=4'd15;4'd15:line<=4'd0;default:line<=4'd0;endcaseendalways@(posedge clkrow) //时间间隔为1s的列扫描begincase(row)16'b0000000000000001: row<=16'b0000000000000010;16'b0000000000000010: row<=16'b0000000000000100;16'b0000000000000100: row<=16'b0000000000001000;16'b0000000000001000: row<=16'b0000000000010000;16'b0000000000010000: row<=16'b0000000000100000;16'b0000000000100000: row<=16'b0000000001000000;16'b0000000001000000: row<=16'b0000000010000000;16'b0000000010000000: row<=16'b0000000100000000;16'b0000000100000000: row<=16'b0000001000000000;16'b0000001000000000: row<=16'b0000010000000000;16'b0000010000000000: row<=16'b0000100000000000;16'b0000100000000000: row<=16'b0001000000000000;16'b0001000000000000: row<=16'b0010000000000000;16'b0010000000000000: row<=16'b0100000000000000;16'b0100000000000000: row<=16'b1000000000000000;16'b1000000000000000: row<=16'b0000000000000001;default : row<=16'b0000000000000001;endcaseendendmodule(3)列扫描模块liesaomiao.v程序设计module liesaomiao(clk50mhz,row,line);input clk50mhz; //实验箱输入50MHz 时钟信号output reg [15:0] row; //行output reg [3:0] line; //列reg [24:0] cnt; //计数子reg clk;always@(posedge clk50mhz)beginif(cnt>=25'd5*******)begincnt<=25'b0;clk=~clk; //1sendelsecnt<=cnt+1;endalways @ (posedge clk) //列扫描begincase(line)4'h0:begin row=16'b1111111111111111;line<=4'h1; end4'h1:begin row=16'b1111111111111111;line<=4'h2; end4'h2:begin row=16'b1111111111111111;line<=4'h3; end4'h3:begin row=16'b1111111111111111;line<=4'h4; end4'h4:begin row=16'b1111111111111111;line<=4'h5; end4'h5:begin row=16'b1111111111111111;line<=4'h6; end4'h6:begin row=16'b1111111111111111;line<=4'h7; end4'h7:begin row=16'b1111111111111111;line<=4'h8; end4'h8:begin row=16'b1111111111111111;line<=4'h9; end4'h9:begin row=16'b1111111111111111;line<=4'ha; end4'ha:begin row=16'b1111111111111111;line<=4'hb; end4'hb:begin row=16'b1111111111111111;line<=4'hc; end4'hc:begin row=16'b1111111111111111;line<=4'hd; end4'hd:begin row=16'b1111111111111111;line<=4'he; end4'he:begin row=16'b1111111111111111;line<=4'hf; end4'hf:begin row=16'b1111111111111111;line<=4'h0; enddefault:line<=4'h0;endcaseendendmodule5.下载电路及引脚分配设计设计中用实验箱自带的50MHz时钟信号作为输入端,用sel0、sel1、sel2、sel3四个使能端选通点阵,EP2C8Q208C8就会工作在给点阵下命令的状态,并用line和row分别作为点阵的行、列选通端,最终使得点阵正常工作,如图3.5.1所示。
点阵显示实验16*16点阵显示实验引言当今,数字系统的设计可以直接面向用户的需求,根据系统功能的要求,从上到下逐层完成相应的描述、综合、优化、仿真与验证,直到生成器件。
而FPGA(Field Programmable Gate Array,现场可编程门镇列)以设计灵活及速度快的特点,在数字专用集成电路的设计中得到了广泛应用。
本文介绍的汉字显示系统,将16*16点阵与FPGA巧妙结合,采用VHDL(VHSIC Hardware Description Language,硬件描述语言)进行功能描述一、点阵显示原理1点阵模块说明此设计采用4块8*8的点阵块组成16*16的点阵显示模块1.18*8点阵块工作原理如图1所示。
8*8点阵块工作方式:Q端加正电压,COM端接地时发光二管点亮。
例如,当COM8接地且Q1~Q8分别接高电平时,第一行亮。
同理,当COM7接地,Q1~Q8分别接高电平时,第二行亮。
依此类推。
当Q5端加高电平时,分别让COM1~COM8接地,第一12列亮。
其它列依此类推。
1.2 16*16点阵模块用4块8*8的点阵块组成16*16的点阵模块显示汉字,连接关系如图2所示。
Q0~Q15成为点阵块的行线,COM0~COM15形成点阵块的列线。
1.3 行列驱动由循环计数器输出经放大后的驱动点阵,形成动态扫描,分别控制一列中的每个灯,当列线发出信号后,行线同时发出数据,这样就将一个汉字由左到右分成16列。
在完成各列的同时,行线发出行数据,一个循环就可以将一个汉字完整的重现在16*16的点阵模块上。
本实验主要完成汉字字符在LED 上的显示,16*16扫描LED 点阵的工作原理与8位扫描数码管类似,只是显示的方式与结果不一样而已。
下面就本实验系统的16*16点阵的工件原理做一些简单的说明。
16*16点阵由此256个LED通过排列组合而形成16行*16列的一个矩阵式的LED 阵列,俗称16*16点阵。
16x16LED点阵实验实验名称:16x16 LED点阵实验实验⽬的:利⽤单⽚机I/O⼝实现LED点阵的⾏扫描动态显⽰。
实验原理:1、LED显⽰器的基本结构:七段显⽰器:将发光⼆极管封装成数码显⽰的形式。
共阳七段显⽰器:共阴七段显⽰器:点阵式显⽰器:发光⼆极管封装成点阵形式,构成不同的字符甚⾄汉字、图形。
发光⼆极管排列成矩阵,由亮与暗来产⽣字符或图形。
每⼀⾏的阳极连在⼀起,每⼀列的阴极连在⼀起。
2、点阵显⽰的原理:点阵显⽰器每⼀列的阴极连在⼀起,对每⼀列⽽⾔相当于⼀个共阴显⽰器。
同时每⼀⾏的阳极连在⼀起,相当于七段显⽰器的笔划。
这样,可以把5X7的发光⼆极管点阵看作⼀个五位显⽰器。
可采⽤动态显⽰电路,以笔划锁存器控制⾏信号,以位锁存器控制列信号。
3、实验原理图使⽤两⽚8位输出锁存移位寄存器74HC595(三态输出、串⼊并出),将单⽚机I/O⼝发出的串⾏数据转换为并⾏数据LD_QA~LD_QP,作为16×16 LED点阵显⽰器的⾏线,使⽤另外两⽚8位74HC595作为 16×16 LED点阵显⽰器的列线LD_1~LD_16。
当⾏输出⾼电平、列输出低电平时,可以点亮点阵。
74HC595:LD-QA~LD-QP:点阵⾏控制信号LD-1~LD-16:点阵列控制信号SER(14脚):串⾏数据输⼊端-SCLR(10脚):低电平时将移位寄存器的数据清零。
通常将它接Vcc。
SCK(11脚):上升沿时将串⾏数据移⼊移位寄存器。
RCK(12脚):上升沿时移位寄存器的数据锁存⼊数据寄存器。
-G(13脚): ⾼电平时禁⽌输出(⾼阻态)时序图:实验内容:在16×16LED点阵上分别⽤静态⽅式和滚屏⽅式显⽰⾃⼰的姓(⾏扫描)。
实验步骤:使⽤导线将A2区的P10~P14与C3区的L_DAT_H 、L_DAT_L、L_CLK、L_OE 、 L_STR 实验设计:电路图:(修改后加上了74HC595输出端⼝与LED点阵相连的端⼝名称)流程图:代码及注释:HL EQU 70H ;⾏信号低位内存地址LL EQU 72H ;列信号低位内存地址HD EQU P1.0 ;p1.0⼝连⾏信号输⼊端LD EQU P1.1 ;P1.1⼝连列信号输⼊端SCK EQU P1.2 ;P1.2⼝连移位寄存器OE EQU P1.3 ;P1.3⼝连使能端RCK EQU P1.4 ;P1.4⼝连锁存器ORG 8000H ;硬件仿真程序LJMP MAINORG 8100H ;硬件仿真程序MAIN:MOV DPTR,#DISPLAY ;字模表地址MOV R1,#00H ;字模表起始地址偏移量MOV HL,#01H ;⾏扫描信号的初值0001HMOV HL+1,#00HLOOP:MOV A,R1MOVC A,@A+DPTRMOV LL,A ;找到列低位数据,存⼊内存地址中INC R1MOV A,R1MOVC A,@A+DPTRMOV LL+1,A ;找到列⾼位数据,存⼊内存地址中LCALL SENDD ;调⽤传输数据的程序LCALL DELAY ;调⽤延时程序CLR C ;位处理累加器清零MOV A,HLRLC A ;左移⾏扫描信号低8位MOV HL,AMOV A,HL+1RLC A ;左移⾏扫描信号⾼8位MOV HL+1,AINC R1CJNE R1,#20H,LOOP ;判断⼀轮扫描是否结束LJMP MAINSENDD:CLR OE ;使能信号低电平有效CLR RCK ;RCK信号置0MOV R2,#08HMOV R3,LL+1 ;列信号⾼⼋位地址MOV R4,HL+1 ;⾏信号⾼⼋位地址BACK:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;⾏信号逐位传输SETB SCK ;SCK信号上升沿到来,将串⾏数据移⼊移位寄存器DJNZ R2,BACK ;判断⾼8位信号是否传输完毕MOV R2,#08HMOV R3,LL ;列信号低8位地址MOV R4,HL ;⾏信号低8位地址BACK1:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;⾏信号逐位传输SETB SCK ;SCK信号上升沿到来,将串⾏数据移⼊移位寄存器DJNZ R2,BACK1 ;判断低8位信号是否传输完毕SETB RCK ;RCK信号上升沿到来,移位寄存器的数据锁存⼊数据寄存器RET DELAY: ;延时⼦程序MOV R7,#50DELAY1:MOV R6,#10DELAY2:DJNZ R6,$DJNZ R7,DELAY1RETDISPLAY:DB 0xFF,0xFE,0xE0,0xEE,0xEF,0xCE,0xEF,0xF6,0xE1,0xFA,0xFD,0xFC,0xFD,0xFE,0x3D,0x80;DB 0xE0,0xFA,0xED,0xFA,0xEF,0xF6,0xEF,0xF6,0xEF,0xEE,0xEF,0x9A,0x6B,0xDC,0xF7,0xFE;"张" END 2、滚屏⽅式流程图:代码及注释:HL EQU 70H ;⾏信号低位内存地址LL EQU 72H ;列信号低位内存地址HD EQU P1.0 ;p1.0⼝连⾏信号输⼊端LD EQU P1.1 ;P1.1⼝连列信号输⼊端SCK EQU P1.2 ;P1.2⼝连移位寄存器OE EQU P1.3 ;P1.3⼝连使能端RCK EQU P1.4 ;P1.4⼝连锁存器ORG 8000H ;硬件仿真程序LJMP MAINORG 8100H ;硬件仿真程序MAIN:MOV DPTR,#DISPLAY ;字模表地址MOV R1,#00HMOV R7,#00H ;R7⽤来表⽰字模表起始位置偏移量LOOP:MOV R5,#20 ;R5⽤来表⽰延时,改变R5的值可改变滚屏速度LOOP1: MOV R6,#10H ;R6⽤来判断是否扫描完⼀轮MOV A,R7 ;将R7的值赋值给R1MOV R1,AMOV HL,#01H ;⾏扫描信号的初值0001HMOV HL+1,#00HLOOP2:MOV A,R1MOVC A,@A+DPTRMOV LL,A ;找到列低位数据,存⼊内存地址中INC R1MOV A,R1MOVC A,@A+DPTRMOV LL+1,A ;找到列⾼位数据,存⼊内存地址中LCALL SENDD ;调⽤传输数据的程序LCALL DELAY ;调⽤延时程序CLR C ;位处理累加器清零MOV A,HLRLC A ;左移⾏扫描信号低⼋位MOV HL,AMOV A,HL+1RLC A ;左移⾏扫描信号⾼⼋位MOV HL+1,AINC R1DEC R6CJNE R6,#00H,LOOP2 ;通过R6判断是否扫描完⼀轮,R6减为0,⼀轮扫描结束DJNZ R5,LOOP1 ;通过R5判断⼀帧的延时是否达到INC R7 ;改变字模表的偏移量INC R7 ;R7连续加2,相当于换⾏CJNE R7,#40H,LOOP ;判断字模表是否结束LJMP MAINSENDD:CLR OE ;使能信号低电平有效CLR RCK ;RCK信号置0MOV R2,#08HMOV R3,LL+1 ;列信号⾼8位地址MOV R4,HL+1 ;⾏信号⾼8位地址BACK:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;⾏信号逐位传输SETB SCK ;SCK信号上升沿到来,将串⾏数据移⼊移位寄存器DJNZ R2,BACK ;判断⾼⼋位信号是否传输完毕MOV R2,#08HMOV R3,LL ;列信号低⼋位地址MOV R4,HL ;⾏信号低⼋位地址BACK1:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;⾏信号逐位传输SETB SCK ;SCK信号上升沿到来,将串⾏数据移⼊移位寄存器DJNZ R2,BACK1 ;判断低⼋位信号是否传输完毕SETB RCK ;RCK信号上升沿到来,移位寄存器的数据锁存⼊数据寄存器RETDELAY: ;延时⼦程序MOV R2,#50DELAY1:MOV R3,#10DELAY2:DJNZ R3,$DJNZ R2,DELAY1RETDISPLAY:DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFFDB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;预留空⽩DB 0xFF,0xFE,0xE0,0xEE,0xEF,0xCE,0xEF,0xF6,0xE1,0xFA,0xFD,0xFC,0xFD,0xFE,0x3D,0x80;DB 0xE0,0xFA,0xED,0xFA,0xEF,0xF6,0xEF,0xF6,0xEF,0xEE,0xEF,0x9A,0x6B,0xDC,0xF7,0xFE;"张" END实验结果与分析:1、程序正确运⾏后,可看到16x16 LED点阵显⽰屏上显⽰“张”,LED灯的亮暗程度有些不均匀。
三、实验效果分析(包过仪器设备等使用效果)三、实验效果分析:静态点阵RTL图形:动态RTL仿真图形:实验中程序一点阵里显示静态的师字,程序二中点阵显示的师字自右往左移动,说明实验程序正确。
字符显示的内容改变通过将要显示的数据取模,定制在ROM上,便可实验内容的改变,移动方向的改变将Q1<=Q1+1;改成Q1<=Q1-1;也就是将当前对应地址发生器的地址改为前一地址便可右移,改为后一地址便是左移,不变则静止。
教师评语指导教师年月日江西师范大学物理与通信电子学院教学实验报告专业:电子信息工程2011年5月11日实验名称16×16点阵字符显示设计指导老师姓名年级学号成绩一、预习部分1、实验目的2、实验基本原理3、主要仪器设备(包含必要的元器件、工具)一、实验目的:1.进一步熟悉QUARTUS‖及其LPM_ROM与FPGA硬件资源的使用方法。
2.学习和掌握16*16点阵字符显示设计方法。
二、实验基本原理:利用不同的行抄描和列扫描,加上字取模软件对字取模,利用动态扫描便在点阵上看到了字。
二、主要仪器设备电脑、实验箱二、实验操作步骤1.实验数据、表格及数据处理2.实验操作过程(可以用图表示)3.结论1.实验数据、表格及数据处理如下:library ieee; if rst='1'thenuse ieee.std_logic_1164.all; qa<=(others=>'0');use ieee.std_logic_unsigned.all; elsif clk'event and clk='1' thenentity sy12 is qa<=qa+1;port(clk,rst:in std_logic; end if;sel:out std_logic_vector(3 downto 0); end process;dout:out std_logic_vector(15 downto 0)); process(qa,rst)end ; beginarchitecture one of sy12 is if rst='1' thencomponent data_rom q1<=(others=>'0');port (address:in std_logic_vector(4 downto 0); elsif qa(10)'event and qa(10)='1' then inclock:in std_logic; q1<=q1+1; --当前所有地址改为对应的下一q:out std_logic_vector(15 downto 0)); end if; 地址,即整体左移end component; end process;signal qa:std_logic_vector(10 downto 0); sel<=not(q0-2);signal q0:std_logic_vector(3 downto 0); qq<=q1+q0;signal qq:std_logic_vector(4 dow u1: data_rom port map(address=>qq,q=>dout,inclock=>clk); signal q1:std_logic_vector(4 downto 0); end;beginprocess(clk,rst)beginif rst='1' thenq0<=(others=>'0');elsif clk'event and clk='1' thenq0<=q0+1;end if ;end process;process(clk,rst)begin 2、实验操作过程如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sy11 isport(clk,rst:in std_logic;sel:out std_logic_vector(3 downto 0);dout:out std_logic_vector(15 downto 0));end ;architecture one of sy11 iscomponent data_romport (address:in std_logic_vector(4 downto 0);inclock:in std_logic;q:out std_logic_vector(15 downto 0));end component;signal qq:std_logic_vector(4 downto 0);signal q1:std_logic_vector(4 downto 0);beginprocess(clk,rst)beginif rst='1' thenq1<=(others=>'0');elsif clk'event and clk='1' thenq1<=q1+1; end if ;end process;qq<=q1-1;sel<=not qq(3 downto 0);u1:data_rom port map(address=>q1,q=>dout,inclock=>clk); end;。
《EDA技术综合设计》课程设计报告报告题目: 16×16点阵显示综合实验作者所在系部:电子工程系作者所在专业:作者所在班级:作者姓名:指导教师姓名:完成时间:内容摘要编写16×16点阵字符发生器的程序,通过CLK信号控制它的行驱动信号和列选信号让其依次输出‘中’,‘国’,‘人’三个字,通过硬件实验观察其结果,对于其他的显示花样以及点亮方式,可以根据实际需要自行设计。
关键字:16×16点阵,CLK,显示花样目录一概述 (5)二方案设计与论证 (5)三程序清单 (5)四器件编程与下载 (9)五性能测试与分析 (10)六实验设备 (10)七心得体会 (10)八参考文献 (11)课程设计任务书一、概述在时钟信号的控制下,使16×16点阵管花样点亮,在EDA试验仪中,16×16点阵显示列的驱动已经做好,其列选信号为SELOUT[3..0],送到4线-16线译码电路,译码电路的输出通过8只75451(双2输入与门,OC门)驱动器驱动16×16点阵管的16条共阴极列线;所以在设计点阵控制接口时,其列选信号必须由SELOUT[3..0]输出去控制译码电路。
对于信号的频率,采用与七段数码管的位选信号一样的处理方法,即扫描频率大于24Hz;通过CLK信号控制行驱动与列选信号使其动态依次显示”中国人“三个字。
其中CLK为时钟输入端,DIN[3..0]为花样显示模式选择,doout[15..0]为行驱动信号输出;SELOUT[3..0]为列选信号输出,去驱动4-16译码电路产生16×16点阵管的列选信号。
二、方案设计与论证该程序由三个进程信号组成,进程K1通过CLK信号控制扫描频率s以及计数信号q,进而由q的记述周期控制cp信号。
进程k2由cp信号控制汉字的扫描周期s0,实现汉字的依次显示,进程k3由扫描信号s控制点阵的行驱动和列选信号,使其准确显示’中国人’三个字。
用VHDL语言编写程序,经过上级调试与编译,并下载到硬件观察实验结果。
三、程序清单library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity A1 isport(clk,rst:in std_logic;din :in std_logic_vector(3 downto 0); dotout :out std_logic_vector(15 downto 0); selout:OUT std_logic_vector(3 downto 0));end A1;architecture a of A1 issignal q:std_logic_vector(7 downto 0);signal so:std_logic_vector(1 downto 0);signal cp:std_logic;signal s:std_logic_vector(3 downto 0);beginK1:processbeginif rising_edge(clk) thenif s="1111" thens<="0000";if q="11111111"thenq<="00000000";cp<='1';else q<=q+1;cp<='0';end if;else s<=s+1;end if;end if;end process K1;K2:processbeginif rising_edge(cp) thenif so="11"thenso<="00";else so<=so+1;end if;end if;end process K2;K3:processbeginif so="00"thencase s iswhen"0000"=>selout<="0000";dotout<="0000000000000000"; when"0001"=>selout<="0001";dotout<="0000000000000000"; when"0010"=>selout<="0010";dotout<="0000000000001000"; when"0011"=>selout<="0011";dotout<="0000011111111100"; when"0100"=>selout<="0100";dotout<="0000001000001000"; when"0101"=>selout<="0101";dotout<="0000001000001000"; when"0110"=>selout<="0110";dotout<="0000001000001000"; when"0111"=>selout<="0111";dotout<="1111111111111111"; when"1000"=>selout<="1000";dotout<="0000001000001000"; when"1001"=>selout<="1001";dotout<="0000001000001000"; when"1010"=>selout<="1010";dotout<="0000001000001000"; when"1011"=>selout<="1011";dotout<="0000001000001000"; when"1100"=>selout<="1100";dotout<="0000001000001000"; when"1101"=>selout<="1101";dotout<="0000011111111100"; when"1110"=>selout<="1110";dotout<="0000000000000000"; when"1111"=>selout<="1111";dotout<="0000000000000000"; when others =>null;end case;elsif so="01"thencase s iswhen"0000"=>selout<="0000";dotout<="0000000000000000";when"0001"=>selout<="0001";dotout<="0000000000000000"; when"0010"=>selout<="0010";dotout<="1111111111111110"; when"0011"=>selout<="0011";dotout<="0100000000000010"; when"0100"=>selout<="0100";dotout<="0100100000001010"; when"0101"=>selout<="0101";dotout<="0100100000001010"; when"0110"=>selout<="0110";dotout<="0100111010001010"; when"0111"=>selout<="0111";dotout<="0100100110001010"; when"1000"=>selout<="1000";dotout<="0100100010001010"; when"1001"=>selout<="1001";dotout<="0100111111111010"; when"1010"=>selout<="1010";dotout<="0100100010001010"; when"1011"=>selout<="1011";dotout<="0100100010001010"; when"1100"=>selout<="1100";dotout<="0100100010001010"; when"1101"=>selout<="1101";dotout<="0100100000001010"; when"1110"=>selout<="1110";dotout<="1111111111111110"; when"1111"=>selout<="1111";dotout<="0000000000000000"; when others =>null;end case;elsif so="10"thencase s iswhen"0000"=>selout<="0000";dotout<="0100000000000000"; when"0001"=>selout<="0001";dotout<="0010000000000000"; when"0010"=>selout<="0010";dotout<="0001000000000000"; when"0011"=>selout<="0011";dotout<="0000100000000000"; when"0100"=>selout<="0100";dotout<="0000010000000000"; when"0101"=>selout<="0101";dotout<="0000001000000000"; when"0110"=>selout<="0110";dotout<="0000000100000000"; when"0111"=>selout<="0111";dotout<="0000000011111111"; when"1000"=>selout<="1000";dotout<="0000000100000000"; when"1001"=>selout<="1001";dotout<="0000001000000000"; when"1010"=>selout<="1010";dotout<="0000010000000000"; when"1011"=>selout<="1011";dotout<="0000100000000000";when"1100"=>selout<="1100";dotout<="0001000000000000";when"1101"=>selout<="1101";dotout<="0010000000000000";when"1110"=>selout<="1110";dotout<="0100000000000000";when"1111"=>selout<="1111";dotout<="0100000000000000";when others =>null;end case;else selout<="ZZZZ";dotout<="ZZZZZZZZZZZZZZZZ";end if;end process K3;end a;四、器件编程与下载通过了编译,接下来我们开始对器件进行引脚的锁定,引脚的锁定办法如下图所示。