哈工程FPGA实验报告——16×16点阵
fpga实验报告点阵实验报告

点阵实验一.实验目的理解原有程序并修改以实现点阵列的行扫描与列扫描。
一、实验原理1.74HC154简介74HC154是一款高速CMOS器件,74HC154译码器可接受4位高有效二进制地址输入,并提供16个互斥的低有效输出。
74HC154的两个输入使能门电路可用于译码器选通,以消除输出端上的通常译码“假信号”,也可用于译码器扩展。
该使能门电路包含两个“逻辑与”输入,必须置为低以便使能输出端。
任选一个使能输入端作为数据输入,74HC154可充当一个1-16的多路分配器。
当其余的使能输入端置低时,地址输出将会跟随应用的状态。
7在实验中通过对74HC154输入端的计数控制,实现了列的扫面。
切扫描的频率从由输入变化的频率控制。
在实验中,我们使用了74HC154来进行列控制信号的输出。
其引脚图为:74HC154 参数74HC154 基本参数电压 2.0~6.0V驱动电流+/-5.2 mA传输延迟11 ns@5V74HC154 其他特性逻辑电平CMOS功耗考量低功耗或电池供电应用74HC154 封装与引脚SO24, SSOP24, DIP24, TSSOP242.点阵工作原理8*8LED点阵共由64个发光二极管组成,每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1高电平,且某一列置0低电平,则相应的发光二极管就亮;因此要用8*8LED点阵来显示一个字符或汉字,只需要根据字符或汉字图形中的线条或笔画,通过点亮多个发光二极管来勾勒出字符或汉字的线条或笔画就行了。
当要比较完美的显示一般的汉字,单个8*8LED点阵模块很难做到,因为LED的点数(也称为像素点)不够多,因此要显示汉字的话,需要多个8*8LED点阵拼合成一个显示屏。
假如用4个8*8LED点阵模块拼成16*16的点阵,即能满足一般汉字的显示。
但要显示信息量大的图形,则需要n个多个8*8LED点阵,拼装成一个大屏幕才行。
16×16扫描LED点阵的工作原理同8位扫描数码管类似。
16×16点阵显示实验 实验报告

1.实验现象
当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1KHZ,按下矩阵键盘的某一个键,则在数码管上显示对应的这个键标识的键值,当再按下第二个键的时候前一个键的键值在数码管上左移一位。按下“*”键则在数码管是显示“E”键值。按下“#”键在数码管上显示“F”键值。
2.实验图片记录
2)新建VHDL File(程序)
3)编译仿真
4)管脚分配
5)下载调试
2)加强对总线产生地址定位的CPLD实现方法的理解
3)掌握在FPGA中调用ROM的方法
成绩: 教师:
实验报告
一、实验内容及步骤
1.实验内容
1)通过编程实现对16×16点阵的控制
2)在点阵循环中显示“欢迎使用嵌入式SDC开发系统”这几个汉字和字符
3)运用软件对程序进行编译和仿真
2.实验步骤:
1)新建工程
成绩: 教师: 批改日期:
பைடு நூலகம்湖南科技大学
物理与电子科学学院专业实验报告
实验课程:FPGA实验原理
实验项目:16×16点阵显示实验
专 业:物理与电子科学学院
班 级:电子信息科学与技术3班
***********
学 号:**********
实验日期: 年 月 日
实验预习报告
一、实验目的及要求
1)加强点阵字符产生的显示原理和系统的16×16点阵的工作原理
单片机16×16点阵显示实验总结400字

