实验八 键盘扫描实验

合集下载

8255键盘扫描与LED数码管显示-实验1-2

8255键盘扫描与LED数码管显示-实验1-2

读/写控 制部件
B组控制 部件
B组端口 B(8)
I/O PB7~PB0
CS
图9.9 8255编程结构
8255外部引脚

连接系统端的引线: D0~D7:数据线 CS:片选 RD:读控制 WR:写控制 RESET:复位 A1, A0:端口选择
A1 A0 0 0 0 1 1 0 1 1 选择 端口A 端口B 端口C 控制寄存器
PC
A1
A15~A19 地址 译码器
A0
PB CS
LED数码管显示屏 跳线冒 电源电路
8255并行接口 LED1 ~LED6 LED-A~LED-DP
CPU板座
3*8键盘
RL10~RL17 KA10~KA12
复位键
七、实验步骤
1、实验接线 CS0 CS8255(地址为04A0H); PA0~PA7(输入)RL10~RL17(列选择线); PB0~PB7(输出)发光二极管LED-A~LED-DP ; PC0~PC2(输出)KA10~KA12(行选择线) PC3(输出)LED1 2、编程并全速或单步运行。 3、全速运行时按动键盘,观察数码管的变化。 4、编写实验报告。
D0 ~ D7 CS RD WR RESET A1 A0
PA
PB
PC
8255外部引脚

连接外设端的引线:
PA0~PA7
D0 ~ D7 CS RD WR RESET A1 A0
PA
PB0~PB7
PC0~PC7
分别对应PA、PB、 PC三个8位输入/输 出端口
PB
三个端口可通过编程分别指 定为输入或输出口。
2.端口寻址方式
对20H端口的访问格式:直接寻址

行列键盘扫描实验

行列键盘扫描实验

实验三、行列扫描键盘实验
一、实验目的
1、学习非编码键盘的工作原理和键盘的扫描方式。

2、学习键盘的去抖方法和键盘应用程序的设计。

二、实验设备
STC15F60S2单片机实验板、串口下载线、USB连接线、电脑三、实验原理
键盘是单片机应用系统接受用户命令的重要方式。

单片机应用系统一般采用非编码键盘,需要由软件根据键扫描得到的信息产生键值编码,以识别不同的键。

本板采用4*4矩阵键盘,行信号分别为P0.4-P0.7,列信号分别为P0.0-P0.3。

具体电路连接图如图3-1所示:
图3-1所示
对于键的识别一般采用逐行(列)扫描查询法,判断键盘有无键按下,由单片机I/O口向键盘送全扫描字,然后读入列线状态来判断。

键盘的去抖方法:按键的去抖措施是必须的,可以让微机准确输入,常用方法为设计延时子程序来实现。

四、实验步骤
1、分析实验所用到的电路原理图,并了解电路工作原理。

2、画出程序流程图。

3、根据流程图编写实验程序(C语言或汇编),并完成调试。

4、按不同的键,用第二个数码管的最后两位显示按键的键值。

行列式键盘扫描

行列式键盘扫描

实验二 行列式键盘扫描一. 实验内容与目的1. 实验内容利用行列式键盘,当按下键盘中的一个键子时会在数码管上显示出相应的键值,要求键盘有去抖功能,数码管显示的键值能进行移位。

2,实验目的学会行列式键盘扫描的原理与方法,进一步强化对MSP430I/O 口使用方法的掌握,加强msp430C 语言编程的能力。

二. 方法与结果键盘扫描:利用P3口进行键盘扫描,如图,令P3.0~P3.3为输出端口,P3.4~P3.7为输入端口,由于P3.4~P3,7接了上拉电阻,所以当没有键子按下时P3.4~P3.7都为‘1’,当有键子按下时P3.4~P3.7就有可能发生变化。

所以键盘扫描式先让P3.0~P3.3都为‘0’,当有键子按下时P3.4~P3.7就会有一个由‘1’变为‘0’,根据哪一个变为‘0’就能判断出相应的列有键子按下,再让P3.0~p3.3逐个变为‘1’判断出哪一行有键子按下进而确定出哪一个键子按下。

