利用键盘控制点阵进行点阵显示
- 格式:doc
- 大小:561.00 KB
- 文档页数:23
三、实验环境Logisim四、实验方法和步骤1、打开logisimPS:(可以通过file -->Prefernces --> International 帮助我们改成中文)2、Hex Digit Display(16进制数字显示)的使用在Logisim 中,Hex Digit Display(16进制数字显示)是一种数字显示组件,用于显示十六进制数字。
它通常用于显示数字的十六进制表示形式,例如0-9 和A-F。
Hex Digit Display 由一系列LED(发光二极管)组成的矩阵构成,每个LED 可以独立控制。
通过控制每个LED 的亮灭状态,可以在矩阵上显示所需的十六进制数字。
(1)Hex Digit Display(16进制数字显示)的属性(2)Hex Digit Display(16进制数字显示)的使用------ 显示自己的学号(后8位)16进制a.由于学号是十进制,所以需要转换为十六进制b.显示自己的学号(后8位)16进制3、LED Matrix(LED 点阵)的使用LED Matrix(LED 点阵)是一种数字显示组件,可以用于显示图形、字符或其他信息。
它由一系列LED(发光二极管)组成的矩阵构成,每个LED可以独立控制。
通过控制每个LED的亮灭状态,可以在矩阵上显示出所需的图案或字符。
(1)LED Matrix(LED 点阵)的属性(2)LED Matrix(LED 点阵)的使用a.LED Matrix(LED 点阵)(列)b.LED Matrix(LED 点阵)(行)4、Keyboard (键盘)和TTY(文本哑终端)的使用Keyboard(键盘)组件是一个模拟计算机键盘的输入设备。
你可以使用它来模拟按键输入,例如按下特定的键或释放键。
它可以连接到其他组件,如逻辑门或寄存器,以模拟键盘输入对电路的影响。
TTY(文本哑终端)组件是一个模拟计算机文本输出的设备,类似于显示器或终端。
单片机课程设计题目:8*8点阵汉字显示器专业班级:******姓名:******学号:*********一.摘要:用TOP-23088DH-U 8*8点阵块设计制作一个8*16点阵汉字显示器。
通过51单片机作为控制系统,由8255的A口为段数据口向两块点阵提供行数据,C口提供扫描列信息,通过74LS154译码后进行扫描,当点阵的行接高电平,列为低电平时,同时选通,则在该点的LED点亮。
由于实验箱上所提供的驱动电流太低,不足以点亮二极管,所以在电路中增加一个74LS254芯片,以提供点亮LED 所需的驱动电流。
同时在P1.0-P1.2口接3个开关,形成按键控制功能选择。
点阵模块图如下:如上图所示,本实验通过列扫描方式,扫描同时给行线送显示数据。
当扫描到某列,则该列选通,其他列截止,选通瞬间送显示数据,则所对应的二极管亮。
点阵依靠循环点亮每一列(或行),快速循环形成一屏图像,而每一屏快速交替,可进一步形成动画的效果。
二.设计任务和要求:(1)基本要求:1.能显示8*8的汉字,用两个8*8点阵,显示“大连”。
2.通过键盘控制可以改变显示的汉字与图形。
3.通过键盘控制,可以实现彩灯控制功能,发光管从内向外周期显示和相反显示。
(2)发挥要求:1.增加驱动电路,提高显示亮度。
三.方案选择和论证:3.1:方案论证:控制模块由8051、74LS154,8255组成,其中,采用51单片机制做一个最小系统,包含有时钟信号电路、复位电路等,154是4线转16线译码器,4线端接8255的PC.0-PC.3口,16线端低电平有效,控制点阵的16列,245是对列的驱动,8255的PA.0-PA.7用于将行扫描数据进行高速串-并转换,实验箱内部便可提供较大电流总够控制点阵的8行,这样,点阵的128个点中被选通的就亮。
显示模块由2块8×8点阵组成,通过相互并联转换成16×8点阵。
3.2:方案选择:(1).实验仪器(2).流程图:YNNYNYN(3).硬件连接开始不显示K1是否按下?K2是否按下?K3是否按下?静态显示“大连”动态显示“大连”(由内向外再相反显示)静态显示“爱心”(图形)四.实际操作与调试:(1)实际制作使用keil 先对软件程序进行编译测试并进行proteus 仿真,调试成功后开始硬件部分。
液晶显示器一.实验目的:1.了解全点阵图形LCD的结构和原理掌握在MSP430上如何使用外设。
2.了解LCD显示器的工作原理、种类(笔段型、点阵字符型、点阵图形)及主要性能指标。
3.掌握图形点阵LCD的编程使用方法;理解LCD显示模块命令的种类、功能及使用方法。
4.了解LCD字符生成软件的使用方法(见附录)。
二.实验内容:1.在LCD上显示Hello和中文字“南京工业大学”。
2.通过键盘控制Hello或者中文字符在LCD上左右、上下移动。
3.学会使用字符生成软件来实现任意字符代码的生成和显示。
4.其他另外可以实现的目标:使字符在按键没有松动的情况下连续移动;实现字符的循环移动,即当字符串移动到边界时仍可以移动,显示不完的部分从另一边显示出来。
三.实验原理:1.图形点阵式液晶原理液晶是一种具有规则性分子排列的有机化合物,它既不是液体也不是固体,而是介于固态和液态之间的物质。
液晶具有电光效应和偏光特性,这是它能用于显示的主要原因。
常用的液晶显示器可分成3类,分别是扭曲向列型(Twisted Nematic)、超扭曲向列型(Super TN)和彩色薄膜型。
字符点阵式属于扭曲向列型LCD。
典型的字符点阵式液晶显示器是由控制器、驱动器、字符发生器ROM、字符发生器RAM和液晶屏组成,字符由5*7 点阵或5*10点阵组成。
一般结果如图一所示:图一 128x64 点阵图形液晶模块方框示意图此次实验所用的LCD型号是RT12864CT。
12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128*64全点阵液晶显示器组成。
可完成图形显示,也可以显示8*4个(16*16)汉字。
管脚号管脚名称LEVER 管脚功能描述1 VSS 0 电源地2 VDD +5.0V 电源电压3 V0 - 液晶显示器驱动电压4 D/I(RS) H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据5 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR6 E H/ R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读DB7∽DB07 DB0 H/L 数据线8 DB1 H/L 数据线9 DB2 H/L 数据线10 DB3 H/L 数据线11 DB4 H/L 数据线12 DB5 H/L 数据线13 DB6 H/L 数据线14 DB7 H/L 数据线15 CS1 H/L H:选择芯片(右半屏)信号16 CS2 H/L H:选择芯片(左半屏)信号17 RET H/L 复位信号,低电平复位18 VOUT -10V LCD驱动负电压19 LED+ - LED背光板电源20 LED- - LED背光板电源表1:12864LCD的引脚说明128x64 点阵图形液晶模块的内部结构可分为三个部分:LCD 控制器,LCD 驱动器,LCD 显示装置。
微机课设LED点阵图形显示设计号:微机综合实践课程说明书题目:阵式图形显示控制学院:机电工程学院专业:机械设计制造及其自动化学生姓名:叶胜保学号:1000110529指导教师单位:机械制造教研室姓名:恽志东职称:副教授2013年12月30日目录一.前言 (5)二. 总体方案设计 (5)2.1 系统总框图设计 (5)2.2 元器件介绍 (7)2.3 AT89S51单片机工作原理 (7)2.4 引脚简介 (8)2.5 8x8点阵式LED (10)2.5 8x8点阵式LED图形显示原理 (11)三. 硬件设计 (13)3.1初始设计方案 (13)3.2 系统复位电路设计 (14)3.3 晶振电路设计 (16)3.4 驱动电路设计 (18)3.5 键盘 (19)3.6 最终电路原理图 (20)3.7 电路板制作 (21)3.8 元器件清单 (22)四.软件设计 (23)4.1程序流程图 (23)4.2 程序清单 (23)五.系统调试 (28)六.结论总结 (27)参考文献 (28)摘要本设计利用单片机最小系统实现在8×8点阵式LED显示“★”、“●”和心形图,通过按键来选择要显示的图形,显示时间可调(时间自定义)。
利用Keil uVision4软件编译程序,生成hex文件,经过STC_ISP_V483软件将程序烧入STC89S51。
利用Altium Designer Winter 09绘出PCB图,按图制作电路板,插入芯片连接电路板显示功能。
通过子程序的中断和调用子程序来实现图形的可选择性和时间的可调性。
另外本设计还拓展增加了数码管的显示时间的可调性,通过数码管的数字变化频率可以很明显的表示了显示时间可调的功能。
关键词:最小系统;8×8点阵式LED;STC89S51;子程序中断;调用子程序。
一.前言最小应用系统是指用最少软件组成的单片机可以工作的系统。
对52系列单片机来说,最小系统应该包括:单片机、晶振电路、复位电路。
课程设计报告课程设计名称:微机原理与接口技术系别:三系学生姓名:缪广东班级:10计本(1)学号:20100303130成绩:指导教师:巫宗宾开课时间:2012—2013 学年 1 学期一.设计题目LED显示系统设计二.主要内容课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。
它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
通过课程设计,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。
让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。
通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。
通过课程设计实践,不仅要培养学生事实求是和严肃认真的工作态度,培养学生的实际动手能力,检验学生对本门课学习的情况,更要培养学生在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。
在课程设计时,1人一组,设计报告由学生独立完成,不得互相抄袭。
教师的主导作用主要在于指明设计思路,启发学生独立设计的思路,解答疑难问题和按设计进度进行阶段审查。
学生必须发挥自身学习的主动性和能动性,主动思考问题、分析问题和解决问题,而不应处处被动地依赖指导老师。
学生在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。
学生学会掌握和使用各种已有的技术资料,不能盲目地、机械地抄袭资料,必须具体分析,使设计质量和设计能力都获得提高。
课程设计报告课程设计名称:微机原理与接口技术系别:三系学生姓名:缪广东班级:10计本(1)学号:20100303130成绩:指导教师:巫宗宾开课时间:2012—2013 学年 1 学期一.设计题目LED显示系统设计二.主要内容课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。
它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
通过课程设计,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。
让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。
通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。
通过课程设计实践,不仅要培养学生事实求是和严肃认真的工作态度,培养学生的实际动手能力,检验学生对本门课学习的情况,更要培养学生在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。
在课程设计时,1人一组,设计报告由学生独立完成,不得互相抄袭。
教师的主导作用主要在于指明设计思路,启发学生独立设计的思路,解答疑难问题和按设计进度进行阶段审查。
学生必须发挥自身学习的主动性和能动性,主动思考问题、分析问题和解决问题,而不应处处被动地依赖指导老师。
学生在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。
学生学会掌握和使用各种已有的技术资料,不能盲目地、机械地抄袭资料,必须具体分析,使设计质量和设计能力都获得提高。
一、实操考题主题:串口交互箭头方向显示器件:ESP32主控、8x8LED点阵、74HC595串口寄存器芯片(或模块)及相关器件。
要求:使用74HC595串口寄存器芯片控制8x8LED点阵显示箭头图案,通过键盘控制箭头的显示方向,详细要求如下:1、程序启动后,8x8LED点阵最外侧四边的LED灯点亮,中间区域LED灯熄灭。
2、当在串口监视器窗口输入框输入字符‘W’时,8x8LED显示向上的箭头图案,同时在串口监视器窗口打印输出“UPPER”字符串。
3、当在串口监视器窗口输入框输入字符‘Z’时,8x8LED显示向下的箭头图案,同时在串口监视器窗口打印输出“DOWN”字符串。
4、程序采用C代码编写,不得使用外部库调用。
5、未作规定处可自行处理,无明显与事实违背即可。
6、编写程序文件命名规则为:DJKS5_身份证号,考试完毕拷贝上交备案。
7、程序编写过程中不得打开库例程和其它程序,如发现,实操成绩按照0分处理。
说明:1、数组pic[]为箭头的点阵数据。
编程时可参考使用。
byte pic[8] = {0xEF, 0xC7, 0x83, 0x01, 0xEF, 0xEF, 0xEF, 0xFF}; 二、评分组成实操题总分100分,由两部分组成,分别为:电路搭设和功能呈现。
其中电路搭设分值20分,功能呈现80分。
面试官需针对以下“三、电路搭设”、“四、程序功能实现”逐条进行提问打分,如:1、请考生展示模型,有74HC595移位寄存器模块(或元器件)吗,有8x8LED 点阵吗,请指出;2、8x8LED点阵与74HC595连接了吗?3、74HC595与主控板连接了吗?按照程序功能实现依次让考生展示并评分。
三、电路搭设评分-- 总分20分本题可采用单块74HC595移位寄存器芯片、两块74HC595移位寄存器芯片或74HC595移位寄存器芯片模块进行电路搭设。
如没有采用7474HC595移位寄存器芯片,电路搭设为0分。
目录1 课程设计概述 (1)1.1设计目的 (1)1.2设计内容和要求 (1)1.3设计思路 (1)1.4系统设计 (1)1.5功能要求 (1)2 硬件开发平台 (2)3软件开发平台 (3)4硬件电路的设计 (4)4.1硬件电路的基本构成 (4)4.2硬件电路元器件 (4)4.3条形LED灯 (5)4.4硬件资源及其分配 (5)5程序设计 (7)5.1程序流程图: (7)5.2程序代码 (8)6.1运行结果描述 (10)6.2仿真结果图: (10)结论 (11)参考文献 (12)1 课程设计概述1.1设计目的1、通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。
2、通过4×4 键盘矩阵控制条形LED显示系统的设计,掌握数码管的使用方法,和简单程序的编写,最终提高我们的逻辑抽象能力[1]。
1.2设计内容和要求内容:设计一个4×4 键盘矩阵控制条形LED显示。
要求:利用单片机的矩阵键盘,条形LED显示,第几个的按键对应的几个led 灯亮。
1.3 设计思路1.先熟悉实验原理,设计8×8LED点阵屏显示数字的工作过程,以及所需要的组件。
2.通过单片机的各个引脚的输出控制8×8LED点阵屏显示数字1.4系统设计通过编写程序,实现用中断系统对8×8LED点阵屏的控制,使其每延时一段时间,LED点阵的显示数字就会进行状态转换。
采用单片机内部的I/O口上的P0和P3口可来控制LED点阵。
1.5功能要求本设计能模拟基本的LED点阵显示系统,是用中断的方式定时控制LED点阵显示的内容变换。
定时/计数器工作方式寄存器,定时器采用T0定时器0工作于模式0 位数:13位计数范围:0-8192,每累计250次定时器中断才执行一次换数。
2 硬件开发平台3软件开发平台4硬件电路的设计4. 1硬件电路的基本构成4×4键盘矩阵控制条形LED显示系统,可用单片机的矩阵键盘的输入直接控制发光二极管LED灯的。
LED点阵书写显示屏的设计摘要以ARM系列主流32位微处理器STM32为控制核心设计LED点阵书写显示屏系统。
系统主要包括主控模块、光笔模块、键盘输入模块、液晶显示模块、电源模块和32×32LED点阵屏。
系统通过键盘进行功能切换,光电三极管作为光笔的感应器件,在STM32的控制下进行信号采集,进而实现LED点阵屏的“点亮、划亮、反显、整屏擦除、笔画擦除、连写多字、对象拖移、点阵屏亮度调节、超时休眠”等功能。
经测试,系统功能齐全,响应速度快,书写流畅,各项性能指标均达到了设计要求。
Abstract:Writing Dot Matrix LED Display System is designed,which control core is ARM-series of mainstream 32-bit microprocessor of STM32.Which mainly includes Control module,Light pen module,Keyboard input module,Liquid crystal display modules,Power modules,and 32 ×32LED dot-matrix display.Function Switch is conducted by keyboard keys,a light pen sensing devices is photoelectric transistor,Under the control of the STM32 signal acquisition,LED dot-matrix screen’s function are reslized of Light,zoned light,anti-evident,and the entire screen erase,stroke erase,write continuously-word,object drag,dot-matrix screen brightness adjustment,overtime sleep,and so on.Been tested,which fully functional,fast response,writing fluency,the performance indicators have reached the design requirement.一、方案的选择和论证根据题目要求,系统可以分为几个基本模块,各模块的实现方案如下:1、控制器模块方案一:采用89C51单片机,技术成熟,调试方便,价格便宜。
按键阵列扫描及点阵显示器控制电路设计改版第一章设计指标 (2)1.1设计指标 (2)1.2 硬件环境 (2)第二章系统概述.......................................... .. (2)2.1设计思想.................................................................... (2)2.2可行性论证 (4)2.3各功能的构成 (4)2.4总体工作过程 (5)第三章单元电路设计与分析 (6)3.1各单元电路的选择 (6)3.2设计及工作原理分析 (7)第四章电路的组构与调试 (16)4.1 遇到的要紧问题 (16)4.2 现象记录及原因分析.................................................... (16)4.3 解决措施及效果 (16)4.4 功能的测试方法、步骤、设备、记录的数据 (16)第五章结束语 (17)5.1对设计题目的结论性意见及进一步改进的意向说明.............. (17)5.2 总结设计的收获与体会................................................. (18)附图(电路总图) (18)参考文献 (20)第一章、设计指标1.1设计指标设计一个按键阵列推断电路,使用发光二极管点阵显示器以12个显示符标识12个按键。
当有健按下时,显示其标识符,并保持显示符直到新的按键作用。
假如多个按键同时闭合,只响应最先作用的按键。
1.2硬件环境设计对象的实现环境与使用的FPGA开发装置有关,本节以LP—2900为例,说明使用按键阵列扫描与点阵显示器操纵电路的设计原理与实现方法。
LP—2900开发装置上有“0~9”、“*”、“#”共12个键构成的3行4列按键阵列与8行8列64个点的点阵显示器。
FPGA通过端口RK1~RK3读取键阵列的行线状态X0~X2;通过3—8线译码器操纵键阵列的列线Y0~Y3。
中北大学课程设计说明书学生姓名:田晓春学号: 0606024114学院: 电子与计算机科学技术学院专业: 微电子学题目: 利用键盘控制点阵进行十六进制加法计数显示指导教师:沈三民职称: 讲师2009年 7 月 11 日目录目录 (2)1、课程设计目的 (3)2、课程设计内容和要求 (3)2.1、设计内容 (3)2.2、设计要求 (3)3、设计方案及实现情况 (3)3.1、设计思路 (3)3.2、工作原理及框图 (4)3.3、各模块功能描述 (4)3.4、仿真结果 (8)3.5、实验箱验证情况 (22)4、课程设计总结 (23)5、参考文献 (23)1、课程设计目的1.学习操作数字电路设计实验开发系统,掌握矩阵键盘输入模块和点阵显示模块的工作原理及应用。
2.掌握组合逻辑电路、时序逻辑电路的设计方法。
3.学习掌握可编程器件设计的全过程。
2、课程设计内容和要求:2.1、设计内容利用键盘控制点阵实现十六进制加法计数,主要包括键盘控制模块、自动计数模块、功能控制模块和点阵显示模块。
2.2、设计要求1.学习掌握键盘控制模块、点阵显示模块的工作原理及应用;2. 熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;3. 仿真所编写的程序,模拟验证所编写的模块功能;4. 下载程序到芯片中,硬件验证所设置的功能,能够实现十六进制数字的显示;5. 整理设计内容,编写设计说明书。
3、设计方案及实现情况3.1、设计思路根据题目设计要求,本系统拟采用自顶向下设计方法,顶层采用原理图设计方法,将整个系统分为键盘控制(KEYBOARD)、自动计数(AUTO)、功能控制(CONTROL)、16×16点阵显示(LEDDISP)四个模块,通过对各模块编写程序实现模块功能,最后将四个模块进行综合实现整个系统的功能,通过键盘控制点阵进行十六进制加法计数显示。
3.2、工作原理及框图图1 系统整体设计原理图系统的输入信号有:开关(允许输入及显示)信号RST,系统时钟信号CLK,按键信号(KININ[3..0])。
系统的输出信号有:点阵行驱动输出信号(LEDOUT[0..15]),点阵列选信号(SEL[3..0]),进位输出信号CO。
系统的工作过程为:在开关信号RST(低电平有效)为低电平时,矩阵键盘不工作,16×16点阵没有显示;当开关信号RST为高电平时,整个系统工作,当在矩阵键盘上按下按键后,16×16点阵会显示出一个1位十六进制数,在进行功能操作时,每按下一次NEXT键时,点阵上显示的键值加1,当加到‘F’时,进位输出CO输出高电平,点亮发光二极管;当按下ENTER键时,点阵屏循环显示‘0’——‘F’键值,显示‘F’时,进位输出CO输出高电平,点亮发光二极管。
3.3、各模块功能描述(1)矩阵键盘输入模块(KEYBOARD)实验箱中4×8矩阵键盘的电路原理图如图2所示。
图2 4×8矩阵键盘电路原理图该矩阵键盘的工作原理为:扫描信号为BCOM[8..1],在BCOM[8..1]前已接有一个3-8译码器,3-8译码器的输入为SEL0~SEL2。
当3-8译码器的输入为‘000’时,即BCOM1为‘0’,其他位为‘1’,我们按下第一排第一键,此时KIN0输出‘0’,KIN1~KIN3输出全为‘1’,按下第二排第二键时,KIN1输出‘0’,其他输出‘1’;当3-8译码器输入为‘001’时,即BCOM2为‘0’,我们按下第一排第二键,此时KIN0输出‘0’,KIN1~KIN3输出全为‘1’,同理其他键依此类推。
键盘上的每个按键就是一个开关,当某键被按下时,该按键的接点会呈现‘0’状态,反之为‘1’。
扫描信号为SEL[2..0]进入3-8译码器,再从译码器输出到键盘,所以第一次只能扫描一排,依此周而复始。
若从KIN[3..0]输出的皆为‘1’时,表示没有按键按下,代表该列没有按键被按下,则不进行按键编码的操作,反之,如果有被按下时,则应将KIN[3..0]读出的值送到译码电路进行编码。
按键位置与数码的关系如下表所示:在设计该模块时,因为要实现十六进制数的显示,所以在KEYBOARD的模块中的p3进程依据上表描述了按键位置与数码的关系,实现了键盘输入输出的功能。
KOUT[4..0]为键盘扫描后的对应的译码输出;CP为时钟CLK的四分频后的输出;Q[1..0]对按下的键值进行标志:“00”表示按下‘0’——‘F’之间的键值、“01”表示按下NEXT按键、“10”表示按下ENTER按键、“11”表示按下其它按键。
键盘控制模块如图3所示。
图3 4×8矩阵键盘控制模块引脚功能图(2)十六进制自动计数模块(AUTO)该模块在CLK脉冲作用下能够实现从“00000”——“01111”之间循环加法计数,并通过DATAUTO[4..0]将计数值输出送CONTROL模块执行操作。
十六进制自动计数模块如图4所示。
图4 十六进制自动计数模块引脚功能图(3)功能控制模块(CONTROL)该模块实现对点阵显示方式的控制,控制模块的引脚功能如图5所示,其中:CLK为时钟输入端;RST为复位端,低电平有效;Q[1..0]为功能方式输入端;DATAIN[4..0]接收来自KEYBOARD模块送来的键值;DATAUTO[4..0]接收自动计数模块AUTO送来的计数值;当按下键盘上‘0’——‘F’之间的数值时,DATAOUT[4..0]输出键值码。
每当在键盘上按下一次NEXT 键时,输出的键值加1,当加到‘F’时,再次按下NEXT键时,显示为‘0’,进位输出CO为高电平,点亮一个发光二极管;当在键盘上按下ENTER键时,输出从‘0’开始到‘F’循环计数,当计数到‘F’时,进位输出CO为高电平,点亮一个发光二极管。
图5 功能控制模块引脚功能图(4)16×16点阵显示模块(LEDISP)16×16点阵显示,各驱动接口为:第一行到第十六行对应的为L0~L15,第一列到第十六列驱动采用4-16译码,对应的接口为SEL0~SEL3。
具体对应关系见下表:点阵显示接口对应关系表:图6 16×16点阵控制接口引脚功能图控制器的引脚功能图如图6所示,其中:CH[4..0]为显示十六进制数模式选择,高电平有效;LEDOUT[15..0]为行驱动信号输出;SEL [3..0]为列选信号输出。
16×16点阵工作原理为:当CHAR输入是“00000”时,要实现16×16点阵显示数字“0”,行驱动信号SEGOUT[15..0]根据实现数字图形的要求,事先已编写好各列相应的代码,列选信号SEL [3..0]按如下形式依次循环:0000—0001—0010—……—1110—1111,通过4—16译码器译码后对点阵的各列进行扫描,当某点列和行都为“1”时,该点被点亮。
同理其他数字图形显示依此类推。
3.4、仿真结果1、VHDL语言源程序(1)键盘控制模块源程序(KEYBOARD.VHD)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity keyboard isport (clk ,rst : in std_logic;kin : in std_logic_vector (3 downto 0);cp : out std_logic;q : out std_logic_vector (1 downto 0);sel : out std_logic_vector (3 downto 0);kout : out std_logic_vector (4 downto 0));end keyboard;architecture keyboard_arc of keyboard issignal counter : std_logic_vector(3 downto 0);signal counter1 : std_logic_vector(1 downto 0);signal counter2 : std_logic_vector(4 downto 0);signal colsel,Y,M : std_logic_vector(4 downto 0);signal clk1,ktest,kdown: std_logic;signal a : std_logic_vector(3 downto 0);signal b : std_logic_vector(2 downto 0);beginktest<=kin(3) and kin(2) and kin(1) and kin(0);p1: process(rst,clk)beginif(rst='0') thencounter1<="00";elsif(clk'event and clk='1') thencounter1<=counter1+1;end if;end process p1;clk1<='0' when counter1<="01" else'1';cp<=clk1;p2: process(rst,clk1,ktest)beginif(rst='0') thencounter<="0000";elsif(clk1'event and clk1='1') thenif(ktest='0') or (kdown='0') thencounter<=counter;elsecounter<=counter+1;end if;end if;end process p2;sel<=counter;p3:process(clk,ktest)begina<=kin;b<=counter(2) & counter(1) & counter(0);case b iswhen "000"=>case a iswhen "1110"=>Y<="00000"; when "1101"=>Y<="00110";when "1011"=>Y<="11111";when "0111"=>Y<="11111"; when others=>null;end case;when "001"=>case a iswhen "1110"=>Y<="00001"; when "1101"=>Y<="00111";when "1011"=>Y<="11111";when "0111"=>Y<="11111"; when others=>null;end case;when "010"=>case a iswhen "1110"=>Y<="00010";when "1101"=>Y<="11111"; when "1011"=>Y<="01100";when "0111"=>Y<="11111"; when others=>null;end case;when "011"=>case a iswhen "1110"=>Y<="00011";when "1101"=>Y<="11111";when "1011"=>Y<="01101";when "0111"=>Y<="11111";when others=>null;end case;when "100"=>case a iswhen "1110"=>Y<="11111";when "1101"=>Y<="01000";when "1011"=>Y<="01110";when "0111"=>Y<="11111";when others=>null;end case;when "101"=>case a iswhen "1110"=>Y<="11111";when "1101"=>Y<="01001";when "1011"=>Y<="01111";when "0111"=>Y<="11111";when others=>null;end case;when "110"=>case a iswhen "1110"=>Y<="00100";when "1101"=>Y<="01010";when "1011"=>Y<="10000";when others=>null;end case;when "111"=>case a iswhen "1110"=>Y<="00101";when "1101"=>Y<="01011";when "1011"=>Y<="10001";when others=>null;end case;when others=>null;end case; end process p3;p4: process(ktest,clk,rst)beginif(rst='0') thencounter2<="00000";kdown<='1';elsif(clk'event and clk='1') thenif(ktest='0') thencounter2<="00000";kdown<='0';elsif(counter2<"11110") thencounter2<=counter2+1;if(counter2="11100") thenkdown<='1';end if;end if;end if;end process p4;p5: process(kdown,rst)beginif(rst='0') thencolsel<="00000";elsif(kdown'event and kdown='1') then if(Y<"10000")thenq<="00";colsel<=Y;M<=Y;elsif(Y="10000")thenq<="01";M<=M+1;colsel<=M;elsif(Y="10001")thenq<="10";elsif(Y="11111")thenq<="11";end if;end if;end process p5;kout<=colsel;end keyboard_arc;(2) 自动计数模块源程序(AUTO.VHD)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity auto isport(clk,rst : in std_logic;datauto : out std_logic_vector(4 downto 0));end auto;architecture auto_arch of auto isbeginprocess(clk)variable cnt : integer ;variable tmp : std_logic_vector(4 downto 0) ;beginif(rst='0')thentmp:="00000";elsif( clk'event and clk='1')thenif cnt<10000 thencnt:=cnt+1;elsecnt:=0;if tmp="01111" thentmp:="00000";elsetmp:=tmp+1;end if;end if;end if;datauto<=tmp;end process ;end auto_arch;(3)功能控制模块源程序(CONTROL.VHD)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity control isport(rst,clk : in std_logic;q : in std_logic_vector(1 downto 0);datain : in std_logic_vector(4 downto 0);datauto : in std_logic_vector(4 downto 0);dataout : out std_logic_vector(4 downto 0);co : out std_logic);end control;architecture control_arc of control issignal s : std_logic_vector(4 downto 0);beginprocess(q,rst,clk,datain)beginif(rst='0')thendataout<="00000";co<='0';elsif (clk'event and clk='1') thenif (q="00") thendataout<=datain;elsif (q="01") thens<=datain;dataout<=s;if(s>"01111") thendataout<="00000";co<='1';end if;elsif (q="10")thendataout<=datauto;if(datauto="01111")thenco<='1';end if;elsif (q="11")thendataout<="11111";end if;end if;end process;end control_arc;(4) 16×16点阵显示模块(LEDDISP.VHD)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity leddisp isport(sel :in std_logic_vector(3 downto 0); ch :in std_logic_vector(4 downto 0);ledout :out std_logic_vector(15 downto 0) );end leddisp;architecture leddisp_arc of leddisp isbeginprocess(ch,sel)begincase ch iswhen "00000"=>case sel iswhen "0000" => ledout<="0000000000000000"; --0 when "0001" => ledout<="0000011111100000";when "0010" => ledout<="0000111111110000";when "0011" => ledout<="0001111111111000";when "0100" => ledout<="0011000000001100";when "0101" => ledout<="0011000000001100";when "0110" => ledout<="0011000000001100";when "0111" => ledout<="0011000000001100";when "1000" => ledout<="0011000000001100";when "1001" => ledout<="0011000000001100";when "1010" => ledout<="0011000000001100";when "1011" => ledout<="0001111111111000";when "1100" => ledout<="0000111111110000";when "1101" => ledout<="0000011111100000";when "1110" => ledout<="0000000000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "00001" =>case sel iswhen "0000" => ledout<="0000000000000000"; --1when "0001" => ledout<="0000000000000000";when "0010" => ledout<="0000000000000100";when "0011" => ledout<="0000000000000100";when "0100" => ledout<="0000000000000100";when "0101" => ledout<="0000000000000100";when "0110" => ledout<="0001111111111100";when "0111" => ledout<="0001111111111100";when "1000" => ledout<="0001111111111100";when "1001" => ledout<="0000100000000100";when "1010" => ledout<="0000100000000100";when "1011" => ledout<="0000100000000100";when "1100" => ledout<="0000000000000100";when "1101" => ledout<="0000000000000000";when "1110" => ledout<="0000000000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "00010" =>case sel iswhen "0000" => ledout<="0000000000000000"; --2when "0001" => ledout<="0000000000010000";when "0010" => ledout<="0000111000011100";when "0011" => ledout<="0001111100001100";when "0100" => ledout<="0001111110001100";when "0101" => ledout<="0001000110001100";when "0110" => ledout<="0001000011001100";when "0111" => ledout<="0001000001001100";when "1000" => ledout<="0001000001101100";when "1001" => ledout<="0001000000101100";when "1010" => ledout<="0001000000111100";when "1011" => ledout<="0001111000011100";when "1100" => ledout<="0000111000001100";when "1101" => ledout<="0000010000001100";when "1110" => ledout<="0000000000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "00011" =>case sel iswhen "0000" => ledout<="0000000000000000"; --3when "0001" => ledout<="0000000000100000";when "0010" => ledout<="0000010001111000";when "0011" => ledout<="0000111001111000";when "0100" => ledout<="0001111111011100";when "0101" => ledout<="0001101110000100";when "0110" => ledout<="0001000110000100";when "0111" => ledout<="0001000110000100";when "1000" => ledout<="0001000110000100";when "1001" => ledout<="0001000110000100";when "1010" => ledout<="0001000000000100";when "1011" => ledout<="0001110000011100";when "1100" => ledout<="0000110000011100";when "1101" => ledout<="0000110000011000";when "1110" => ledout<="0000000000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "00100" =>case sel iswhen "0000" => ledout<="0000000000000000"; --4when "0001" => ledout<="0000000000100100";when "0011" => ledout<="0000000000100100";when "0100" => ledout<="0001111111111100";when "0101" => ledout<="0001111111111100";when "0110" => ledout<="0001111111111100";when "0111" => ledout<="0000110000100100";when "1000" => ledout<="0000011000100100";when "1001" => ledout<="0000001000100100";when "1010" => ledout<="0000000100100000";when "1011" => ledout<="0000000110100000";when "1100" => ledout<="0000000011100000";when "1101" => ledout<="0000000001100000";when "1110" => ledout<="0000000000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "00101" =>case sel iswhen "0000" => ledout<="0000000000000000"; --5when "0001" => ledout<="0000000001100000";when "0010" => ledout<="0001000011110000";when "0011" => ledout<="0001000111111000";when "0100" => ledout<="0001001111011100";when "0101" => ledout<="0001001100000100";when "0110" => ledout<="0001001100000100";when "0111" => ledout<="0001001100000100";when "1000" => ledout<="0001001100000100";when "1001" => ledout<="0001001100000100";when "1010" => ledout<="0001001100000100";when "1011" => ledout<="0001111110011100";when "1100" => ledout<="0001111110111000";when "1101" => ledout<="0000000000011000";when "1110" => ledout<="0000000000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "00110" =>case sel iswhen "0000" => ledout<="0000000000000000"; --6when "0001" => ledout<="0000000001110000";when "0010" => ledout<="0000100011111000";when "0011" => ledout<="0001110111111000";when "0100" => ledout<="0001100110001100";when "0101" => ledout<="0001100100000100";when "0111" => ledout<="0001000100000100";when "1000" => ledout<="0001000100000100";when "1001" => ledout<="0001000100000100";when "1010" => ledout<="0001100110001100";when "1011" => ledout<="0000111111111000";when "1100" => ledout<="0000011111111000";when "1101" => ledout<="0000001111110000";when "1110" => ledout<="0000000011000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "00111" =>case sel iswhen "0000" => ledout<="0000000000000000"; --7when "0001" => ledout<="0001000000000000";when "0010" => ledout<="0001100000000000";when "0011" => ledout<="0001110000000000";when "0100" => ledout<="0001011000000000";when "0101" => ledout<="0001001100000000";when "0110" => ledout<="0001000111000000";when "0111" => ledout<="0001000011111100";when "1000" => ledout<="0001000001111100";when "1001" => ledout<="0001000000111100";when "1010" => ledout<="0001100000000000";when "1011" => ledout<="0001100000000000";when "1100" => ledout<="0001110000000000";when "1101" => ledout<="0000110000000000";when "1110" => ledout<="0000000000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "01000" =>case sel iswhen "0000" => ledout<="0000000000000000"; --8when "0001" => ledout<="0000010000110000";when "0010" => ledout<="0000111001111000";when "0011" => ledout<="0001111101111100";when "0100" => ledout<="0001000111000100";when "0101" => ledout<="0001000111000100";when "0110" => ledout<="0001000110000100";when "0111" => ledout<="0001000110000100";when "1000" => ledout<="0001000110000100";when "1001" => ledout<="0001000110000100";when "1011" => ledout<="0001101111001100";when "1100" => ledout<="0000111101111000";when "1101" => ledout<="0000111001111000";when "1110" => ledout<="0000000000010000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "01001" =>case sel iswhen "0000" => ledout<="0000000000000000"; --9when "0001" => ledout<="0000001111000000";when "0010" => ledout<="0000011111110000";when "0011" => ledout<="0000111111111000";when "0100" => ledout<="0001100010111000";when "0101" => ledout<="0001000011001100";when "0110" => ledout<="0001000001000100";when "0111" => ledout<="0001000001000100";when "1000" => ledout<="0001000001000100";when "1001" => ledout<="0001000001000100";when "1010" => ledout<="0001000001001100";when "1011" => ledout<="0001100011011100";when "1100" => ledout<="0000111111011100";when "1101" => ledout<="0000111110001000";when "1110" => ledout<="0000001000000000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "01010" =>case sel iswhen "0000" => ledout<="0000000000000100"; --Awhen "0001" => ledout<="0000000000000100";when "0010" => ledout<="0000000000011100";when "0011" => ledout<="0000000001111100";when "0100" => ledout<="0000000111111100";when "0101" => ledout<="0000011111100100";when "0110" => ledout<="0001111111000000";when "0111" => ledout<="0001111001000000";when "1000" => ledout<="0001100001000000";when "1001" => ledout<="0000111001000000";when "1010" => ledout<="0000011111000100";when "1011" => ledout<="0000000111100100";when "1100" => ledout<="0000000000111100";when "1101" => ledout<="0000000000001100";when "1111" => ledout<="0000000000000100";when others => null;end case;when "01011" =>case sel iswhen "0000" => ledout<="0000000000000000"; --Bwhen "0001" => ledout<="0000010001111000";when "0010" => ledout<="0000111011111000";when "0011" => ledout<="0001111111111100";when "0100" => ledout<="0001111110001100";when "0101" => ledout<="0001000110000100";when "0110" => ledout<="0001000110000100";when "0111" => ledout<="0001000110000100";when "1000" => ledout<="0001000110000100";when "1001" => ledout<="0001000110000100";when "1010" => ledout<="0001000110000100";when "1011" => ledout<="0001111111111100";when "1100" => ledout<="0001111111111100";when "1101" => ledout<="0001000000000100";when "1110" => ledout<="0001000000000100";when "1111" => ledout<="0000000000000100";when others => null;end case;when "01100" => --12case sel iswhen "0000" => ledout<="0000000000000000"; --Cwhen "0001" => ledout<="0001110000110000";when "0010" => ledout<="0001100000001000";when "0011" => ledout<="0001100000001100";when "0100" => ledout<="0001000000000100";when "0101" => ledout<="0001000000000100";when "0110" => ledout<="0001000000000100";when "0111" => ledout<="0001000000000100";when "1000" => ledout<="0001000000000100";when "1001" => ledout<="0001000000000100";when "1010" => ledout<="0001100000001100";when "1011" => ledout<="0000110000011000";when "1100" => ledout<="0000111111111000";when "1101" => ledout<="0000011111110000";when "1110" => ledout<="0000001111100000";when "1111" => ledout<="0000000000000000";when others => null;end case;when "01101" => --13case sel iswhen "0000" => ledout<="0000000000000000"; --Dwhen "0001" => ledout<="0000011111100000";when "0010" => ledout<="0000111111110000";when "0011" => ledout<="0000111111111000";when "0100" => ledout<="0001100000001100";when "0101" => ledout<="0001100000001100";when "0110" => ledout<="0001000000000100";when "0111" => ledout<="0001000000000100";when "1000" => ledout<="0001000000000100";when "1001" => ledout<="0001000000000100";when "1010" => ledout<="0001000000000100";when "1011" => ledout<="0001111111111100";when "1100" => ledout<="0001111111111100";when "1101" => ledout<="0001000000000100";when "1110" => ledout<="0001000000000100";when "1111" => ledout<="0000000000000000";when others => null;end case;when "01110" => --14case sel iswhen "0000" => ledout<="0000000000010000"; --Ewhen "0001" => ledout<="0000110000011000";when "0010" => ledout<="0001100000001100";when "0011" => ledout<="0001100000001100";when "0100" => ledout<="0001001111000100";when "0101" => ledout<="0001000110000100";when "0110" => ledout<="0001000110000100";when "0111" => ledout<="0001000110000100";when "1000" => ledout<="0001000110000100";when "1001" => ledout<="0001000110000100";when "1010" => ledout<="0001111111111100";when "1011" => ledout<="0001111111111100";when "1100" => ledout<="0001111111111100";when "1101" => ledout<="0001000000000100";when "1110" => ledout<="0000000000000100";when "1111" => ledout<="0000000000000000";when others => null;end case;when "01111" => --15case sel iswhen "0000" => ledout<="0000010000000000"; --Fwhen "0001" => ledout<="0001100000000000";。