实验八键盘接口设计.

合集下载

键盘接口设计.doc

键盘接口设计.doc

键盘接口设计1987年,IBM推出了ps/2键盘接口标准。

该标准定义了84~101键,采用6脚mini-DIN连接器。

一般,具有五脚连接器的键盘称之为AT键盘,而具有六脚mini-DIN连接器的键盘则称之为ps/2键盘。

其实这两种连接器都只有四个脚有意义。

它们分别是Clock(时钟脚)、DATA(数据脚)、+5V(电源脚)和Ground(电源地)。

在ps/2键盘与pc 机的物理连接上只要保证这四根线一一对应就可以了。

ps/2键盘靠pc的ps/2端口提供+5V电源,另外两个脚Clock(时钟脚)和DATA(数据脚)都是集电极开路的,所以必须接大阻值的上拉电阻。

它们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。

现在比较常用的连接器如图1所示。

本实验基于FPGA用VHDL语言设计键盘接口,能够识别键盘输入的按键码,并通过实验箱上的发光灯显示接收到的数据。

PS/2协议PS/2采用11位的串行异步通信格式,这11位数据包括:起始位0、8位数据位(LSB在先)、奇校验位P、停止位1。

图2给出了键盘发送时序。

数据(KB_DAT)在时钟(KB_CLK)的上升沿改变,下降沿时有效,可被主机读取。

实验设计本实验根据PS/2协议。

识别键盘按下的按键,通过实验箱上的发光灯来显示扫描到的数据。

主要难点是要掌握PS/2的通信原理,然后再按照这个原理来识别键盘输入来的数据。