11221112221122311224112251122611227112281122911221122#1122*1122A 1122B1122C1122DR2510k R2610kR2710kR2810kP_30P_31P_32P_33P_34P_35P_36P_37P3.0~p3.3为‘0’P3.4~p3.7都为‘1’P3.4~P3.7不都为‘1’ 令P3.0~p3.3逐个为‘1’ 确定列确定行当P3.4~p3.7都为‘1’确定键值数码管显示:数码管位选与段选共用P1.0~P1.3,利用锁存器74HC373分时进行段选和位选,P6.1和P6.2控制74HC373,从而使相应数码管显示相应数。

电路图如下:e 1d 2d p3c 4g 546b 73829f 10a 11112seg4O E 1Q 02D 03D 14Q 15Q 26D 27D 38Q 39G N D 10L E11Q 412D 413D 514Q 515Q 616D 617D 718Q 719V C C 2074HC373_174HC373O E 1Q 02D 03D 14Q 15Q 26D 27D 38Q 39G N D 10L E11Q 412D 413D 514Q 515Q 616D 617D 718Q 719V C C 2074HC373_274HC373R19100R20100R21100R22100R2310k R2410k P_61P_62VCCVCCGND GNDGND GND GNDGNDP_10P_11P_12P_13P_14P_15P_16P_17三. 实验程序#include<msp430.h> void KEYSCAN(); void TUBESCAN();void KEYSLOVE( unsigned int key); unsigned char const table[]={0xff,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0~F 码值 unsigned int s1=0,s2=0,s3=0,s4=0; //s1~s4保存相应键值,进行显示 unsigned int key;void delay1(unsigned int i) {while(i--); }void main() {WDTCTL=WDTPW+WDTHOLD; P1DIR=0xff; P1SEL=0x00; P3SEL=0x00; P3DIR=0x0f;P6DIR=BIT1+BIT2; TUBESCAN(); P3OUT=0xf0; while(1)KEYSCAN();TUBESCAN();}}void KEYSCAN(){P3OUT=0xf0;if(P3IN!=0xf0){switch(P3IN){case (0xe0):P3OUT=0x01;if(P3IN==0xf1) {key=16;break;}P3OUT=0x02;if(P3IN==0xf2) {key=12;break;}P3OUT=0x04;if(P3IN==0xf4) {key=8;break;}P3OUT=0x08;if(P3IN==0xf8) {key=4;break;}case (0xd0):P3OUT=0x01;if(P3IN==0xf1) {key=15;break;}P3OUT=0x02;if(P3IN==0xf2) {key=11;break;}P3OUT=0x04;if(P3IN==0xf4) {key=7;break;}P3OUT=0x08;if(P3IN==0xf8) {key=3;break;}case (0xb0):P3OUT=0x01;if(P3IN==0xf1) {key=14;break;}P3OUT=0x02;if(P3IN==0xf2) {key=10;break;}P3OUT=0x04;if(P3IN==0xf4) {key=6;break;}P3OUT=0x08;if(P3IN==0xf8) {key=2;break;}case (0x70):P3OUT=0x01;if(P3IN==0xf1) {key=13;break;}P3OUT=0x02;if(P3IN==0xf2) {key=9;break;}P3OUT=0x04;if(P3IN==0xf4) {key=5;break;}P3OUT=0x08;if(P3IN==0xf8) {key=1;break;}}P3OUT=0xf0;KEYSLOVE(key);} //键盘扫描函数,得到相应的键值key }void KEYSLOVE( unsigned int key){delay1(200);if(P3IN!=0xf0){while(P3IN!=0xf0) TUBESCAN(); //键盘去抖,保证当手松开时读取键值if(s4==0)s4=s3;s3=s2;s2=s1;s1=key;}else{if(key==16){s1=0;s2=0;s3=0;s4=0;key=0;}}}} //将得到的键值进行处理:移位/重置void TUBESCAN(){P6OUT=0x02;P1OUT=table[s4];P6OUT=0x04;P1OUT=0x01;delay1(400);P6OUT=0x02;P1OUT=table[s3];P6OUT=0x04;P1OUT=0x02;delay1(400);P6OUT=0x02;P1OUT=table[s2];P6OUT=0x04;P1OUT=0x04;delay1(400);P6OUT=0x02;P1OUT=table[s1];P6OUT=0x04;P1OUT=0x08;delay1(400);} //数码管扫描,使数码管保持四.行列式键盘实验总结①做行列是键盘重点是键盘扫描确定键值,键盘扫描也有多种方式,要多思考确定最优方式,采用本实验中的键盘扫描方式当没有键子按下时不必执行键盘扫描的其他程序,将更多的时间给了数码管扫描,挺优的,在着手写程序之前一定要筹划如何去写,要寻求简单易行的方法,写程序规划挺重要的。

