




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录1.概述- 1 -2.89c51单片机简介- 1 -3.fpga简介- 2 -4.矩阵键盘控制系统- 3 -4.1.fpga设计框图- 3 -4.2.单片机硬件实现- 4 -4.3.键盘控制系统子模块- 4 -4.3.1 矩阵键盘原理- 4 -4.3.2 时钟分频模块- 5 -4.3.3 键盘扫描模块- 6 -4.3.4 译码转换及三态门输出模块- 6 -4.3.5 单片机及液晶显示模块部分- 7 -5.仿真及结果分析- 9 -5.1 分频模块时序仿真- 9 -5.2 键盘扫描模块- 9 -5.3 译码输出模块- 9 -5.4 单片机与液晶显示器模块- 10 -6.参考文献- 11 -致 谢- 12 -附 录- 13 -智能仪器设计大作业基于单片机和fpga的矩阵键盘控制系统设计 1. 概述随着可编程逻辑器件及eda技术的发展,在系统设计中经常会用到fpga来扩展单片机的相关资源。单片机具有性价比高、功能灵活、易于人机对话、强大的数据处理能力等特点;而fpga则具有高速、高可靠性以及开发便捷、规范等特点,因此两类器件相结合的电路结构应在许多高性能仪器仪表和电子产品中将被广泛应用。根据两者的特点,设计一种基于89c51单片机与fpga的总线接口逻辑电路,实现对机械式键盘按键的检测和译码输出。本系统主要分为四大部分:89c51芯片、fpga模块、矩阵键盘和液晶显示器。其中fpga模块主要实现与矩阵键盘接口并发信号对其扫描并得到信号等复杂的逻辑功能,89c51芯片实现将fpga芯片传来的信号并将其对其信号识别然后将其传给显示器,驱动液晶显示器显示。2. 89c51单片机简介89c51是intel公司生产的一种单片机,在一小块芯片上集成了一个微型计算机的各个组成部分。每一个单片机包括:一个8位的微型处理器cpu;一个256k的片内数据存储器ram;片内程序存储器rom;四个8位并行的i/o接口p0-p3,每个接口既可以输入,也可以输出;两个定时器/记数器;五个中断源的中断控制系统;一个全双工uart的串行i/o口;片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率是12mhz。以上各个部分通过内部总线相连接。中央处理器cpu是单片微型计算机的指挥、执行中心,由它读人用户程序,并逐条执行指令。有的指令涉及到各个寄存器之间的关系;有的指令涉及到单片机核心电路内部各功能部件之间的关系;有的则与外部器件如外部程序存储器发生联系。89c5l单片机的一个执行周期由6个状态(s1s6)组成,每个状态又持续2个振荡周期,分为p1和p2两个节拍。这样,一个机器周期由12个振荡周期组成。若采用12mhz的晶体振荡器,则每个机器周期为1us,每个状态周期为16us;在一数情况下,算术和逻辑操作发生在n期间,而内部寄存器到寄存器的传输发生在p2期间。89c5l单片机的40个引脚中有2个专用于主电源引脚,2个外接晶振的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出i/o引脚。由于单片机功能多,引脚数少,因而许多引脚具有第2功能;单片机对外呈3总线形式,由p2、p0口组成16位地址总线;由p0口分时复用作为数据总线。- 1-3. fpga简介fpga(field programmable gate array),即现场可编程门阵列,它是在pal、gal、epld等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(asic)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 fpga采用了逻辑单元阵列lca(logic cell array)这样一个新概念,内部包括可配置逻辑模块clb(configurable logic block)、输出输入模块iob(input output block)和内部连线(interconnect)三个部分。fpga的基本特点主要有: 1)采用fpga设计asic电路,用户不需要投片生产,就能得到合用的芯片; 2)fpga可做其它全定制或半定制asic电路的中试样片; 3)fpga内部有丰富的触发器和io引脚; 4)fpga是asic电路中设计周期最短、开发费用最低、风险最小的器件之一; 5) fpga采用高速chmos工艺,功耗低,可以与cmos、ttl电平兼容。 fpga是由存放在片内ram中的程序来设置其工作状态的,因此,工作时需要对片内的ram进行编程。用户可以根据不同的配置模式,采用不同的编程方式。 加电时,fpga芯片将eprom中数据读入片内编程ram中,配置完成后,fpga进入工作状态。掉电后,fpga恢复成白片,内部逻辑关系消失,因此,fpga能够反复使用。fpga的编程无须专用的fpga编程器,只须用通用的eprom、prom编程器即可。当需要修改fpga功能时,只需换一片eprom即可。这样,同一片fpga,不同的编程数据,可以产生不同的电路功能。因此,fpga的使用非常灵活。 - 2 -智能仪器设计大作业基于单片机和fpga的矩阵键盘控制系统设计4. 矩阵键盘控制系统4.1. fpga设计框图fpga电路的设计,包括对时钟进行分频,对键盘进行连续扫描,再进一步通过译码等操作,确定按键的位置,译码输出。并进一步将译码得到的8位二进制数经过一个三态门,通过中断信号和rd信号的控制,实现单片机和fpga的8位数据信号的互连。fpga总体设计框图如图4-1所示。图4-1 fpga总体设计框图4.2. 单片机硬件实现89c5l单片机接收从fpga模块传送过来的信号,并对信号进行识别,然后驱动液晶显示器显示信号所代表的按键。单片机硬件接线图如图4-2所示。图4-2 单片机硬件接线图4.3. 键盘控制系统子模块4.3.1 矩阵键盘原理矩阵键盘又叫行列式键盘。用带io口的线组成行列结构,按键设置在行列的交点上。例如用33的行列式结构可以构成9个键的键盘。这样,当按键数量平方增长时,i/o口只是线性增长,这样就可以节省i/o口。按键设置在行列线交叉点,行列线分别连接到按键开关的两端。列线通过上拉电阻接3.3v电压,即列线的输出被默认设置为高电平状态,对应的二进制代码即为1。判断键盘中有无按键按下式通过行线送入扫描信号然后从列线读取状态得到的。其方法是依次给行线送低电平,检查列线的输入。如果列线全是高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则代表低电平信号所在的行和出现低电平的列的交点处有按键按下。矩阵键盘的原理图如图4-3所示。图4-3 矩阵键盘的原理图4.3.2 时钟分频模块时钟电路主要产生系统所需要的时钟信号,由 fpga 时钟分频得到系统工作时钟,然后采用计数器分频方法得到所需要的键盘扫描信号。本次设计中循环的发送3种数值,即011,101,110。具体的分频过程是将原来的f=50mhz分频到现在的f=50hz。本程序中采用了计数器分频的思路,把一个计数周期内的约定个数定为1000000,在每次计数到约定个数的一半时,实现1、0之间的跃变。这样,就实现了对原频率1/1000000的分频。分频模块视图如图4-4所示。图4-4 分频模块视图4.3.3 键盘扫描模块键盘扫描电路用来产生键盘扫描信号,根据矩阵键盘工作原理,需要产生从第一列到第四列的周期性扫描信号。采用 verilog 硬件语言设计扫描模块。键盘扫描模块可以周期性的得到行扫描信号keydry0keydry2: 011101110011.周而复始的扫描。触发信号的周期是20ms,就是上一分频模块的的输出周期。键盘扫描模块如图4-5所示。图4-5 键盘扫描模块4.3.4 译码转换及三态门输出模块矩阵键盘所产生的扫描回复信号( 按键输入给 fpga 的信号) ,是无法直接在 fpga 内部作为信号进行使用,在使用前需要根据定义的不同功能将扫描回复信号译码为可供 fpga 识别的 bcd 编码,完成矩阵键盘输入的译码,同时区分不同按键的功能。译码电路的主要功能是: 判断是否有键按下,然后根据扫描的信号确认所按下的键是数字键还是功能键,将所按下的键编写成 bcd 码。bcd码的编码表4-1如下所示:表4-1 bcd码编码表键盘输出按键译码键盘输出按键译码011_01110001101_11060110011_10120010110_01170111011_11030011110_10181000101_01140100110_11091001101_10150101000_000无按键0000在完成bcd码转换后,要进一步通过中断控制,发送信号给单片机。并在三态门的控制作用下,实现不同状态的输出。具体即在无键盘按下时,输出为高阻状态;有键盘按下时,按相应的键码输出8位数据给单片机。在三态门的控制实现过程中,要注意,rd信号的0和1状态转换的条件,从0到1和从1到0是依据不同的变量来进行判断的。从1到0,是判断y发生变化,且当前状态不是全为1;从0到1是根据列向量keyo的状态进行判断的,一旦keyo为全1,则进行中断信号从0到1的转换。这样能够实现三态门有效的对数据输出的控制。译码输出模块如图4-6所示。图4-6 译码输出模块4.3.5 单片机及液晶显示模块部分点阵lcd的显示原理:在数字电路中,所有的数据都是以0和1保存的,对lcd控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。对于中文,将ascii表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。字模是用数字的各位信息来记载英文或汉字的形状,通过字模将汉字在屏幕上显示出来。12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及12864全点阵液晶显示器组成。可完成图形显示,也可以显示84个(1616点阵)汉字。12864lcd的引脚说明如表4-2所示。表4-2 液晶模块12864的管脚说明管脚号管脚名称lever管脚功能描述1vss0电源地2vdd+5.0v电源电压3v0-液晶显示器驱动电压4d/i(rs)h/ld/i=“h”,表示db7db0为显示数据d/i=“l”,表示db7db0为显示指令数据5r/wh/lr/w=“h”,e=“h”数据被读到db7db0r/w=“l”,e=“hl”数据被写到ir或dr6eh/lr/w=“l”,e信号下降沿锁存db7db0r/w=“h”,e=“h”ddram数据读到db7db07db0h/l数据线8db1h/l数据线9db2h/l数据线10db3h/l数据线11db4h/l数据线12db5h/l数据线13db6h/l数据线14db7h/l数据线15cs1h/lh:选择芯片(右半屏)信号16cs2h/lh:选择芯片(左半屏)信号17reth/l复位信号,低电平复位18vout-10vlcd驱动负电压19led+-led背光板电源20led-led背光板电源显示模块电路如图4-7所示,液晶模块的1管脚接电源地,15管脚用于接电源地,19管脚用于接电源地。2管脚接电源给液晶显示器供电,3管脚接电源用于提供液晶显示器显示驱动电压,17管脚接电源,20管脚接电源用与提供背景光。4管脚接单片机的p1.3用于接收数据或者指令,5管脚接单片机的p1.4选择数据被读写到什么位置,6管脚接单片机的p1.5用于提供锁存信号。图4-7 显示模块电路当fpga模块周期性地对键盘进行扫描的时候,也会周期性地给单片机发送中断信号,在单片机程序中加入中断信号比较简单,代码如下:ea=1;/打开总中断ex0=1;/打开外部中断0it0=0;/将中断0设置为电平触发然后单片机对输入管脚进行扫描,如果输入信号是0x01,单片机就驱动液晶显示器显示数字1,如果输入信号是0x02,单片机驱动液晶显示器显示数字2。- 28 -5. 仿真及结果分析5.1 分频模块时序仿真分频模块时序仿真结果如图5-1所示:图5-1分频模块时序仿真结果结果分析:如图所示,clk频率是50mhz,分频以后clk_out的周期是20ms(图中的140ms和120ms之间即为一个周期,20ms)。5.2 键盘扫描模块键盘扫描模块仿真结果如图5-2所示:图5-2键盘扫描模块仿真结果结果分析:如图所示,每过一个周期,键盘行扫描信号就变化一次,并且按照keydrv2:0:011101110011的顺序周而复始的扫描。5.3 译码输出模块译码输出结果如图5-3所示:图5-3 译码输出结果结果分析:如图所示,y17:0即为输出。如黄线所示位置,keyi_keyo为110_101,对应于键盘上的“8”。再来看输出y17:0为1111_0111,取反以后为0000_1000,对应于bcd码,也是对应着“8”。所以,仿真结果正确。即当按下相应的键时(通过相应的仿真激励来实现,即对keyo的控制),会输出相应的bcd码。在无键盘按下时,输出为高阻状态。5.4 单片机与液晶显示器模块单片机对输入管脚进行扫描,然后进行输出,可以由proteus软件对单片机程序进行仿真,仿真结果如图5-4所示,由于proteus软件对单片机模块有许多默认的输入,例如晶振电路,故没有在软件中进行连线,从而简化布局。图5-4proteus软件仿真结果6. 参考文献1 李华. mcs 251系列单片机接口技术 m. 北京:北京航天航空大学出版社,1993.2 游志宇,张洪,董秀成等. mcs251 与fpga_cpld 总线接口逻辑设计j. 单片机与嵌入式系统应用 ,2008,1 :29 - 32.3 徐志军,徐光辉. cpld/ fpga 的开发与应用 m. 北京:电子工业出版社,2002.4 郭文川.单片机原理与接口技术m. 北京:中国农业出版社,2007.5 夏宇闻. verilog数字系统设计教程m. 北京:北京航天航空大学出版社,2008.6 吴继华,王诚. 设计与验证verilog hdlm. 北京:人民邮电出版社,2006.7 栗彩霞,武一等. mcs 251单片机与fpga接口的逻辑设计j.山西电子技术,2009,5.致 谢通过这次智能仪器设计大作业基于单片机和fpga的矩阵键盘控制系统设计,我收获了许多。学习了89c51单片机的结构组成、各个组成部分的功能,并且掌握了一定的单片机编程技能;学习了verilog语言的编写规范,利用xilinx的ise工具,用verilog语言完成电路的设计;初步了解了可编程逻辑器件对硬件系统的控制,并且对89c51单片机与fpga逻辑控制和接口连接有了一定的认识。在这里要感谢曾翔君老师对我的指导。我们几个同学共同完成这个大作业,但是在机械学院我们接触单片机和fpga控制方面知识的机会较少,因此刚开始接触大作业时遇到了很多问题,曾老师都对我们的问题耐心的指导,老师渊博的知识和悉心的教导深深地感染了我们,我们衷心祝愿曾老师在未来的生活工作里,一帆风顺,心想事成!附 录1.单片机程序/lcd_12864.c/-/ 名称:12864lcd(ks0108)显示驱动程序 (不带字库)/-#include #include #define int8uunsigned char#define int16uunsigned int#definelcd_db_portp1/液晶db0-db7#define lcd_start_row0xc0/起始行#define lcd_page0xb8/页指令#define lcd_col0x40/列指令/液晶引脚定义sbitdi = p20 ;/数据/命令选择线sbitrw = p21 ;/读/写控制线sbite = p22 ;/使能控制线sbitcs1 = p23 ;/片选1sbitcs2= p24 ;/片选2sbitrst = p25 ;/复位/-/ lcd忙等待/-void lcd_busy_wait()dolcd_db_port = 0xff; /液晶端口置高电平rw = 1;_nop_();di = 0; /设置为读,选择状态寄存器e = 1;_nop_();e = 0; /e置高电平读取,随后置为低电平 while (p0 & 0x80);/-/ 向lcd发送命令/-void lcd_write_command( int8u c) lcd_busy_wait(); /液晶忙等待 lcd_db_port = 0xff; /液晶端口置高电平 rw = 0; _nop_(); di = 0; /设置为写,选择命令寄存器 lcd_db_port = c; /一字节命令放置到液晶端口 e = 1; _nop_(); e = 0; /e置高电平读取,随后置为低电平/-/ 向lcd发送数据/-void lcd_write_data(int8u d )lcd_busy_wait(); /液晶忙等待lcd_db_port = 0xff; /液晶端口置高电平rw = 0;_nop_();di = 1; /设置为写,选择数据寄存器lcd_db_port = d; /一字节数据放置到液晶端口e = 1;_nop_();e = 0; /e置高电平读取,随后置为低电平/-/ 初始化lcd/-void lcd_initialize()cs1 = 1;cs2 = 1; /左右半屏片选lcd_write_command(0x3f); / 显示开lcd_write_command(lcd_start_row); / 设置起始行/-/ 通用显示函数/ / 从第p页第l列开始显示w个字节数据,数据在r所指向的缓冲/ 每字节8位是垂直显示的,高位在下,低位在上/ 每个8*128的矩形区域为一页/ 整个lcd又由64x64的左半屏和64x64的右半屏构成/-void common_show(int8u p,int8u l,int8u w,int8u *r)int8u i;/显示在左半屏还是右半屏if( l 64)cs1 = 1;cs2 = 0;lcd_write_command(lcd_page + p);lcd_write_command(lcd_col + l);/全部显示在左半屏if( l + w 64)for( i = 0; i w; i +)lcd_write_data(ri);/如果越界则跨越左右半屏显示else/左半屏显示for(i = 0; i 64 - l; i +)lcd_write_data(ri);/右半屏显示cs1 = 0;cs2 = 1;lcd_write_command(lcd_page + p);lcd_write_command(lcd_col);for( i = 64 - l; i w; i +)lcd_write_data(ri);/全部显示在右半屏elsecs1 = 0;cs2 = 1;lcd_write_command(lcd_page + p);lcd_write_command(lcd_col + l -64);for( i = 0; i w; i +)lcd_write_data(ri);/-/ 显示一个816点阵字符/-void display_a_char(int8u p,int8u l,int8u *m)common_show( p, l, 8, m );common_show( p + 1,l, 8, m + 8 );/-/ 显示一串8x16点阵字符/-void display_a_char_string(int8u p,int8u l,int8u c,int8u *m)int8u i;for(i = 0; i c; i +)display_a_char( p, l + i * 8, m + i * 16);/main.c/-/ 名称:lgm12864(ks0108)液晶显示程序/-/ 说明:开机时系统从eprom 2764中读取画面并显示到12864lcd/-#include #include #include #define int8u unsigned char#define int16uunsigned int#define keyport p1/12864lcd相关函数void lcd_initialize();void display_a_char(int8u,int8u,int8u *);void display_a_char_string(int8u,int8u,int8u,int8u *);/void display_a_word(int8u,int8u,int8u *);/void display_a_word_string(int8u,int8u,int8u,int8u *); /void display_image(int8u,int8u,int8u,int8u,int8u * );int8u code char_1=/*- 文字: 1 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x10,0x10,0xf8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3f,0x20,0x20,0x00,0x00,;int8u code char_2=/*- 文字: 2 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,;int8u code char_3=/*- 文字: 3 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0e,0x00,;int8u code char_4=/*- 文字: 4 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x00,0xc0,0x20,0x10,0xf8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3f,0x24,0x00,;int8u code char_5=/*- 文字: 5 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0xf8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0e,0x00,;int8u code char_6=/*- 文字: 6 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0xe0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0f,0x11,0x20,0x20,0x11,0x0e,0x00,;int8u code char_7=/*- 文字: 7 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x38,0x08,0x08,0xc8,0x38,0x08,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,;int8u code char_8=/*- 文字: 8 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1c,0x22,0x21,0x21,0x22,0x1c,0x00,;int8u code char_9=/*- 文字: 9 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0xe0,0x10,0x08,0x08,0x10,0xe0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0f,0x00,;int8u code char_string = /*- 文字: l -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x20,0x20,0x20,0x20,0x20,0x20,0x00,/*- 文字: c -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0xe0,0x10,0x08,0x08,0x08,0x10,0x60,0x00,0x0f,0x10,0x20,0x20,0x20,0x10,0x0c,0x00,/*- 文字: m -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0xf8,0xe0,0x00,0x00,0x00,0xe0,0xf8,0x00,0x3f,0x00,0x0f,0x30,0x0f,0x00,0x3f,0x00,/*- 文字: 1 -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x20,0x30,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,/*- 文字: 2 -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x60,0x10,0x08,0x08,0x10,0xe0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x20,0x00,/*- 文字: 8 -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x60,0x90,0x08,0x08,0x08,0x90,0x60,0x00,0x0c,0x12,0x21,0x21,0x21,0x12,0x0c,/*- 文字: 6 -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0xe0,0x10,0x88,0x88,0x88,0x30,0x00,0x00,0x0f,0x11,0x20,0x20,0x20,0x1f,0x00,/*- 文字: 4 -*/*- 黑体12; 此字体下对应的点阵为:宽x高=8x16 -*/0x00,0x00,0x00,0xc0,0x20,0x10,0xf8,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x3f,0x04;void delay(int8u z) unsigned char x,y;for(x=z;x0;x-) for(y=110;y0;y-); void keyscan(void)switch(keyport&0xff)case 0x01:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x02:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x03:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x04:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x05:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x06:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x07:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x08:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;case 0x09:delay(5);if(keyport&63)=27)while(keyport&63)=27);/等待按键释放display_a_char_string(0,0,1,char_1);break;void int0() interrupt 0/外部中断0的服务子程序不用在声明区声明的 keyscan(); /-/ 主程序/-void main() ea=1;/打开总中断 ex0=1;/打开外部中断0 it0=0;/将中断0设置为电平触发 lcd_initialize();/display_a_word_string( 0, 0, 8, word_string);/display_a_char_string(0,0,8,char_string);p1=0x00;display_a_char_string(0,0,1,char_2);2.fpga程序/- /时钟分频模块 / file : scan_clk.v / generated : 2011-07-20 / author : wangliang /- timescale 1 ns / 1 ps module scan_clk ( clkout ,clk ,rst ); input rst ; input clk ; wire clk ; output clkout ; reg clkout_r ; parameter period= 1000000; /parameter period= 10; reg 31:0 cnt; always ( posedge clk or negedge rst) /分频50hz begin if ( !rst ) begin cnt = 311b0 ; clkout_r = 0 ; end else begin cnt 1) - 1) /设定周期时间的一半 clkout_r = #1 1b1; else if (cnt = period - 1) /设定的周期时间 begin clkout_r = #1 1b0; cnt = #1 b0; end end end assign clkout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 员工节后安全培训
- 手工布艺扎染课件
- 培训课程知识与技能目标课件
- 口红知识培训课件
- 口服液知识技能培训课件
- 2025年度农家乐旅游餐饮一体化发展规划与实施合同
- 208. 汽车租赁合同范本
- 2025年校园营养餐配送安全责任与食品安全保障合同
- 2025年度低碳住宅安装合同标准文本
- 培训获取知识的文案课件
- 医院综合门诊部综合管理体系建设
- 2025至2030年中国SCADA行业市场运行现状及投资规划建议报告
- 2025年宜昌市猇亭区招聘化工园区专职工作人员(6人)笔试备考试题及答案详解(夺冠)
- 2025年山西煤矿安全生产管理人员取证考试题库(含答案)
- 1.1 网络层次化拓扑结构设计
- GB/T 9869.2-2025橡胶用硫化仪测定硫化特性第2部分:圆盘振荡硫化仪
- 厂区参观流程规范
- 国航股份新建配餐楼项目一期工程报告表
- 鸿合交互平板一体机培训
- 保密教育培训课件内容
- 儿童A族链球菌咽扁桃体炎临床诊疗专家共识(2025)解读
评论
0/150
提交评论