单片机16×16点阵显示实验总结400字单片机16×16点阵显示实验总结这次实验我们使用单片机设计了16×16点阵显示器的驱动电路,并成功实现了在点阵上显示字符、数字和图案的功能。
下面是对本次实验的总结。
首先,我们按照实验手册的指示,采用逐行扫描的方式驱动16×16点阵显示器。
通过设置接口电路和引脚连接,将单片机与点阵电路相连,实现数据和控制信号的传输。
接着,我们编写了相应的程序代码,在单片机上进行编译和烧录,并使用示波器进行调试。
在调试过程中,我们发现了一些常见的问题,比如接口线连接错误、引脚配置错误等,及时解决这些问题,确保了实验的顺利进行。
接下来,我们开始编写点阵显示的控制程序。
通过对点阵每一个LED灯珠的亮灭状态进行控制,我们可以实现在点阵上显示不同的字符、数字和图案。
我们编写了一个字符库,其中包含了常用字符和数字的点阵码。
通过查表的方式,我们可以根据需要在点阵上显示相应的内容。
在编写程序的过程中,我们充分利用了单片机的IO口和定时器的功能,并采用了合理的算法,提高了程序的执行效率。
在实验过程中,我们遇到了一些困难和挑战。
首先,点阵显示器的像素较多,对于单片机的计算能力和IO口的数量有一定要求。
因此,在编写程序的过程中,我们需要注意内存和资源的使用,避免发生卡顿或者无法正常显示的情况。
其次,点阵显示器的扫描速度要求较高,需要通过设置定时器的中断来实现,以确保显示的稳定性和清晰度。
通过本次实验,我们不仅掌握了单片机的基本原理和编程技巧,还深入了解了点阵显示器的工作原理和驱动方式。
通过自主设计和编写代码,我们成功实现了在16×16点阵上显示字符、数字和图案的功能。
这不仅加深了我们对嵌入式系统的理解,还提高了我们的动手实践能力和问题解决能力。
总之,通过这次实验,我们不仅学到了很多知识,还锻炼了自己的动手能力和团队合作能力。
虽然在实验过程中遇到了一些困难,但通过不懈努力和团队合作,我们最终取得了成功。
16×16点阵LED汉字动态显示

a f g e d c h b
实验说明:
a a a a a a a a
a
h b
bitsel(0) bitsel(7)
segment[7..0]
bitout[7..0]
16×16点阵LED汉字动态显示
4学时 学时 实验内容: 实验内容: 点阵LED动态显示自己的名字 用16×16点阵 × 点阵 动态显示自己的名字
第1行,第1列 行 列
16×16点阵显示 × 点阵显示
第1行,第16列 行 列
r0-r3
第16行,第1列 行 列
第16行,第16列 行 列
点阵LED显示器的每一行发光管的阳极接在一起作为 显示器的每一行发光管的阳极接在一起作为 点阵 数据线D,每一列发光管的阴极接在一起作为列线B, 数据线 ,每一列发光管的阴极接在一起作为列线 , 因此,要使某一点亮, 因此,要使某一点亮,就必须让该点所在的行线为高 电平,同时让该点所在的列线为低电平。 电平,同时让该点所在的列线为低电平。 实验板上点阵的各行可分别控制, 实验板上点阵的各行可分别控制, 用16个行控制信号 个行控制信号 来控制16行,使用4个列控制信号来控制 列,实验 来控制 行 使用 个列控制信号来控制16列 个列控制信号来控制 板上已经提供了一个4- 译码器 因此只使用4 译码器, 板上已经提供了一个 -16译码器,因此只使用 个信号即可控制点阵的16列 个信号即可控制点阵的 列。由于不是一个控制信号 控制一个点阵点, 控制一个点阵点,因此需要将需将欲显示的字一列一 列的显示。 列的显示。 若列控制信号r0-r3等于 “0000”,则经过 -16 例:若列控制信号 等于 ,则经过4- 译 码器后,点阵的第一列会等于‘0’。此时若同时16 码器后,点阵的第一列会等于‘ 。此时若同时 行中的某些行为‘ ,则对应的点阵会亮。 行中的某些行为‘1’,则对应的点阵会亮。
1616点阵LED显示屏的原理与制作实验报告

16*16点阵LED显示屏的原理与制作实验报告一、实验目的1.学会LED点阵模块的引脚判别,学会多块LED点阵模块的拼接使用。
2.进一步了解LED点阵的显示原理。
3.了解用单片机控制LED点阵显示字符的基本原理。
4.学会根据电路图连接电路。
二、实验内容在4块8*8LED合并而成的16*16LED显示屏上显示名字。
三、实验过程1.显示屏驱动电路原理图2.程序编写#include<reg52.h>#define CCED2 0x0000 /*吴*/unsigned char code word_zai[16][2] = {/*吴CCED2 */0x00,0x84,0x00,0x84,0x80,0x44,0xBE,0x44,0xA2,0x24,0xA2,0x14,0xA2,0x0C,0xA 2,0x07,0xA2,0x0C,0xA2,0x14,0xA2,0x24,0xBE,0x64,0x80,0xC4,0x00,0x44,0x00,0x04,0x0 0,0x00};/*"吴",0*/void main(){ char scan,i,j;P0=0;P1=0;P2=0;while(1){ scan=0;for(i=0;i<16;i++){ P1=scan;for(j=0;j<50;j++) //显示五十次{ P2=word_zai[i][0] ;P0=word_zai[i][1] ;}P0=0;P2=0;scan++;}}}四、实验总结在本次的实验里,我感觉本次实验的任务对我的挑战蛮大,因为在实验中要编写一个C语言有点麻烦,需要算的数据比较多,一不小心的话可能就会导致最后的实验结果出现问题,所以要非常的仔细才行。
基于FPGA的16×16点阵汉字显示设计