定时器中断控制键盘扫描实验

定时器中断控制键盘扫描实验

定时器中断控制键盘扫描实验实验电路图如下:本实验用定时器1每1ms扫描一次键盘,要求按下s1键时,p3口的8位LED 正向流水点亮;按下s2键时,p3口的8位LED反向流水点亮;按下s3键时,p3口的8位LED熄灭;按下s4键时,p3口的8位LED闪烁。

实验代码:#include<reg51.h>unsigned char tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //段码表sbit S1=P1^4; //将S1位定义为P1.4引脚sbit S2=P1^5; //将S2位定义为P1.5引脚sbit S3=P1^6; //将S3位定义为P1.6引脚sbit S4=P1^7; //将S4位定义为P1.7引脚unsigned char key=0;/*流水灯延时*/void delay0(){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/*软件消抖延时*/void delay1(){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<100;j++);}/*正转*/void zheng(){int i;for(i=0;i<8;i++){P3=tab[i];delay0();}}/*反转*/void fan(){int i;for(i=7;i>=0;i--){P3=tab[i];delay0();}}/*关闭*/void close(){P3=0xff;}/*闪烁*/void shan(){P3=0xff;delay0();P3=0x00;delay0();}void main(){TMOD=0x10; //定时器1工作与状态1 EA=1; //开总中断ET1=1; //开定时器1中断TH1=(65536-1000)/256; //每1毫秒扫描一次TL1=(65536-1000)%256;TR1=1; //启动定时器1while(1){switch(key){case 1: zheng();break;case 2: fan();break;case 3: close();break;case 4: shan();break;}}}void int1() interrupt 3 using 0{P1=0xf0;TR1=0;if((P1&0xf0)!=0xf0) //判断是否有按键按下{delay1(); //用软件延时消抖if((P1&0xf0)!=0xf0) //再判断{if(S1==0)key=1;if(S2==0)key=2;if(S3==0)key=3;if(S4==0)key=4;}}TH1=(65536-1000)/256;TL1=(65536-1000)%256;TR1=1;}。

键盘扫描显示实验_汇编

键盘扫描显示实验_汇编
;;=================================================
;键盘扫描
TESTKEY: MOV A,14H
JNB ACC.2,TESTKEY1
INC 13H
INC 13H
SJMP TESTKEY2
TESTKEY1: MOV A,14H
JNB ACC.3,TESTKEY2
MOV DPTR,#0E101H
MOV A,R7
MOVX @DPTR,A
MOV A,12H
CLR C
RRC A
MOV 12H,A
MOV DPTR,#0E103H
MOVX A,@DPTR
MOV R7,A
MOV A,R7
CPL A
MOV R7,A
MOV A,R7
ANL A,#0FH
MOV 14H,A
DEC 13H
MOV A,#03H
MOVX @DPTR,A
MOV 08H,#0FFH
MOV 09H,#0FFH
MOV 0AH,#0FFH
MOV 0BH,#0FFH
MOV 0CH,#00H
MOV 0DH,#00H
WAIT1: LCALL GETKEY
LCALL MLOOP4
MOV A,R7
JZ WAIT1
LCALL KEY1
1、键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。
2、显示模块:将显示单元的内容在显示器上动态显示。
3、主程序:调用键输入模块和显示模块。
三、实验电路:
这里只是键盘草图,详细原理参见“8155键显模块”。
四、实验说明:
本实验仪提供了一个6×4的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回,如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。列扫描码还可以分时用作LED的位选通信号。