源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.all;USE IEEE.STD_LOGIC_ARITH.all;USE IEEE.STD_LOGIC_UNSIGNED.all;ENTITY keyboard ISPORT( keyboard_clk, keyboard_data:in std_logic;clock,reset, read: in std_logic;scan_code: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);scan_error: out STD_LOGIC;scan_ready: OUT STD_LOGIC);END keyboard;ARCHITECTURE a OF keyboard ISsignal in_code: STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL INCNT: std_logic_vector(3 downto 0);SIGNAL SHIFTIN : std_logic_vector(7 downto 0);SIGNAL READ_CHAR : std_logic;SIGNAL INFLAG, ready_set,parity: std_logic;SIGNAL keyboard_clk_filtered : std_logic;SIGNAL filter : std_logic_vector(7 downto 0);BEGINPROCESS (read, ready_set)BEGINIF read = '1' THENscan_ready <= '0';ELSIF ready_set'EVENT and ready_set = '1' THENscan_ready <= '1';END IF;END PROCESS;--This process filters the raw clock signal coming from the keyboard using a shift --register and two AND gates Clock_filter:PROCESSBEGINWAIT UNTIL clock'EVENT AND clock= '1';filter (6 DOWNTO 0) <= filter(7 DOWNTO 1) ;filter(7) <= keyboard_clk;IF filter = "11111111" THENkeyboard_clk_filtered <= '1';ELSIF filter= "00000000" THENkeyboard_clk_filtered <= '0';END IF;END PROCESS ;-- Clock_filter;--This process reads in serial data coming from the terminal PROCESSBEGIN WAIT UNTIL (KEYBOARD_CLK_filtered'EVENT AND KEYBOARD_CLK_filtered='0');IF RESET='1' THENINCNT <= "0000";READ_CHAR <= '0';ELSEIF KEYBOARD_DATA='0' AND READ_CHAR='0' THENREAD_CHAR<= '1'; ready_set<= '0'; parity<='1';ELSE -- Shift in next 8 data bits to assemble a scan codeIF READ_CHAR = '1' and read='0' THENIF INCNT < "1000" THENINCNT <= INCNT + 1;SHIFTIN(6 DOWNTO 0) <= SHIFTIN(7 DOWNTO 1);SHIFTIN(7) <= KEYBOARD_DATA;parity<=parity xor keyboard_data;ready_set <= '0';elsif incnt="1000" thenif parity=keyboard_data thenscan_error<='0';elsescan_error<='1';end if;incnt<=incnt+1;ELSEin_code <= SHIFTIN(7 DOWNTO 0);READ_CHAR<='0';ready_set <= '1';INCNT <= "0000";END IF;END IF;END IF;END IF;END PROCESS;-- 7 3 0 7 3 0scan_code<="01100001" when in_code="00011100"else--A"01100010" when in_code="00110010"else--B"01100011" when in_code="00100001"else--C"01100100" when in_code="00100011"else--D"01100101" when in_code="00100100"else--E"01100110" when in_code="00101011"else--F"01100111" when in_code="00110100"else--G"01101000" when in_code="00110011"else--H"01101001" when in_code="01000011"else--I"01101010" when in_code="00111011"else--J"01101011" when in_code="01000010"else--K"01101100" when in_code="01001011"else--L"01101101" when in_code="00111010"else--M"01101110" when in_code="00110001"else--N"01101111" when in_code="01000100"else--O"01110000" when in_code="01001101"else--P"01110001" when in_code="00010101"else--Q"01110010" when in_code="00101101"else--R"01110011" when in_code="00011011"else--S"01110100" when in_code="00101100"else--T"01110101" when in_code="00111100"else--U"01110110" when in_code="00101010"else--V"01110111" when in_code="00011101"else--W"01111000" when in_code="00100010"else--X"01111001" when in_code="00110101"else--Y"01111010" when in_code="00011010"else--Z "00110000" when in_code="01000101"or in_code="01110000"else--0 "00110001" when in_code="00010110"or in_code="01101001"else--1"00110010" when in_code="00011110"or in_code="01110010"else--2"00110011" when in_code="00100110"or in_code="01111010"else--3"00110100" when in_code="00100101"or in_code="01101011"else--4"00110101" when in_code="01001110"or in_code="01110011"else--5"00110110" when in_code="00110110"or in_code="01110100"else--6 "00110111" when in_code="00111101"or in_code="01101100"else--7 "00111000" when in_code="00111110"or in_code="01110101"else--8"00111001" when in_code="01000110"or in_code="01111101"else--9 in_code;END a;按键说明:Reset->117 复位read->118 扫描允许信号keyboard_clk->125 键盘输入时钟keyboard_data->126 键盘输入数据scan_code->85..96 扫描得到的数据scan_error->75 扫描出错信息scan_ready->76 扫描完毕,可以接收下一次输入了操作方法:把程序下载到实验箱后,在键盘接口处插好键盘,把时钟频率调到4MHZ(也就是28管脚的第三个针脚。

键盘接口实验

键盘接口实验

实验六键盘接口实验一、实验目的1、掌握Keil C51软件与Protues软件联合仿真调试的方法;2、掌握单片机的键盘接口电路;3、掌握单片机的键盘扫描原理;4、掌握键盘的去抖原理及处理方法。

二、实验仪器与设备1、微机一台2、Keil C51集成开发环境3、Protues仿真软件三、实验内容1、用Protues设计一矩阵键盘接口电路。

要求利用P1口接一4×4矩阵键盘。

串行口通过一74LS164接一共阴极数码管。

2. 用线反转法编写矩阵键盘识别程序,用中断方式(列线通过4输入与门74LS21接/INT0),无按键按下时数码管循环画8;有按键按下时产生中断并将按键的键值0~F通过串行口输出,在数码管上显示3秒后返回;返回后,数码管继续循环画“8”。

3.将P1口矩阵键盘改为8个独立按键(用中断方式设计),用定式扫描方式,每10ms扫描一次,其中key7每按动一次数码管显示的数字加1(从0开始),其他按键显示按键编号。

四、实验说明矩阵键盘识别一般包括以下内容:⑴判别有无键按下。

⑵键盘扫描取得闭合键的行、列号。

⑶用计算法或查表发的到键值;⑷判断闭合键是否释放,如没释放则继续等待。

⑸将闭合键的键值保存,同时转去执行该闭合键的功能。

五、实验步骤1、用Protues设计键盘接口电路;2、在Keil C51中编写键盘识别程序,编译通过后,与Protues联合调试;3、按动任意键,观察键值是否能正确显示。

六、实验电路仿真图矩阵键盘独立按键七、实验程序矩阵键盘#include<reg51.h>#define uchar unsigned char#define uint unsigned intuint m=0;count=0;bit flag=0;uchar code key_table[]={0xee,0xde,0xbe,0x7e ,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0 xbb,0x7b,0xe7,0xd7,0xb7,0x77}; uchar code table0[]={0x3f,0x06,0x5b,0x4f,0x 66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 ,0x7c,0x39,0x5e,0x79,0x71};uchar code table[]={0x00,0x01,0x21,0x61,0x6 5,0x6d,0x7d,0x7d,0x7f};void delay(uchar c){uchar a,b;for(;c>0;c--)for(a=142;a>0;a--)for(b=2;b>0;b--);}void main(){ P1=0xf0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;EX0=1;IT0=1;ET0=1;TR0=1;SCON=0x00;IP=0x02;for(m=0;m<9;m++){SBUF=table[m];delay(200);while(TI==0);TI=0;}}void INT_0() interrupt 0 {uchar t,n,i,j;P1=0xf0;if(P1!=0xf0){delay(20);if(P1!=0xf0){t=P1;P1=0x0f;j=t|P1;for(i=0;i<16;i++)if(j==key_table[i]){n=i;break;}SBUF=table0[n];while(TI==0);TI=0;}while(flag==0);P1=0xf0;}}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count>=60){count=0;flag=1;}}2.独立按键#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0x00,0x01,0x21,0x61,0x6 5,0x6d,0x7d,0x7d,0x7f};uchar code table0[]={0x3f,0x06,0x5b,0x4f,0x 66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 ,0x7c,0x39,0x5e,0x79,0x71};uint i=0,k=0,temp,m;bit flag=0;void delay(uint c){uint a,b;for(;c>0;c--)for(a=30;a>0;a--)for(b=2;b>0;b--);}void main(){ uint j;ET0=1;TR0=1;TMOD=0X01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;for(m=0;m<9;m++){SBUF=table[m];delay(200);while(TI==0);TI=0;}for(j=0;j<100;j++){if(TF0==1){TH0=(65536-10000)/256;TL0=(65536-10000)%256;TF0=0;if(P1!=0xff&&(flag==0)){temp=P1;flag=1;switch(temp){case 0xfe: SBUF=table0[0];while(TI==0);TI=0;delay(500);break;case 0xfd: SBUF=table0[1];while(TI==0);TI=0;delay(500);break;case 0xfb: SBUF=table0[2];while(TI==0);TI=0;delay(500);break;case 0xf7:SBUF=table0[3];while(TI==0);TI=0;delay(500);break;case 0xef:SBUF=table0[4];while(TI==0);TI=0;delay(500);break;case 0xdf:SBUF=table0[5];while(TI==0);TI=0;delay(500);break;case 0xbf:SBUF=table0[6];while(TI==0);TI=0;delay(500);break;case0x7f:SBUF=table0[i++];while(!TI==0)TI=0;delay(500);break;}}else if(P1==0xff) flag=0;}delay(10);}}八、实验总结1、由于对定时器扫描方式不熟悉,一开始把定时器扫描方式写成了查询方式。

实验八、8155可编程并行IO扩展接口实验.

实验八、8155可编程并行IO扩展接口实验.

实验八、8155可编程并行I/O扩展接口实验一、实验目的1.熟悉8155并行接口芯片的基本工作原理及应用2.掌握单片机与8155的接口电路设计和编程二、实验设备1.仿真器2.8155可编程并行I/O扩展接口模块3.单片机最小系统模块4.数码管动态扫描显示模块5.矩阵式键盘模块三、实验要求连接单片机最小系统、8155扩展接口实验模块、数码管动态扫描显示模块、矩阵式键盘模块,要求在键盘按下时,8位LED动态显示器上最低位显示相应的字符,以前的各位字符向高位推进1位。

四、实验原理8155芯片内包含有256字节RAM,2个8位、1个6位的可编程并行I/O口,和1个14位定时器/计数器。

由于8155既具有RAM又具有I/O口,因而是单片机系统中最常用的外围接口芯片之一。

4.1引脚说明8155共40个引脚,采用了双列直插的封装,主要引脚功能如下:◆AD7—AD0:地址数据总线;单片机和8155之间的地址、数据、命令、状态信息都是通过它来传送的。

◆CE:片选信号线,低电平有效。

◆RD:存储器读信号线,低电平有效。

◆WR:存储器写信号线,低电平有效。

◆ALE:地址及片选信号锁存信号线,高电平有效。

在下降沿时将地址及片选信号锁存到器件中。

◆IO/M:IO接口与存储器选择信号线,高电平选择I/O,低电平选择存储器。

◆PA7—PA0:A口输出/输入线。

◆PB7—PB0:B口输出/输入线。

◆PC5—PC0:C口输出/输入或控制信号线,用作控制信号时其功能如下:◆PC0:A INTR(A口中断信号线)◆PC1:A BF(A口缓冲器满信号线)◆PC2:ASTB(A 口选通线)◆PC3:B INTR(B口中断信号线)图8-1 8155引脚与逻辑图◆PC4:B BF(B口缓冲器满信号线)◆PC5:BSTB(B 口选通线)表8-1 地址与寄存器映射◆TIMER OUT:定时器/计数器输出端;◆RESET:复位信号线。

◆8155引脚与逻辑如图8-1所示。

编码式键盘接口设计实验

编码式键盘接口设计实验

一、实验目的和要求①目的:加深对VHDL语言的理解,提高对VHDL语言的应用能力,能够分析设计目标的电路特性,根据其设计合理的VHDL程序,并能在实验箱上实际操作所设计的电路,能够设计较为复杂的数字系统。

②要求:(1)在FPGA内部设计4X4编码式键盘接口,其功能是将16个按键转化为4位二进制编码(如按K0键输出0000,K1键输出0001,····,K15键输出1111),同时给出键键有效信息,每次键有效时,产生由高到低的跳变。

(2)将键值和键有效次数通过LED数码管显示。

③实验条件:(1)实验箱型号:伟福公司EDA6000实验箱(2)CPLD型号:Altera公司的EPM7128SLC84-15(3)开发环境: Quartus II +WAV2000二、基本原理三、程序流程(1)分频电路FREDIV的设计实际上是一个位二进制计数器(n的具体值由输入时钟频率确定),clk为时钟输入信号,计数器的最高位作为分频输出信号co,使其占空比为50%,本次实验分频系数为1024。

(2)列扫描计数器CNT4A的设计是一个具有使能控制的4位二进制加法计数器(3)2-4译码器DECODE的设计(4)优先编码器ENCODE的设计设I0~I3为键输入信号,低电平有效,设优先级次序I0最高,I3最低。

Y1~Y0为编辑输出,KA为键值检测信号。

(5)具有清零和保持功能的十六进制加法计数器CNT16A的设计(6)寄存器REG4的设计(7)三态缓冲器TS4的设计(8)计数器CNT4B的设计(9)LED数码管显示译码DECODERS的设计四、仿真与调试分频电路FREDIV:将发生器封装成一个元件,以便在更高层设计中调用。

列扫描计数器CNT4A:将发生器封装成一个元件,以便在更高层设计中调用。

程序代码见附页。

2-4译码器DECODE:将发生器封装成一个元件,以便在更高层设计中调用。

程序代码见附页。

单片机 键盘接口实验

单片机 键盘接口实验

实验六键盘接口实验一、实验目的1、掌握Keil C51软件与Protues软件联合仿真调试的方法;2、掌握单片机的键盘接口电路;3、掌握单片机的键盘扫描原理;4、掌握键盘的去抖原理及处理方法。

二、实验仪器与设备1、微机一台2、Keil C51集成开发环境3、Protues仿真软件三、实验内容1、用Protues设计一矩阵键盘接口电路。

要求利用P1口接一4×4矩阵键盘。

串行口通过一74LS164接一共阴极数码管。

用线反转法编写矩阵键盘识别程序,用中断方式,并将按键的键值0-F通过串行口输出,显示在数码管上。

2、将P1口矩阵键盘改成8个独立按键,重新编写识别和显示程序。

四、实验说明矩阵键盘识别一般包括以下内容:⑴判别有无键按下。

⑵键盘扫描取得闭合键的行、列号。

⑶用计算法或查表发的到键值;⑷判断闭合键是否释放,如没释放则继续等待。

⑸将闭合键的键值保存,同时转去执行该闭合键的功能。

五、实验步骤1、用Protues设计键盘接口电路;2、在Keil C51中编写键盘识别程序,编译通过后,与Protues联合调试;3、按动任意键,观察键值是否能正确显示。

六、实验电路仿真图矩阵键盘电路图见附录1。

独立按键电路图见附录2。

七、实验程序实验程序见附录3、4。

八、实验总结1、矩阵键盘常用的检测方法有线反转法、逐行扫描法。

线反转法较简单且高效。

在矩阵键盘的列线上接一与门,利用中断方式查询按键,可提高CPU的运行效率。

2、注意用线反转法扫描按键时,得到的键值不要再赋给temp,最好再设一新变量接收键值,否则再按下按键显示数字的过程中,再按按键会出现乱码。

3、学会常用与门、与非门的使用方法。

附录1:矩阵键盘实验电路图附录2:独立按键实验电路图附录3:矩阵键盘实验程序#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x92,0x82,0x82,0x80,0xff};char temp,num,i,m;int t;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; PT0=1; SCON=0;EX0=1; IT0=1; EA=1;P1=0xf0;while(1){SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400); //500msm++;if(m==9) m=0;}}void int_1() interrupt 0{P1=0xf0;if(P1!=0xf0){Delay_ms(10);if(P1!=0xf0){temp=P1;P1=0x0f;temp=temp|P1;for(i=0;i<16;i++){if(temp==KEY_TABLE[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0; TR0=1;while(flag==0); flag=0;} } P1=0xf0;}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;if(t==300){t=0; flag=1; TR0=0;}}附录4:独立按键实验#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE2[]={ 0xfe,0xfd,0xfb,0x f7, 0xef,0xdf,0xbf,0x7f,} ;char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x 92, 0x82,0x82,0x80,0xff};char temp,i,m;int t;bit ff;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; SCON=0; EX0=1;IT0=1; PT0=1; EA=1;P1=0xff;while(1){ff=IE0;SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400);m++;if(m==9) m=0;}}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;ff=IE0;if(t==300){t=0;flag=1;}}void int_0() interrupt 0{EX0=0;Delay_ms(10);temp=P1;if(temp!=0xff){for(i=0;i<8;i++){if(temp==KEY_TABLE2[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0;TR0=1; while(flag==0);flag=0; TR0=0;P1=0xff; EX0=1;}}。

实验八键盘实验Word版

实验八键盘实验Word版

实验八键盘扫描实验一、实验目的1. 掌握中断键盘扫描编程方法。

2. 掌握LED动态显示方法。

二、实验原理及实验内容1. 实验原理无论是单片机控制系统还是单片机测量系统,都需要一个人机对话装置,这种人机对话装置通常采用键盘和显示器。

键盘是单片机应用系统中人机对话常用的输入装置,而显示器是单片机应用系统人机对话中的常用输出装置。

键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。

键盘由许多键组成,而每个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。

单片机接收到按键的触点信号后作相应的功能处理。

因此对于单片机系统来说键盘接口信号是输入信号。

单片机的键盘接口分为独立式和矩阵式。

独立式键盘的每个按键都有一个信号线与单片机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。

如图7-7所示,当按下键1时,无论其它键是否按下,键1的信号线就由1变0;当松开键1时,无论其它键是否按下,键1的信号线就由0变1。

矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处,每当一个按键按下时通过该键将相应的行、列母线连通。

若在行、列母线中把行母线逐行置0(一种扫描方式),那么列母线就用来作信号输入线。

矩阵式键盘原理图如图7-8所示。

图7-7 独立式按键原理图图7-8 矩阵式按键原理图针对以上两大类键盘工作方式,单片机又有三种键盘扫描方式:查询方式;定时扫描方式和中断扫描方式。

查询方式是指在程序中用一段专门的扫描和读按键程序不停查询有无按键按下,确定键值。

这种方式电路简单,但需要占用单片机的机器时间。

定时扫描方式是指利用单片机内的定时器来产生定时中断,然后在定时中断的服务程序中扫描,检查有无按键按下,确定键值。

这种方式的电路也比较简单,不占用单片机的机器时间,但需要占用一个定时器,同时定时的时间不能过长,否则可能检测不到相应得按键。

中断扫描方式是指当有键按下时由相应的硬件电路产生中断信号,单片机在中断服务程序中扫描,检查有无按键按下,确定键值。

new 8(键盘扫描及显示)

new 8(键盘扫描及显示)

机械式薄膜式电容式霍尔效应式键盘接口电路实例:10K +5VCD E F 89A B 456701238255APA0PA1PA2PA3PC0PC1PC2PC3【分析】【键扫描过程】①②③④z 检测矩阵中是否有键压下z 消除键抖动A 口输出一个低电平C 口读入各列的值z 确定被压下键所在的行列号06(也可用其他方法得到键值)z 获取键的扫描码z 上一次压下的键是否已松开三、实验原理8255各接口及寄存器地址:8255A 方式选择控制字:89H1 0 0 0 X 0 01C口低4位I/O选择1:输入;0:输出C口高4位I/O选择1:输入;0:输出B口方式0:方式0;1:方式1B口I/O选择1:输入;0:输出A口I/O选择1:输入;0:输出A口方式00:方式001:方式11X:方式22、原理图:数码管共阴显示键扫键值平均电流约为10mA~20mA。

’F’00000111共阴数码管显示笔划码:笔划码:3FH, 06H, 5BH, 4FH, 66H, 6DH 笔划码:7DH, 07H, 7FH, 6FH, 77H, 7CH 笔划码:39H, 5EH, 79H, 71H, 00H, 0E3H4、动态显示Dp(h)¾只有一只数码管显示数值在字形口送笔划码,在字位口使显示数码管的共阴端为0,其它数码管的共阴端为1X6X5X1动态显示子程序流程框图:查表指令XLAT有按键依次检测1-4列,确定是第几行按键按下由行号,列号得键值键值送显示缓冲区按键弹起?调显示ANO YES。

接口实验报告——键盘

接口实验报告——键盘
}
void KEY_Init(void)
{ //行L4为输出
Key = 0;
IO0DIR = (IO0DIR & (~ROW1) & (~ROW2)& (~ROW3)& (~ROW4) & (~ROW5)& (~ROW6))| COL1 | COL2 | COL3 | COL4 | COL5 | COL6;
VICVectCntl0 = 0x2E;
VICVectAddr0 = (uint32)KEY_IRQ;
VICIntEnable = VICIntEnable | 0x4000;
}
int main (void) //读取键值,根据键盘值控制灯亮次数
{
uint32 i,j;
if((IO0PIN & ROW5)==0) key=23;
if((IO0PIN & ROW6)==0) key=24;
//扫描第五列
IO0CLR = COL5;
IO0SET = COL2 | COL3 | COL4 | COL1 | COL6;
if((IO0PIN & ROW1)==0) key=25;
for(j=0;j<1000000;j++);
}
Key=0;
}
}
return 0;
}
if((IO0PIN & ROW6)==0) key=12;
//扫描第三列
IO0CLR = COL3;
IO0SET = COL2 | COL1 | COL4 | COL5 | COL6;
if((IO0PIN & ROW1)==0) key=13;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八键盘接口设计与 LED 显示一.实验目的1.了解 8255A 芯片的结构,掌握 8255A 的初始化编程。