EDA课程设计题目: 16*16点阵显示器的设计班级:08电子信息工程(应电方向)院系:应用技术学院姓名:学号:实验地点:应用技术学院综合实验室指导老师:王悦善职称:讲师成绩:( 2011年6月2日 )目录1. 前言 (2)1.1本设计的研究背景和研究目的 (2)1.2LED点阵显示特点 (2)1.3FPGA设计的特点 (2)2 系统设计 (3)2.1.1设计任务与要求 (3)2.1.2 设计要求 (3)2.2设计原理 (3)2.3扫描控制模块 (3)2.4方案选择 (3)2.4.1 方案一: (3)2.4.2方案二汉字的存储 (4)2.5实现 (4)2.5.1列循环扫描 (4)2.5.2字符样式设计 (5)3. 系统调试与仿真 (8)3.1开发环境介绍 (8)3.2调试与仿真 (8)3.2.1 创建工程 (8)3.2.2 编译前设置 (8)3.2.3 全程编译 (10)3.2.4功能仿真 (10)4 结束语 (12)5 参考文献 (12)6 附录:程序 (13)1. 前言1.1 本设计的研究背景和研究目的随着我国经济的高速发展,对公共场合发布信息的需求日益增长,利用LED点阵滚动显示汉字的出现正好适应了这一市场需求,已经成为信息传播的一种重要手段。
采用传统方法设计的汉字滚动显示器,通常需要使用单片机、存储器和制约逻辑电路来进行PCB板级的系统集成。
尽管这种方案有单片机软件的支持较为灵活,但是由于受硬件资源的限制,未来对设计的变更和升级,总是难以避免要付出较多研发经费和较长投放市场周期的代价。
随着电子设计自动化(EDA)技术的进展,基于可编程FPGA器件进行系统芯片集成的新设计方法,也正在快速地到代基于PCB板的传统设计方式。
因此,本设计的研究是很有必要的,之所以基于FPGA设计是因为现场可编程门阵列(FPGA)设计周期小,灵活度高,适合用于小批量系统,提高系统的可靠性和集成度。
并且采用编写灵活的VHDL语言编写主程序。
16乘16点阵显示实验报告
实验报告实验名称: [16×16点阵显示实验] 姓名: []学号: [2011]指导教师: []实验时间: [2013年4月25日]信息与通信工程学院16×16点阵显示实验1实验要求任务1:将所给程序改正使结果为正显示;任务2:使显示四个字、八个字。
2实验原理2.1 LED显示器结构和原理1>8*8LED点阵的结构图1 8*8LED点阵结构图从图1中可以看出,8*8LED点阵共由64个发光二极管组成,每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1高电平,且某一列置0低电平,则相应的发光二极管就亮;因此要用8*8LED点阵来显示一个字符或汉字,只需要根据字符或汉字图形中的线条或笔画,通过点亮多个发光二极管来勾勒出字符或汉字的线条或笔画就行了。
当要比较完美的显示一般的汉字,单个8*8LED点阵模块很难做到,因为LED的点数(也称为像素点)不够多,因此要显示汉字的话,需要多个8*8LED点阵拼合成一个显示屏。
假如用4个8*8LED点阵模块拼成16*16的点阵,即能满足一般汉字的显示。
但要显示信息量大的图形,则需要n个多个8*8LED点阵,拼装成一个大屏幕才行。
LED点阵显示器最大的特点是亮度高、功耗较低、寿命长、容易控制等,因此它的应用很广,常用在广场、车站、商业广告等室外的显示。
2>8*8LED点阵的封装和引脚规律64个发光二极管按照行共阳、列共阴4个一组的方式封装成一个模块,这样8*8LED 点阵模块就有8行、8列共16个引脚。
其实物图如图2,电路模块符号图如图3。
图2 8*8LED点阵实物图图3 8*8LED点阵符号图但8*8LED点阵的16个引脚并不是很有规律,千万不要想象成1~8个引脚是行,9~16个引脚是列。
而且不同产品的点阵外部引脚排列规律还可能不一样。
以下是NLB1388SRA 和LDM1388SRA两个型号点阵引脚对应行、列的关系表:行号H0 H1 H2 H3 H4 H5 H6 H7引脚号9 14 8 12 1 7 2 5列号L0 L1 L2 L3 L4 L5 L6 L7引脚号13 3 4 10 6 11 15 16 假如你买到一块新的8*8LED点阵,又没有关于它的相关资料,那你只有自己用万用表或通过VCC电源串接一个510欧姆的电阻来检测了。
实验四 16X16点阵LED实验
实验四 16X16点阵LED实验一.实验目的1.了解点阵显示的原理及控制方法;2.学会使用16X16点阵LED,通过编程显示不同的字符。
二.实验原理及相关电路16X16点阵了的由16X16列共256个发光二极管紧密排在一起构成,程序控制每个像素点(发光二极管)的亮灭,就能用来显示汉字或者图形。
LED的每一行的16列发光二极管都由一个4位的16进制数来控制,从左往右由低位到高位。
将每一个字的显示都用16个16位进制数表示,称为字模。
本实验,分别控制LED灯行的动态扫描,高电平为灭低电平为点亮;用16进制数控制LED灯每一列的亮灭,高电平为亮,低电平为灭。
为了实现显示屏上字的滚动显示,则需要将所显示的字向右移,并取下一个字的最右边一位补充到显示屏的最左边,形成动态滚动的效果。
三.实验内容及程序1.用单片机的端口控制16*16点阵的行与列,在点阵LED显示屏上显示“单”。
#include <p24FJ64GA006.h>void Delayms(unsigned int del){unsigned int j;while(del--)for(j=0;j<1000;j++); } //定义Delaym函数void IOInit() //初始化端口{AD1PCFG= 0xFFFF; //全部设置为数字TRISD=TRISB= 0x0000; //D和B端口全部设为输出TRISE=TRISF= 0x0000; //E和F端口全部设为输出}int main(void){unsigned int state_E,state_F,temp_E,temp_F; IOInit();state_F = 0xFFFE; //初始化F端口状态unsigned int i=0;unsigned int dan[]={0x0410,0x0C60,0x0220,0x1FFC,0x1084,0x1FFC,0x1084,0x1084,0x1FFC,0x1084,0x0080,0x7FFF,0x0080,0x0080,0x0080,0x0080}; //单while(1){PORTD = dan[i];PORTB = dan[i]; //将字模同时赋给B和D端口PORTF = state_F; //将行状态的低8位赋给F端口低8位state_E=temp_E=temp_F=state_F;state_E <<= 8;state_E = (state_F&0xFF00)|((temp_E>>8)&0x00FF); //行状态左移8位PORTE = state_E; //将行状态高8位赋给E端口低8位Delayms( 1 );state_F <<= 1;state_F = (state_F&0xFFFE)|((temp_F>>15)&0x0001);//将行状态左移一位,动态扫描i++;if(i==16)i=0;}}显示结果:注:中间空出一行是因为PORTF的第8位为空,不影响显示效果2.在点阵LED显示屏上滚动显示“单片机实验室欢迎您”。
点阵显示实验报告
一、实验目的1. 了解点阵LED显示的基本原理与功能。
2. 掌握单片机与点阵LED显示模块的接口方法。
3. 学会编写控制点阵LED显示的软件程序。
4. 通过实验加深对数字电路、单片机应用等知识的理解。
二、实验器材1. 单片机开发板(如STC89C52)2. 16x16点阵LED模块3. 跳线4. 电阻5. 电源6. 逻辑分析仪(可选)7. 编译器及仿真软件(如Keil、Proteus等)三、实验原理点阵LED显示模块由多个LED灯组成,通过控制每个LED灯的亮灭,可以显示字符、图案等信息。
16x16点阵LED模块由16行16列的LED灯组成,共有256个LED灯。
在点阵LED显示中,通常使用单片机来控制。
单片机通过向点阵LED模块发送控制信号,实现对LED灯的亮灭控制。
控制信号包括行选信号、列选信号和段选信号。
1. 行选信号:用于选择要显示的行。
2. 列选信号:用于选择要显示的列。
3. 段选信号:用于控制LED灯的亮灭。
四、实验步骤1. 搭建电路将单片机开发板与16x16点阵LED模块连接,具体连接方式如下:- 将单片机的IO口与点阵LED模块的行选信号、列选信号和段选信号连接。
- 将点阵LED模块的正极连接到电源正极,负极连接到电源负极。
- 添加适当的限流电阻,防止LED灯过载。
2. 编写程序使用Keil等编译器编写控制点阵LED显示的软件程序。
程序主要分为以下几个部分:- 初始化IO口:将单片机的IO口设置为输出模式。
- 定义延时函数:用于控制显示速度。
- 显示函数:用于控制LED灯的亮灭,实现显示字符、图案等功能。
3. 编译程序使用编译器将编写的程序编译成目标文件。
4. 仿真或下载程序使用Proteus等仿真软件对程序进行仿真,或使用编程器将程序下载到单片机开发板上。
5. 测试通过观察点阵LED显示模块的显示效果,验证程序的正确性。
五、实验结果与分析1. 静态显示通过编写程序,可以控制点阵LED显示模块显示静态字符、图案等信息。
16x16LED点阵实验
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灯的亮暗程度有些不均匀。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA实验报告姓名:学号:指导教师:2013.6.10实验六点阵扫描显示实验一、实验原理根据硬件电路可知,点阵的控制端口由行端口和列端口组成,分别为16个,相当于256个LED灯。
要是某一个灯亮,只需使对应位置上一端为高,一端为低。
该16*16的点阵的列端口由一个74154 四位译码器控制。
由其资料可知,要使74154正常工作,其12脚、18脚与19脚必须接低。
20、21、22、23脚是数据输入端。
24脚为VCC,其他为数据输出端口。
16×16扫描LED点阵的工作原理同8位扫描数码管类似。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。
通过时钟的每列扫描显示完整汉字。
点阵LED一般采用扫描式显示,实际运用分为三种方式:(1)点扫描(2)行扫描(3)列扫描若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可。
若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。
此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
汉字显示使用的是16×16的点阵,FPGA实验箱上有其接口电路,列选信号为SEL0,SEL1,SEL2,SEL3,经4线16线译码器输出16列,从左起为第一列,列选信号是由一个4位向量SEL[3..0]控制;行选信号为H0~H15,是由16个行信号组成的,每一行由一个单独的位来控制,高电平有效。
例如“0000”表示第0列,“0000000000000001”表示第一行的点亮。
由于列是由一个向量决定,而每一时刻的值只能有一个固定的值,因而只能使某一列的若干个点亮,因此就决定了只能用逐列扫描的方法。
例如要使第一列的2,4,6,8,行亮,则列为“0001”、行为“0000000010101010”就可以实现了用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。
第一步是获得数据并保存,即在存贮器中建立汉字数据库。
第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。
获得图像数据的步骤是,先将要显示的每一幅图像画在一个如图3.3所示的被分成16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以32×16的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。
以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。
二、实验框图及原理图实验原理图实验框图三、实验程序详解1)行扫描使行扫描端口依次拉低,同时较高频率进行列扫秒module D_Z(clk,lie,hang,sel0,sel1,sel2);input clk; //时钟输入output [4:0]lie; //点阵引脚output [15:0]hang;output sel0; //扩张功能选择引脚output sel1;output sel2;reg clk_s;reg clk_ms;reg [4:0]lie;reg [15:0]hang;reg [3:0] XS_data; //显示状态reg [3:0] PY_data; //平移状态reg [31:0] XS_DIV; //显示计数reg [31:0] PY_DIV; //平移计数wire sel0;wire sel1;wire sel2;parameter CLK_XS = 'D25_000;parameter CLK_PY = 'D1_000;assign sel0 = 1'b0; //扩展功能选择点阵assign sel1 = 1'b1;assign sel2 = 1'b0;always @(posedge clk) //时钟分频产生毫秒时钟,用于点阵动态显示if(XS_DIV < CLK_XS)XS_DIV <= XS_DIV+1'b1;elsebeginXS_DIV <= 0;clk_ms <= ~clk_ms;endendalways @(posedge clk_ms) //毫秒时钟计数产生秒级时钟,用于平移beginif(PY_DIV <= CLK_PY)PY_DIV <= PY_DIV + 1;elsebeginPY_DIV <= 0;clk_s <= ~clk_s;endendalways @(posedge clk_ms) //显示一行点阵begincase(XS_data)0:beginlie = 5'b00000;XS_data = 1;end1:beginlie = 5'b00001;XS_data = 2;end2:beginlie = 5'b00010;XS_data = 3;end3:beginlie = 5'b00011;XS_data = 4;endbeginlie = 5'b00100;XS_data = 5;end5:beginlie = 5'b00101;XS_data = 6;end6:beginlie = 5'b00110;XS_data = 7;end7:beginlie = 5'b00111;XS_data = 8;end8:beginlie = 5'b01000;XS_data = 9;end9:beginlie = 5'b01001;XS_data = 10;end10:beginlie = 5'b01010;XS_data = 11;end11:beginlie = 5'b01011;XS_data = 12; end12:beginlie = 5'b01100;XS_data = 13;end13:beginlie = 5'b01101;XS_data = 14;end14:beginlie = 5'b01110;XS_data = 15;end15:beginlie = 5'b01111;XS_data = 0;enddefaultbeginlie = 5'b01111;XS_data = 0;endendcaseendalways @(posedge clk_s) //行平移,间隔1秒显示每一行begincase(PY_data)0:beginhang = 16'h0001;PY_data = 1;end1:beginhang = 16'h0002;PY_data = 2;end2:beginhang = 16'h0004;PY_data = 3;end3:beginhang = 16'h0008;PY_data = 4;end4:beginhang = 16'h0010;PY_data = 5;end5:beginhang = 16'h0020;PY_data = 6;end6:beginhang = 16'h0040;PY_data = 7;end7:beginhang = 16'h0080;PY_data = 8;end8:beginhang = 16'h0100;PY_data = 9;end9:beginhang = 16'h0200;PY_data = 10; end10:beginhang = 16'h0400;PY_data = 11;end11:beginhang = 16'h0800;PY_data = 12;end12:beginhang = 16'h1000;PY_data = 13;end13:beginhang = 16'h2000;PY_data = 14;end14:beginhang = 16'h4000;PY_data = 15;end15:beginhang = 16'h8000;PY_data = 0;enddefaultbeginhang = 16'h0000;PY_data = 0;endendcaseendendmodule2)列扫描将行端口全部拉高,同时给译码器的数据输入端口加一,每次使对应显示的行端口保持低电平,与行扫描必须同时进行扫描的字符才能显示正确。
module D_Z(clk,lie,hang,sel0,sel1,sel2);input clk; //时钟输入output [4:0]lie; //点阵引脚output [15:0]hang;output sel0; //扩张功能选择引脚output sel1;output sel2;reg clk_s;reg [4:0]lie;reg [3:0]XS_data; //显示状态reg [31:0]XS_DIV; //显示计数wire [15:0]hang;wire sel0;wire sel1;wire sel2;parameter CLK_XS = 'D25_000_000;assign sel0 = 1'b0; //扩展功能选择点阵assign sel1 = 1'b1;assign sel2 = 1'b0;assign hang = 16'b1111_1111_1111_1111;always @(posedge clk) //时钟分频,产生秒级时钟,用于平移beginif(XS_DIV < CLK_XS)XS_DIV <= XS_DIV+1'b1;elsebeginXS_DIV <= 0;clk_s <= ~clk_s;endendalways @(posedge clk_s) //间隔一秒平移显示每列begincase(XS_data)0:beginlie = 5'b00000;XS_data = 1;end1:beginlie = 5'b00001;XS_data = 2;end2:beginlie = 5'b00010;XS_data = 3;endbeginlie = 5'b00011;XS_data = 4;end4:beginlie = 5'b00100;XS_data = 5;end5:beginlie = 5'b00101;XS_data = 6;end6:beginlie = 5'b00110;XS_data = 7;end7:beginlie = 5'b00111;XS_data = 8;end8:beginlie = 5'b01000;XS_data = 9;end9:beginlie = 5'b01001;XS_data = 10;end10:beginlie = 5'b01010;XS_data = 11;end11:beginlie = 5'b01011;XS_data = 12;12:beginlie = 5'b01100;XS_data = 13;end13:beginlie = 5'b01101;XS_data = 14;end14:beginlie = 5'b01110;XS_data = 15;end15:beginlie = 5'b01111;XS_data = 0;enddefaultbeginlie = 5'b01111;XS_data = 0;endendcaseendendmodule3)显示姓名module dainzhen(clk, en, column, line, sel0, sel1, sel2,stop);input clk;input stop;output [3:0] column;output [15:0] line;reg [3:0] column;reg [15:0] line;reg[7:0] i,j,k; //定义计算用于显示具体一个点的参数output sel0;output sel1;output sel2;assign en = 0;assign sel0 = 0;assign sel1 = 1;assign sel2 = 0;reg [16:0]counter;reg clk_1;always @(posedge clk)beginif(counter[15])beginclk_1 <= ~clk_1;counter <= 0;endelsecounter <= counter + 1'b1;end//--------------------------task display; //定义任务displayreg[3:0] column_out; //行显示中间变量,可以省略reg[15:0] line_out; //列显示中间变量,可以省略begincase(i) //每一个i值进来以后,判断需要显示一个点的列坐标?0:column_out=4'h0; //1:column_out=4'h1; //2:column_out=4'h2; //4:column_out=4'h4; //5:column_out=4'h5; //6:column_out=4'h6; //7:column_out=4'h7; //8:column_out=4'h8; //9:column_out=4'h9; //10:column_out=4'ha; //11:column_out=4'hb; //12:column_out=4'hc; //13:column_out=4'hd; //14:column_out=4'he; //15:column_out=4'Hf; //endcasek=(i+j)%48; //k用取余计算来确定,使字符能够向左移动,每次移动一步case(k) //每一个k值进来以后,判断需要显示一行上面的//坐标上的数据0:line_out = 16'h2004; // 刘1:line_out = 16'h1804; //2:line_out = 16'h0924; //3:line_out = 16'hFFA4; //4:line_out = 16'h0224; //6:line_out = 16'h2224; // 7:line_out = 16'h1424; // 8:line_out = 16'h1424; // 9:line_out = 16'h0824; // 10:line_out = 16'h0824; // 11:line_out = 16'h1424; // 12:line_out = 16'h2204; // 13:line_out = 16'h4304; // 14:line_out = 16'h8114; // 15:line_out = 16'h0008; // 16:line_out = 16'h1004; // 妍17:line_out = 16'h17FE; // 18:line_out = 16'h1088; // 19:line_out = 16'h1088; // 20:line_out = 16'hFC88; // 21:line_out = 16'h2488; // 22:line_out = 16'h2488; // 23:line_out = 16'h27FE; // 24:line_out = 16'h2488; // 25:line_out = 16'h4488; // 26:line_out = 16'h2888; //27:line_out = 16'h1088; // 28:line_out = 16'h2888; // 29:line_out = 16'h4488; // 30:line_out = 16'h8108; // 31:line_out = 16'h0288; //32:line_out = 16'h0008; //玉33:line_out = 16'h7FFC; // 34:line_out = 16'h0100; // 35:line_out = 16'h0100; // 36:line_out = 16'h0100; // 37:line_out = 16'h0100; // 38:line_out = 16'h0110; // 39:line_out = 16'h3FF8; // 40:line_out = 16'h0100; // 41:line_out = 16'h0100; // 42:line_out = 16'h0140; // 43:line_out = 16'h0130; // 44:line_out = 16'h0110; // 45:line_out = 16'h0104; // 46:line_out = 16'hFFFE; // 47:line_out = 16'h0000; //endcasecolumn = column_out; //结束判断后给行输出赋值line = line_out; //结束判断后给列输出赋值endendtask//--------------------------always @(posedge clk_1 )begini=i+1; // 每个clk信号来了以后自加1if(i==16)begini=0; // 八行都显示完毕后归零if(stop)beginj=j+1;end// 同时纵向所有数据向左移动一位end //if(j==48) j=0; // 都完成移动后计数器j归零display; // 调用显示任务,clk连续不断,保持视觉暂留,形成滚动//的S字样endendmodule四、管脚分配五、实验现象1.行扫描点阵上的点逐行依次点亮2.列扫描点阵上的点逐列依次点亮3.姓名显示点阵上滚动显示姓名“刘妍玉”六、实验总结实验结果显示字符可以正常显示并在点阵上滚动,通过将扫描的行与列的管脚分别反向分配可以实现字符的镜像显示通过实验了解了点阵显示的基本原理,通过扫描的方式将存在存储器中的数据显示出来。