键盘扫描显示实验

键盘扫描显示实验

硬件实验九 键盘扫描显示实验一、实验要求在硬件实验六的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。

实验程序可分成三个模块。

①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。

②显示模块:将显示单元的内容在显示器上动态显示。

③主程序:调用键输入模块和显示模块。

二、实验目的1、掌握键盘和显示器的接口方法和编程方法。

2、掌握键盘扫描和LED 八段码显示器的工作原理。

三、实验电路及连线这里只是键盘草图,详细原理参见图1四、实验说明本实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。

如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。

这样就可以通过输出的列码和读取的行码来判断按下的是什么键。

在判断有键按下后,要有一定的延时,防止键盘抖动。

地址中的X 是由KEY/LED CS 决定,参见地址译码。

做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。

以便用相应的地址来访问。

例如将KEY/LED CS 信号接CS0上,则列扫描地址为08002H ,行码地址为08001H 。

列扫描码还可以分时用作LED 的位选通信号。

读回行码 (0X001H)列码 (0X002H)数据总线五、实验框图程序代码OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0 mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp ExitGoon1:mov r1, a ; 键值 = 列 X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retStart:mov sp, #40hmov LEDBuf+0, #0ffh ; 显示 8.8.8.8. mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0MLoop:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示 call GetKey ; 读入键码anl a, #0fh ; 显示键码mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopend六位LED数码显示器、4×6 键盘电路本实验仪的LED显示电路和键盘电路如图1。

eda实验 键盘扫描

2.实验程序:library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity Keyboard isport(db:inout std_logic_vector(31 downto 0);clk:in std_logic;sel_out: out std_logic_vector(7 downto 0);ga:out std_logic_vector(6 downto 0);A: IN STD_LOGIC_VECTOR(2 DOWNTO 0);Din: IN STD_LOGIC_VECTOR(3 DOWNTO 0);EN: IN STD_LOGIC;ENTER: IN STD_LOGIC);end Keyboard;architecture Keyboard_arch of Keyboard issignal sel:std_logic_vector(7 downto 0);signal data:std_logic_vector(3 downto 0);signal freq:std_logic_vector(7 downto 0); COMPONENT WORKport( A: IN STD_LOGIC_VECTOR(2 DOWNTO 0);Din: IN STD_LOGIC_VECTOR(3 DOWNTO 0);EN: IN STD_LOGIC;ENTER: IN STD_LOGIC;Dout7: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout6: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout5: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout4: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout3: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout2: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout1: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));end COMPONENT;beginfrequence:blockbeginprocess(clk)beginif clk'event and clk='1' thenfreq<=freq+1;end if;end process;sel<=freq(7 downto 0);end block frequence;U1:WORKPORT MAP(A,Din,EN,ENTER,db(31 downto 28),db(27 downto 24),db(19 downto 16),db(15 downto 12),db(11 downto 8),db(7 downto 4),db(3 downto 0));mulselect:blockbegindata<=db(31 downto 28) when sel=0 elsedb(27 downto 24) when sel=1 elsedb(23 downto 20) when sel=2 elsedb(19 downto 16) when sel=3 elsedb(15 downto 12) when sel=4 elsedb(11 downto 8) when sel=5 elsedb(7 downto 4) when sel=6 elsedb(3 downto 0);end block mulselect;sel_out<=sel;decode:blockbeginga<="1000000" when data=0 else"1111001" when data=1 else"0100100" when data=2 else"0110000" when data=3 else"0011001" when data=4 else"0010010" when data=5 else"0000010" when data=6 else"1111000" when data=7 else"0000000" when data=8 else"0010000" when data=9 else"1111111" when data=10 else"1111111" when data=11 else"1111111" when data=12 else"1111111" when data=13 else"1111111" when data=14 else"1111111";end block decode;keyscan:block ----------键值输出电路部分signal ount:std_logic_vector(18 downto 0);signal key_precess:std_logic;signal move:std_logic;signal key_data:std_logic_vector(3 downto 0);signal kxy:std_logic_vector(5 downto 0);beginkey_pressed<='1'when col="111" else '0'key<=sel&col;process (clk,key_pressed)beginif clk'event and clk='1' thenif key_pressed='0' thencase key iswhen "000011"=> data<="0001";when "000101"=> data<="0010";when "000110"=> data<="0011";when "001011"=> data<="0100";when "001101"=> data<="0101";when "001110"=> data<="0110";when "010011"=> data<="0111";when "010101"=> data<="1000";when "010110"=> data<="1001";when "011011"=> data<="1010";when "011101"=> data<="1011";when "011110"=> data<="1100";when others=>null;end case;end if;end if;end process;process(key_pressed)beginif clk'event and clk='1' thenif key_pressed='0' then count<=(others=>'0');move<='0';elseif count="111111111111111111" then move<='1';count<=(other=>'0'); else count<=count+1;end if;end if;end if;end process;process(move)beginif move'event and move='1' then key_data<=data;end if;end process;end block keyscan;end Keyboard_arch;3.实验结果。