2.掌握通过 8255A 并行口读写数据的方法。

3.了解非编码键盘结构,学会读取按键的方法。

二.实验仪器及设备1. 一套 EL-MUT-III 单片机 /微机实验系统。

2. 一台微型计算机3. MCS8086软件一套。

4. 若干连接导线。

三.实验内容1.用 8255A 作为键盘接口,实验原理线路图如图 9所示。

这里,要求将 8255A 芯片的片选 8255CS 通过连接导线接至系统的片选信号 CS0。

8255各端口地址如下:端口 A 04A0H 端口 B 04A2H端口 C 04A4H 控制端口 04A6H2.运行示例程序 KB.ASM 以检查系统硬件。

3. 利用实验箱上的 8255A 可编程并行接口电路 (8255 PORT 、矩阵键盘(KEYBOARD UNIT 和 4个发光二极管(LED1~LED8中的 4个组成实验硬件电路,编写程序用行扫描法识别矩阵键盘上的闭合键 ,做到在键盘上每按一个数字键(0~F ,用发光二极管将该数字键对应的二进制代码显示出来。

注:发光二极管点亮代表数字键对应的 bit 位为 1。

四.编程提示1.在 MCS8086软件平台上编写宏汇编程序与在 MASM611环境下编写源程序在格式上稍有区别。

此平台不需要定义数据段、堆栈段, 只需要定义代码段。

数据段的内容在程序后面, code ends 之前定义即可。

代码段定义方式为 :assume cs:codecode segment public org 100hstart :. ..(程序内容code endsend start预定义方式与 MASM611的预定义方式相同,在 assume cs:code之前定义即可。

22。

图2 ‘ 0-F 数字键’在 3×8矩阵键盘中的分布位置图3.做键盘检测时要注意加延时去抖动的操作,避免一次闭合被检测为多次按键按下。

4.编写程序时,要根据操作的需要灵活地设置 8255A 的各端口的工作方式。

5.程序设计时,可将各键对应的键值(行线值、列线值放在一个表中,将要显示的 0~F 字符放在另一个表中,通过查表的方式来确定按下的是哪一个键并正确显示出来。

注:编写程序时,在 org 100h的下一行,必须写上标号 start :,否则不能通过链接。

五.硬件连接实验箱上的线路连接如表 1所示。

表 1六. EL-MUT-III 实验箱使用说明EL-MUT-III 实验箱用一根交叉串口线和微型计算机机箱相连。

将 8086CPU 模块插在实验箱右上角的插槽上(注意方向 ,同时接上实验箱的电源线。

打开电源,此时实验箱的左上角数码管应显示 1996_7,几秒钟后变化,当实验箱通过软件 (MCS 8086与计算机连接成功时变为显示 C_,当连接没有成功时,显示P_。

七.示例源程序 KB.ASM程序功能:用行翻转法识别矩阵键盘上的闭合键,做到在键盘上每按一个数字键(0~ F ,用发光二极管将该数字键对应的二进制代码显示出来。

硬件连接:PA[0..7]←→ RL[10..17], PB[0..2]←→ KA[10..12]PC[0..3]←→ LED[8..5]/ LED[4..1], 8255CS ←→ CS0源程序代码:pa equ 04a0h ; 定义端口 A 的地址pb equ 04a2h ; 定义端口 B 的地址pc equ 04a4h ; 定义端口 C 的地址pct equ 04a6h ; 定义控制端口的地址assume cs:codecode segment publicorg 100hstart : mov al,82h ; 初始化 8255A ,方式 0, A 端口输出, B 端口输入mov dx,pctout dx,almov dx,pcmov al,0ffhout dx,alwait: mov al,00hmov dx,paout dx,al ;a 端口输出 00mov dx,pbin al,dx ;b 端口获得数据cmp al,07h ; 判断是否有按键按下jz wait ; 无按键按下,等待push ax ; 有键按下,将数据压栈保护push ax ; 按键的列值存于 al ,此时压入堆栈mov cx,16eahdly: loop dly ; 延时,消抖动mov dx,pctmov al,90h ; 行反转,再次初始化 8255A ,方式 0, A 端口输入, B 端口输入出 out dx,almov dx,pbpop axout dx,al ;b 端口输出列值mov dx,pain al,dx ; 获得行值pop bx ; 将列值取出mov ah,bl ;ah 为列值mov si,offset tablemov di,offset charmov cx,16tt: cmp ax,[si] ; 比较按键值与 table 里的数据jz nn ; 相等,跳转dec cxjz start ; 没有相等的值,重新开始add si,2inc dijmp tt ; 继续查找比较nn: mov cl,[di] ; 按照输入的键值,找到相应的输出值mov al,82hmov dx,pctout dx,alwait2: mov al,00hmov dx,paout dx,al ;a 端口输出 00mov dx,pbin al,dx ; 获得列值cmp al,07h ; 判断按键是否松开jnz wait2 ; 未松开,等待mov dx,pc ; 已松开,将按键值输出not clmov al,clout dx,aljmp waittable dw 06feh,06fdh,06fbh,06f7h,06bfh,067fh,03feh,03fdh,03efh,dw 03dfh,03bfh,037fh,05fbh,05f7h,05efh,05dfhchar db 00h,01h,02h,03h,04h,05h,06h,07h,08h,09h,0ah,0bh,0ch,0dh,0eh,0fh code endsend start八.预习要求1.分析示例程序,掌握 8255A 初始化编程的方法。

2.按要求编写相应功能的键盘接口程序,要求包括以下内容:(1程序部分● 程序采用的主要算法。

● 程序框图及源程序清单。

(2硬件部分● 原理线路与实际接线图。

● 主要调试步骤及测试方案。

九.实验报告要求示例程序● 程序框图,主要算法● 测试操作与结果分析整理编写好的程序,要求包括以下内容:● 程序采用的主要算法。

● 程序框图及源程序清单。

● 原理线路、接口电路工作过程分析和实际的接线图。

● 主要调试步骤、程序功能测试方案和测试结果。

● 实验中遇到的主要问题、解决方法及其分析说明。

【附录】MCS8086软件的安装和使用一、软件的安装1、找到文件夹 MCS8086,双击 setup.exe ,开始安装。

2、点击 Yes ,下一步。

3、 User name、 Company Name随意填写, Serial Number填 123456789, 点 next 下一步。

4、此处选择安装目录,默认路径即可, Next 。

5、此处默认第一项 Typical 即可。

6、单击 Finish ,安装完成。

7、此时,桌面上会出现图示快捷方式。

二、软件的使用双击打开快捷方式 ,出现如下界面。

点击确定即可进入主界面之后,有两种方式进行操作,第一种方式是通过下图所示的菜单栏。

第二种方式是通过菜单栏下方的快捷工具栏,如下图所示:通过这两种方式实现的操作时相同的,可自行选择一种即可。

1. 新建文件选择:文件→新建,或者点击工具栏的“新建”图标,之后即可开始编辑文件。

文件保存为 .asm 格式。

2. 打开文件选择:文件→打开,或者点击工具栏的“打开”图标:选择文件,单击‘打开’ 。

3. 编译、链接文件编辑结束后, 工具栏将出现如图所示, 此时, 即可开始进行编译、链接, 这两步可以一次完成。

如图所示两种方式都可以完成。

选择之后,将出现编译、链接提示。

如果程序有错,将出现提示信息。

此时,点击程序界面,将出现红色区域提示错误所在的行。

4. 连接硬件、下载程序程序编译、链接通过后,就可以与硬件连接,下载程序了。

(此时确保实验箱与计算机已连接并加电选择:运行→连接设置。

单击‘确定’.串口选择默认的 COM1,波特率选择默认的 9600即可,如果提示失败,则修改串口(COM2/COM3 ,视实际情况而定。

设置串口后,即可通过以下两种方式中的一种进行系统复位。

在弹出的提示窗口中,单点确定,随后马上按实验箱上右下角(在 3×8键盘的下方的复位键(RST 。

此时,将提示复位成功,同时程序通过交叉串口线下载到了实验箱上的存储器中等待执行。

右下角将可看到通讯联系的提示。

同时,程序代码界面将出现如图所示绿色光带在源程序所在的第一行。

5. 程序运行程序下载完成后,即可运行程序。

如上图所示,程序运行有多种方式,可自行选择,有全速运行、单步运行、运行到光标处、从光标处开始运行、跟踪运行等。

可以通过上图所示的菜单栏选择,也可以通过单击下图所示的工具栏选择。

运行程序时,可在界面左边查看寄存器的值,对于调试程序非常方便。

6.调试方式可以选择“单步运行” ,或者“运行到光标处”运行程序,同时结合查看左边的寄存器,进行程序的调试。

提示:对程序进行修改后,须要点击——保存,再重新编译、链接,同时进行系统复位,否则修改不能生效。

相关文档
最新文档