微机原理键盘扫描及显示完整实验报

实验9键盘扫描及显示实验
实验时间2019年12月18日
实验类型■验证性□设计性□综合性
1.实验目的
了解键盘扫描及数码显示的基本原理,熟悉8255的编程。

2.实验内容及过程(主要内容、操作步骤)
将8255单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。

键盘采用4X4键盘,每个数码管显示值可为0~F 共16个数。

实验具体内容如下:将键盘进行编号,记作0~F,当按下其中-一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近4次按下的按键编号。

3.测试数据及实验结果
4.实验分析及总结(主要考察内容)
通过本次实验,我理解了键盘扫描及数码显示的基本原理,通过理解分析程序,自己对程序进行了一些总结和修改,并进行了验证,进一步掌握了微机接口的学习方法。

教师评阅
评价指标:实验目的、操作步骤、设计、算法、程序结构、实验结果、实验分析、实验总结
1/ 1。

任务八查询式键盘实训


五、归纳总结 六、作业 完成查询式键盘实训报告
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一)
三、学生实训 1.严格遵守实验室的使用要求 2.禁止带电操作
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一) 四、考核评价 1.以小组为单位 学生互评,教师点评。 2.考核标准见右图
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一)
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一)
具体任务:每次按键显示相应的数字
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一)
教学目的: 1.熟悉软件的使用方法 2.认识查询式键盘的编程方法
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一)
教学重点:查询式键盘的编程方法 教学难点:查询式键盘的编程方法
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一)
教学内容:1.电路讲解 2.查询式键盘的编程方法讲解 3.学生实训
情境二
单片机硬件电路的扩展
任务八 查询式键盘实训(一)
一、电路讲解 提出问题:电路如何搭建?任务八 查询式键盘实训(一)
二、查询式键盘的编程 提出问题:如何编程? 教师讲解

DSP-矩阵键盘扫描实验

班级学号姓名同组人实验日期室温大气压成绩实验五矩阵键盘扫描实验一、实验目的1、掌握键盘信号的输入,DSP I/O的使用;2、掌握键盘信号之间的时序的正确识别和引入。

二、实验设备1、一台装有CCS2000软件的计算机;2、插上2812主控板的DSP实验箱;3、DSP硬件仿真器。

三、实验原理实验箱上提供一个 4 * 4的行列式键盘。

TMS320F2812的8个I / O口与之相连,这里按键的识别方法是扫描法。

当有键被按下时,与此键相连的行线电平将由此键相连的列线电平决定,而行线的电平在无法按键按下时处于高电平状态。

如果让所有的列线也处于高电平,那么键按下与否不会引起行线电平的状态变化,始终为高电平。

所以,在让所有的列线处于高电平是无法识别出按键的。

现在反过来,让所有的列线处于低电平,很明显,按键所在的行电平将被拉成低电平。

根据此行电平的变化,便能判断此行一定有按键被按下,但还不能确定是哪个键被按下。

假如是5键按下,为了进一步判定是哪一列的按键被按下,可在某一时刻只让一条列线处于低电平,而其余列线处于高电平。

那么按下键的那列电平就会拉成低电平,判断出哪列为低电平就可以判断出按键号码。

模块说明:此模块共有两种按键,KEY1—KEY4是轻触按键,在按键未按下时为高电平输入FPGA,当按键按下后对FPGA输入低电平,松开按键后恢复高电平输入,KEY5—KEY8是带自锁的双刀双掷开关,在按键未按下时是低电平,按键按下时为高电平并且保持高电平不变,只有再次按下此按键时才恢复低电平输入。

每当按下一个按键时就对FPGA就会对此按键进行编码,KEY1—KEY8分别对应的是01H、02H、03H、04H、05H、06H、07H、08H。

在编码的同时对DSP产生中断INT1,这个时候DSP就会读取按键的值,具体使用方法可以参考光盘例程key,prj。

实验流程图:1、把2812 模块小板插到大板上;打开液晶模块的电源开关;2、按下键盘按键,液晶会显示所按键的号码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八 键盘扫描实验 一、实验目的 1. 掌握中断键盘扫描编程方法。 2. 掌握LED动态显示方法。

二、实验原理及实验内容

1. 实验原理 无论是单片机控制系统还是单片机测量系统,都需要一个人机对话装置,这种人机对话装置通常采用键盘和显示器。键盘是单片机应用系统中人机对话常用的输入装置,而显示器是单片机应用系统人机对话中的常用输出装置。 键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。键盘由许多键组成,而每个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。单片机接收到按键的触点信号后作相应的功能处理。因此对于单片机系统来说键盘接口信号是输入信号。 单片机的键盘接口分为独立式和矩阵式。独立式键盘的每个按键都有一个信号线与单片机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。如图7-7所示,当按下键1时,无论其它键是否按下,键1的信号线就由1变0;当松开键1时,无论其它键是否按下,键1的信号线就由0变1。 矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处,每当一个按键按下时通过该键将相应的行、列母线连通。若在行、列母线中把行母线逐行置0(一种扫描方式),那么列母线就用来作信号输入线。矩阵式键盘原理图如图7-8所示。

图7-7 独立式按键原理图 图7-8 矩阵式按键原理图 针对以上两大类键盘工作方式,单片机又有三种键盘扫描方式:查询方式;定时扫描方式和中断扫描方式。 查询方式是指在程序中用一段专门的扫描和读按键程序不停查询有无按键按下,确定键值。这种方式电路简单,但需要占用单片机的机器时间。 定时扫描方式是指利用单片机内的定时器来产生定时中断,然后在定时中断的服务程序中扫描,检查有无按键按下,确定键值。这种方式的电路也比较简单,不占用单片机的机器时间,但需要占用一个定时器,同时定时的时间不能过长,否则可能检测不到相应得按键。 中断扫描方式是指当有键按下时由相应的硬件电路产生中断信号,单片机在中断服务程序中扫描,检查有无按键按下,确定键值。这种方式硬件电路上必须要产生中断线,需要与门和非门来产生。但中断方式不占用单片机的机器时间,也不会出现定时方式时的检测不到键盘的情况。 另外,在扫描键盘时需处理键盘抖动问题,称为去抖。一般去抖可以采用软件方式完成,操作方法是,当检测到有键按下时,等待10ms左右时间,如果此按键仍然保持按下的状态,这是确认此按键,如果在100ms内连续检测到此按键按下,则不确认第二次按下的键。 本实验系统中的键盘在硬件上采用查询方式工作,键盘采用矩阵键盘有16个按键,见第六章实验箱硬件资料。

2.实验内容 a. 根据流程图在Keil编译环境下编写程序,生成*.HEX文件,要求是任意按下键盘,要求能在LED上将按下的键对于的十六进制数显示出来。 b. 通过ISP软件将生成的*.HEX文件下载到单片机当中。 c. 将K1拨动开关打到“on”的位置,离线运行程序,观察实验现象,是否满足要求。不满足实验要求时,检查实验代码。

三、参考程序 汇编程序: FKEY EQU 20H.0 /*按键标志*/ KEYNUM EQU 30H /*按键编号变量*/ ORG 0000H AJMP MAIN MAIN: ACALL KEYET MOV @R0,A MOV A,@R0 MOV P0,A AJMP MAIN 图7-9键盘扫描 TABLE: /*字型数据数组*/ DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H DB 0C6H,0A1H,86H,8EH

KEYET: CLR FKEY /*清除按键标志*/ ACALL SCAN /*执行按键扫描*/ JB FKEY,G1 /*测试按键标志*/ AJMP KEYET /*若没有按键则等待按键*/ DELAY: /*延迟子程序*/ MOV R6,#50 /*总延迟时间R5*10 ms*/ D1: MOV R7,#100

开始初始化

数码管显示取键值键盘扫描

延时返回 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,DELAY RET G1: ACALL SCAN /*执行按键扫描*/ JB FKEY,G1 /*等待按键放开*/ MOV A,KEYNUM MOV DPTR,#TABLE /*找出按键码*/ MOVC A,@A+DPTR RET SCAN: /*键盘扫描控制程序*/ MOV R3,#0FEH /*加载扫描输出信号初值11111110B*/ MOV R4,#0 /*按键计数标号清除为0*/ MOV R1,#4 /*循环1执行4次*/ CLR PSW.5 /*PSW.5=0表示未按键*/ L1: MOV A,R3 MOV P2,A /*由P2口送出扫描输出信号*/ MOV R5,#1 ACALL DELAY MOV A,P2 /*读取P2数据以便判断是否有按键*/ ANL A,#0F0H MOV R2,#4 L2: JB ACC.4,N1 /*累加器A位4若为1表示没按键*/ MOV KEYNUM,R4 /*加载按键编号*/ SETB PSW.5 /*按键标志设为1*/ N1: INC R4 /*按键编号加1*/ RR A /*检查下一位*/ DJNZ R2,L2 MOV A,R3 /*加载旧的扫描码*/ RL A MOV R3,A DJNZ R1,L1 BACK: JNB PSW.5,NO_KEY /*设置是否按键*/ SETB FKEY /*若有按键FKEY=1*/ RET NO_KEY: CLR FKEY RET END C语言程序: #include #define uchar unsigned char #define unit unsigned int void delay(); uchar keyscan(); unit j,h; void main() { uchar key; P1=0xff; /*数码管使能*/

while (1) { key=keyscan(); /*键盘值返回*/ delay(); switch(key) /*判断键值*/ { case 0xee:P0=0xc0; break; /*0~F的键值*/ case 0xde:P0=0xf9; break; case 0xbe:P0=0xa4; break; case 0x7e:P0=0xb0; break; case 0xed:P0=0x99; break; case 0xdd:P0=0x92; break; case 0xbd:P0=0x82; break; case 0x7d:P0=0xf8; break; case 0xeb:P0=0x80; break; case 0xdb:P0=0x90; break; case 0xbb:P0=0x88; break; case 0x7b:P0=0x83; break; case 0xe7:P0=0xc6; break; case 0xd7:P0=0xa1; break; case 0xb7:P0=0x86; break; case 0x77:P0=0x8e; break; case 0x00:P0=0xc1; break; } } } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ void delay() /*延时*/ { unsigned int i; for(i=8000;i>0;i--); } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ uchar keyscan() /*键盘扫描*/ { while(1) { P2=0xff; /*P2口拉高*/ P2=0xfe; /*第一行置低*/ if ((P2&0xff)!=0xfe) //判断是否有键按下 { delay(); /*去抖动*/ if((P2&0xff)!=0xfe) return P2; /*返回键值*/ else P2=0xfd; } else P2=0xfd; /*第二行置低*/ if ((P2&0xff)!=0xfd) { delay(); if ((P2&0xff)!=0xfd) return P2; else P2=0xfb; } else P2=0xfb; /*第三行置低*/ if ((P2&0xff)!=0xfb) { delay(); if ((P2&0xff)!=0xfb) return P2; else P2=0xf7; } else P2=0xf7; /*第四行置低*/ if ((P2&0xff)!=0xf7) { delay(); if ((P2&0xff)!=0xf7) return P2; else return P2=0xfe; } } }

四、实验仪器和设备 Keil软件;AT89S52实验平台;ATMEL ISP在线编程软件; 五、实验结果和数据分析

相关文档
最新文档