非编码键盘的扫描程序设计

合集下载

实验四4×4键盘输入

实验四4×4键盘输入

实验四: 4 × 4键盘输入实验一、实验目的:1.学习非编码键盘的工作原理和键盘的扫描方式。

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

二、实验原理:键盘是单片机应用系统接受用户命令的重要方式。

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

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

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

程序及流程图:ORG 0000HAJMP MAINORG 0000HAJMP MAINORG 0030HMAIN:MOV P2,#0F7HMOV P1,#0F0HMOV R7,#100DJNZ R7,$MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ MAINLCALL D10MSMOV A,#00HMOV R0,AMOV R1,AMOV R2,#0FEH SKEY0:MOV A,R2MOVP1,AMOVR7,#10DJNZ R7,$MOVA,P1ANLA,#0F0HXRLA,#0F0HJNZ LKEYINC R0MOVA,R2RL AMOVR2,AMOVA,R0CJNE A,#04H,SKEY0AJMP MAIN LKEY:JNB ACC,4,NEXT1MOVA,#00HMOVR1,AAJMP DKEYNEXT1:JNB ACC.5,NEXT2MOVA,#01HMOVR1,AAJMP DKEYNEXT2:JNB ACC.6,NEXT3MOVA,#02HMOVR1,AAJMP DKEYNEXT3:JNB ACC.7,MAINMOVA,#03HMOVR1,AAJMP DKEY DKEY:MOV A,R0MOVB,#04HMULABADDA,R1AJMP SQRSQR:MOVDPTR,#TABMOVC A,@A+DPTRMOVP0,AAJMP MAINTAB:DB0C0H,0F9H,0A4H,0B0H,99H, 92H, 82H, 0F8H DB 80H, 90H, 88H, 83H, 0C6H,0A1H,86H, 8EH D10MS:MOV R6,#10L1:MOV R5,#248DJNZ R5,$DJNZ R6,L1RETEND流程图:结束三、思考题:总结 FPGA是如何识别按键的?与单片机读取键值有何不同?答:FPGA的所有 I/O 控制块允许每个 I/O 引脚单独配置为输入口 , 不过这种配置是系统自动完成的。

键盘扫描程序实验报告

键盘扫描程序实验报告

一、实验目的1. 理解键盘扫描的基本原理。

2. 掌握使用C语言进行键盘扫描程序设计。

3. 学习键盘矩阵扫描的编程方法。

4. 提高单片机应用系统的编程能力。

二、实验原理键盘扫描是指通过检测键盘矩阵的行列状态,判断按键是否被按下,并获取按键的值。

常见的键盘扫描方法有独立键盘扫描和矩阵键盘扫描。

独立键盘扫描是将每个按键连接到单片机的独立引脚上,通过读取引脚状态来判断按键是否被按下。

矩阵键盘扫描是将多个按键排列成矩阵形式,通过扫描行列线来判断按键是否被按下。

这种方法可以大大减少引脚数量,降低成本。

本实验采用矩阵键盘扫描方法,使用单片机的并行口进行行列扫描。

三、实验设备1. 单片机开发板(如51单片机开发板)2. 键盘(4x4矩阵键盘)3. 连接线4. 调试软件(如Keil)四、实验步骤1. 连接键盘和单片机:将键盘的行列线分别连接到单片机的并行口引脚上。

2. 编写键盘扫描程序:(1)初始化并行口:将并行口设置为输入模式。

(2)编写行列扫描函数:逐行扫描行列线,判断按键是否被按下。

(3)获取按键值:根据行列状态,确定按键值。

(4)主函数:调用行列扫描函数,读取按键值,并根据按键值执行相应的操作。

3. 调试程序:将程序下载到单片机,观察键盘扫描效果。

五、实验程序```c#include <reg51.h>#define ROW P2#define COL P3void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);}void scan_key() {unsigned char key_val = 0xFF;ROW = 0xFF; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值}void main() {while (1) {scan_key();if (key_val != 0xFF) {// 执行按键对应的操作}}}```六、实验结果与分析1. 实验结果:程序下载到单片机后,按键按下时,单片机能够正确读取按键值。

非编码矩阵式键盘的工作原理

非编码矩阵式键盘的工作原理

非编码矩阵式键盘的工作原理非编码矩阵式键盘的工作原理1. 简介非编码矩阵式键盘是一种常见的输入设备,它采用了矩阵式的排列方式,通过按下不同的按键来输入不同的字符和指令。

在本文中,我们将深入探讨非编码矩阵式键盘的工作原理,力求让读者全面了解其结构和工作方式。

2. 键盘结构非编码矩阵式键盘通常由多个按键组成,每个按键都有一个独立的电路。

这些按键按照矩阵的方式排列,行和列之间通过导线连接在一起。

当用户按下某个按键时,该按键所在的行和列之间就会产生电路的闭合。

3. 工作原理当用户按下某个按键时,该按键所在的行和列之间就会产生闭合的电路。

键盘控制器会扫描各个按键的状态,从而确定用户按下的是哪个按键。

具体而言,它会首先将所有的列设为高电平,然后逐一将每一行设为低电平,同时检测各个列的电平变化。

这样就能够确定到底哪一行哪一列的按键被按下,从而确定用户输入的字符或指令。

4. 技术细节非编码矩阵式键盘的工作原理虽然看似简单,但实际上其中蕴含了许多技术细节。

为了防止按键重复输入,键盘控制器通常会采用一些特殊的方式来进行防抖处理。

为了减少电磁干扰和提高数据传输的可靠性,键盘的电路设计也十分重要。

5. 我的观点和理解在我看来,非编码矩阵式键盘的工作原理虽然看似简单,但其中所涉及的技术细节却非常丰富。

它不仅需要精密的电路设计,还需要高效的按键扫描算法。

为了确保用户体验和数据传输的可靠性,键盘的设计和制造也非常重要。

对于工程师和技术人员来说,了解非编码矩阵式键盘的工作原理是非常重要的。

6. 总结非编码矩阵式键盘通过矩阵式的按键排列和电路设计,实现了用户输入字符和指令的功能。

它的工作原理虽然简单,但涉及的技术细节却非常丰富,需要设计精密的电路和高效的按键扫描算法。

深入了解非编码矩阵式键盘的工作原理,对于工程师和技术人员来说具有重要的意义。

通过本文的阐述,相信读者已经对非编码矩阵式键盘的工作原理有了全面的了解。

希望这些信息能够对你有所帮助,如果你对这个主题还有其他的疑问或者想深入了解,欢迎继续探讨。

EDA课程设计键盘扫描及显示完整程序

EDA课程设计键盘扫描及显示完整程序

EDA课程设计键盘扫描及显示完整程序第一篇:EDA课程设计键盘扫描及显示完整程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USESTD_LOGIC_ARITH.ALL;USESTD_LOGIC_UNSIGNED.ALL;ENTITYKEYBOARD IS PORT(CLK_1K : IN STD_LOGIC;CLK_40K : IN STD_LOGIC;KEY_LIE : IN STD_LOGIC_VECTOR(3 DOWNTO 0);START :OUT STD_LOGIC;KEY_HANG :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DATA_P : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);DISP_DATA : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);DISP_SEL : OUT STD_LOGIC_VECTOR(1 downto 0);END;ARCHITECTURE RTL OF KEYBOARD IS SIGNAL INT : STD_LOGIC;SIGNAL CLK_SEL : STD_LOGIC;SIGNAL START_REG:STD_LOGIC;SIGNAL SIGNAL SIGNAL SIGNAL DISP_SEL_REG:STD_LOGIC_VECTOR(1 DOWNTO 0);DATA_L,DATA_H:STD_LOGIC_VECTOR(3 DOWNTO 0);DATA_TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);KEY_HANG__TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DISP_DATA_REG:STD_LOGIC_VECROR(3 DOWNTO 0);SIGNAL KEY_CODE:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL DATA_P_REG:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN KEY_CODE<=KEY_HANG_TMP&KEY_LIE;DATA_P<=DATA_P_REG; START<=START_REG;KEY_HANG<=KEY_HANG_TMP;DISP_SEL<=DISP_SEL_REG;CLK_SEL<=CLK_1K AND(NOT INT);PROCESS(CLK_SEL,CLK_40,INT)VARIABLE STATE : INTEGER RANG 0 TO 3;BEGIN IF RISING_EDGE(CLK_40K)THEN INT<= NOT(KEY_LIE(3)AND KEY_LIE(2)AND KEY_LIE(1)AND KEY_LIE(0));END IF;IF RISING_EDGE(CLK_SEL)THEN CASE STATE IS WHEN 0=>KEY_HANG_TMP<=“1110”;STATE :=1;WHEN 1 =>KEY_HANG_TMP<=“1101”;STATE :=2;WHEN 3 =>KEY_HANG_TMP<=“1011”;STATE :=3;WHEN 4=>KEY_HANG_TMP<=“0111”;STATE :=0;END CASE;END IF;END PROCESS;PROCESS(CLK_40K , INT)VARIABLE STATE :INTEGER RANGE 0 TO 3;VARIABLE COUNTER : INTEGER RANGE 0 TO 31;BEGIN IF INT='0' THENSTATE:=0;COUNTER:=0;ELSIF RISING_EDGE(CLK_40K)THEN CASE STATE ISWHEN 0 => DATA_TMP <= DATA_L;STATE:=1;WHEN 1 =>CASE KEY_CODE ISWHEN “01110111” =>DATA_L <=“0001”;DATA_H <=DATA_TMP; STATE:=2;WHEN “01111011” => DATA_L <=“0010”; DATA_H <=DATA_TMP; STATE:=2;WHEN “01111101” => DATA_L <=“0011”; DATA_H <=DATA_TMP; STATE:=2;WHEN “01111110” => DATA_L <=“0100”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10110111” => DATA_L <=“0101”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111011” => DATA_L <=“0110”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111101” => DATA_L <=“0111”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111110” => DATA_L <=“1000”; DATA_H <=DATA_TMP; STATE:=2;WHEN “11010111” => DATA_L <=“1001”;DATA_H <=DATA_TMP; STATE:=2;WHEN “11011011” => DATA_L <=“0000”;DATA_H <=DATA_TMP; STATE:=2;WHEN “11011101” =>IF DATA_H =“1001” THEN IF DATA_L=“1001” THEN DATA_H<=“1001”;DATA_L<=“1001”;ELSE DATA_L<=DATA_L + 1; END IF;ELSIF DATA_L=“1001” THEN DATA_L<=“0000”;DATA_H<=DATA_H+1; ELSEDATA_L<=DATA_L+1;DATA_H<=DATA_H;END IF;STATE:=2;WHEN “11011110” =>IF DATA_H=“1001” THEN DATA_H<=“1001”;ELSE DATA_L<=DATA_L;DATA_H<= DATA_H+1;END IF; STATE:=2;WHEN “11100111” =>IF DATA_L=“0000” AND DATA_H=“0000” THEN DATA_L<=“0000”;DATA_H<=“0000”;ELSIF DATA_L=“0000” THEN DATA_L<=“1001”;DATA_H<= DATA_H-1;ELSEDATA_L <=DATA_L-1;DATA_H<=DATA_H;END IF;STATE:=2;WHEN “11101011”=>IF DATA_H=“0000” THENDATA_H<=“0000”;ELSEDATA_L<=DATA_L;DATA_<=DATA_H-1;END IF;STATE:2;WHEN “11101110” =>DATA_L<=DATA_L;DATA_H<=DATA_H;DATA_P_REG<=DATA_H&DATA_L;START_REG<='1';STATE:=2;WHEN“11101101” =>DATA_L<=“0000”;DATA_H<=“0000”;STATE:=2;WHEN OTHERS =>STATE:=2;END CASE;WHEN 2 =>IF COUNTER=31 THENCOUNTER:=0;STATE:=3;ELSECOUNTER:=COUNTER+1;STSTE:=2;END IF;WHEN 3 =>START_REG<='0';STATE:=3;END CASE;END IF;END PROCESS;PROCESS(CLK_1K,DATA_L,DATA_H)VARIABLE STATE: INTEGER RANGE 0 TO 1;BEGINIF RISING_EDGE(CLK_1K)THENCASE STATE ISWHEN 0 =>DISP_SEL_REG<=“10”;DISP_DATA_REG<=DATA_L;STATE:=1;WHEN 1 =>DISP_SEL_REG<=“01”;DISP_DATA_REG<=DATA_H;STATA:=0;END CASE;END IF;END PROCESS;PROCESS(CLK_1K,DISP_DATA_REG)BEGIN IF RISING_EDGE(CLK_1K)THENCASE DISP_DATA_REG ISWHEN “0000”=>DISP_DATA<=“1111110” WHEN “0001”=>DISP_DATA<=“0110000” WHEN “0010”=>DISP_DATA<=“1101101” WHEN “0011”=>DISP_DATA<=“1111001” WHEN “0100”=>DISP_DATA<=“0110011” WHEN “0101”=>DISP_DATA<=“1011011” WHEN “0110”=>DISP_DATA<=“1011111” WHEN “0111”=>DISP_DATA<=“1110000” WHEN “1000”=>DISP_DATA<=“1111111” WHEN “1001”=>DISP_DATA<=“1111011” WHEN OTHERS =>DISP_DATA<=“0000000” END CASE;END IF;END PROCESS;END;第二篇:EDA课程设计考试序号:28自动打铃系统设计说明书学生姓名:周文江学号:14112502521专业班级:1102报告提交日期:2013.11.26湖南理工学院物电学院目录一、题目及要求简介...............3 1.设计题目.....................3 2.总体要求简介 (3)二、设计方案说明 (3)三、系统采用器件以及模块说明.........3 1.系统框图............4 2.选择的FPGA芯片及配置.........4 3.系统端口和模块说明 (5)四、各部分仿真结果 (5)五、调试及总结 (6)六、参考文献 (7)七、附录 (7)一、题目及要求简介1、设计题目设计一个多功能自动打铃系统2、总体要求简介① 基本计时和显示功能(24小时制显示),包括:1.24小时制显示2.动态扫描显示;3.显示格式:88-88-88 ② 能设置当前时间(含时、分)③ 能实现基本打铃功能,规定:06:00起床铃,打铃5s二、设计方案说明本次设计主要采用Verilog HDL硬件描述性语言、分模块法设计的自动打铃系统。

键盘程序设计

键盘程序设计

键盘扫描程序是整个程序的核心部分,其流程图如下图3.1所示。

图3.1 键盘扫描程序流程图
八位七段数码管显示程序,采用动态显示,每个数码管均可以从0到9、A到F的显示。

通过查询键盘输出端的数据总线的通码值,将相应的通码在数码管上显示出来。

程序见附录A,八位七段数码管显示如图3.2所示。

图3.2 八位七段数码管
16*16点阵显示程序,通过查询数据总线的通码值,在LED点阵上显示键盘上相应的符号。

程序见附录B,16*16点阵显示如图3.3所示。

图3.3 16*16点阵
扫描码有两种不同的类型:“通码”和“断码”。

当一个键被按下去或长按的时候,键盘就发送通码;当一个键被释放的时候,键盘就发送断码。

每个键盘被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以确定是哪个按键被按下或释放。

程序见附录C。

动态扫描程序,控制八位七段数码管和16*16点阵单独显示,当系统时钟频率达到一定值时,显示效果就和静态显示一样了。

浅谈单片机非编码键盘工作原理及设计方法

浅谈单片机非编码键盘工作原理及设计方法

独立式按键电路每一个按键开关占一根 I/O 口线, 当按键数 较多时, 要占用较多的 I/O 口线。因此, 在按键数大于 8 时, 通常 多采用行列式 (也称 “矩阵式” ) 键盘电路。 3.1 行列式键盘电路的结构及原理 图 3 为用 AT89S51 单片机扩展 I/O 口组成的行列式键盘电 路。图中行线 P2.0~P2.3 通过 4 个上拉电阻接 Vcc, 且处于输入 状态, 列线 P1.0~P1.7 为输出状态。按键设置在行、 列线交点上, 行、 列线分别连接到按键开关的两端。 判断有无键按下: 当键盘上没有键闭合时, 行线和列线之间
AT89S51 I/O
李伍元
浅谈单片机非编码键盘工作原理及设计方法
本刊 E-mail:bjb@mail P1.4 P1.3 P1.2 P1.1 P1.0 AT89S51 P2.0 P2.1 P2.2 P2.3 0 1 2 3 4 5 6 7 10 kΩ×4 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Vcc
Strengthen the Core Competitiveness of the Primary Medical Information Centre
LUO Fang, HU Wei, JIN Xiao-jun, YU Dan-yan
ABSTRACT: This paper analyzes the present situation of the primary medical information centre , and points out that the primary medical information centre must strengthen the self-construction continuously , and based on the actual situation of the local users, centers on the satisfaction of users’information demands and on the knowledge service, establishes the self’ s core competitiveness, and therefore improves the service quality. KEY WORDS: primary medical information centre; core competitiveness; knowledge service

课程设计,键盘扫描显示程序(c51)

课程设计,键盘扫描显示程序(c51)

课程设计,键盘扫描显示程序(c51)
//课程设计,键盘扫描显示程序//由于开发板中使用了锁存器,在proteus 中仿真的话,加上锁存器的话,会出现乱码,并且//不成功,所以,就不贴图了,不过以下代码,在事物板上测试成功
//实验代码为实现按键扫描,并显示在数码管上
//实验班上共有4 个按键,分别接在p3.4,p3,5,p3.6.p3.7 上,因此并没有用到矩阵键盘扫描,//控制起来比较简单,6 数码管观通过锁存器接在P0 口上。

#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2;//数码管段选控制位
sbit wela=P2;//数码管位选控制位
uchar key=8;
//共阴数码管段码(不叫特殊的编码)
uchar code table[]=
{
0xed, 0x48, 0xf4, 0xb5, 0x99,
0x3d, 0x7d, 0x85, 0xfd, 0xbd,
0xdd, 0x79, 0x6c, 0xf1, 0x7c,
0x5c, 0x10, 0x00,
};
//位选编码
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};。

课程设计(论文)-8255扫描键盘(4X4)显示设计

课程设计(论文)-8255扫描键盘(4X4)显示设计

课程设计(论文)-8255扫描键盘(4X4)显示设计目录8255扫描键盘,4X4,显示:一、设计要求………………………………………… 1 二、设计目的………………………………………… 1 三、主要芯片及器件介绍…………………………… 1 四、电路原理图………………………………………5 五、编程方法................................................ 7 六、设计体会................................................ 10 七、参考文献 (10)1系别:电子电气工程系专业名称:电子信息工程班级:电子,3,班学生姓名:学号:20048602115指导教师:2006 年 8 月 29 日2一、设计要求利用可编程并行接口8255芯片与MCS-51单片机相连做一个有输入/输出的并行接口。

输入端口接4×4的键盘,输出端口接8个七段数码管,作为输出显示。

二、设计目的1(理解MCS-51单片机输入输出的原理及工作方式。

2(掌握8255的编程方法。

3(掌握利用8279实现编码式键盘的连接和编程方法。

4(掌握多个七段数码管按位显示的实现方法。

三、主要芯片及器件介绍1(可编程并行接口 82558255是8位通用可编程并行输入输出接口芯片,它具有很强的功能,在使用时可利用软件编程来指定完成它的功能。

1(8255的外部引线如图1:D0~D7:双向数据信号线。

用来传送数据和控制字。

RD:读信号线。

通常接系统总线的IOR。

:写信号线。

通常接系统总线的IOW。

WD:片选输入端,低电平有效。

CSA0 A1:口地址选择信号线。

8255内部有3个口(即A口,B口,C口)还有一个控制寄存器,他们即可由程序寻址。

A0 A1 上的不同编码可分别寻址上述3个口号一个控制寄存器,具体规定如下:A0 A1 选择0 0 A口0 1 B口1 0 C口1 1 控制寄存器图 1 8255管脚图A0 A1与一起决定8255的接口地址。

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

目录1设计任务及要求 (1)1.1初始条件 (1)1.2要求完成的主要任务 (1)2方案比较及认证 (1)3键盘扫描原理 (3)4系统硬件设计 (4)4.1选用元器件 (4)4.1.1 8031单片机 (4)4.1.2 8155芯片 (7)4.2 硬件电路 (10)4.2.1矩阵式键盘电路 (10)4.2.2时钟电路和复位电路 (11)4.2.3非编码键盘的总电路 (12)5系统软件设计 (13)5.1软件思想 (13)5.2 程序流程图 (14)5.3源程序 (15)6调试记录及结果分析 (18)心得体会 (19)参考文献 (20)附录 (21)附录1 8031单片机资料 (21)附录2 8155芯片资料 (21)附录3 程序清单 (22)非编码键盘的扫描程序设计1设计任务及要求1.1初始条件1.通过8155扩展I/O口组成6×6行列式键盘2.利用8031微控制器1.2要求完成的主要任务1.技术指标:对键盘按键能够正确识别,去抖动2.工作原理:键盘扫描3.课程设计说明书应包括(1)设计任务及要求(2)方案比较及认证(3)键盘扫描原理(4)硬件原理,电路图,采用器件的功能说明(5)软件思想,流程,源程序(6)调试记录及结果分析(7)参考资料(8)附录:芯片资料,程序清单(9)总结2方案比较及认证(1)键盘去抖动方案的选择键盘采用机械弹性开关来反映一个电压信号的开、断。

由于机械触点的弹性作用,在闭合和断开的瞬间会有抖动发生。

抖动时间的长短由按键的机械特性决定,一般在5~10ms之间。

抖动会造成被查询的开关状态无法准确读到。

例如开关刚刚断开,只是因为抖动误认为开关又发生第二次闭合,这显然是不允许的。

为此必须采取一些去抖动的措施,以免误读。

去抖动措施有硬件和软件两种方法。

硬件去抖动的办法,就是不把开关直接接到接口,而是如图2-1那样,加接一个RS触发器,只有开关脱离a而接到b 时,触发器才能翻转,才能输出一个稳定的电平。

软件去抖动是在检测到有按键按下时,执行一个10~20ms的延时程序,避开抖动信号,然后再次检测该键是否确实闭合,如果再次检测时,查不到有键按下,说明并非有效按键信号,应放弃初测结果,以免误动作。

硬件去抖动方式一般用在对按键操作过程比较严格的场合。

采用硬件去抖动电路将导致系统硬件电路设计复杂化,会增加设计成本。

软件去抖动方式可以简单地通过编程实现,降低了设计成本。

通过以上分析,决定采用软件去抖动方式。

(2)扫描方式的选择通常,键盘扫描方式有三种,及编程扫描、定时扫描和中断扫描。

编程扫描就是CPU对键盘的扫描采取程序控制方式,一旦进入键扫描状态,则反复的扫描键盘,等待用户从键盘上输入命令或数据。

而在执行键入命令或处理键入数据过程中,CPU将不再响应键入要求,直到CPU返回重新扫描键盘为止。

定时扫描就是CPU每隔一定的时间(如10ms)对键盘扫描一遍。

当发现有键按下时,便进行读入键盘操作,以求出键值,并分别经行处理。

定时时间间隔由单片机内部定时器/计数器来完成,这样可以减少计算机扫描键盘的时间,以减少CPU的开销。

具体做法是,当定时时间一到,定时器便自动输出一脉冲信号,使CPU转去执行扫描程序。

但有一点需要指出,即采用定时扫描法时,必须在其初始化程序中,对定时器写入相应的命令,使之能定时产生中断,以完成定时扫描的任务。

中断扫描的工作过程如下:当无键按下时,CPU不对键盘进行扫描以节省出大量的时间对系统经行监控和数据处理,当有键按下时,产生中断请求,CPU 转去执行键盘扫描子程序,并识别键号。

无论是编程扫描还是定时扫描,均占用CPU大量的时间。

无论有没有输入操作,CPU总要在一定的时间内进行扫描,这对于单片机控制系统是很不利的。

中断扫描更进一步的节省了CPU的时间,由于本次课程设计只是设计一个行列式键盘,所以不用去考虑节省CPU的时间,而且编程扫描比定时扫描的控制程序简单,所以选用编程扫描方式。

图2-1 RS触发器去抖动电路3键盘扫描原理行列式键盘又称为矩阵式键盘,适用于按键数量较多的场合,它由行线和列线组成。

按键位于行线和列线的交叉点上,行线、列线分别接到按键开关的两端。

行线通过上拉电阻接到+5V上。

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

列线电平如果为低,则行线电平为低;列线电平如果为高,则行线电平亦为高。

这一点是识别矩阵键盘按键是否被按下的关键所在。

由于矩阵键盘中行线、列线为多键共用,各按键均影响该键所在的行和列的电平。

因此各按键彼此将相互发生影响,所以必须将行线、列线信号配合起来并作适当的处理,才能确定闭合键的位置。

扫描法是非编码键盘常用的方法。

用扫描法来识别矩阵键盘按键分两步经行。

(1)识别有无按键被按下:让所有列线均置为零电平,检查各行线电平是否有变化。

如果有变化,则说明有按键被按下;如果没有变化,则说明无键被按下。

(2)识别具体按键的方法:首先逐列置零电平,其余各列置为高电平,然后检查各行线电平的变化,如果某行电平由高电平变为零电平,则可确定此行此列交叉点处的按键被按下。

4系统硬件设计4.1选用元器件4.1.1 8031单片机8031单片机共有40条引脚,其中有2条专用于主电源的引脚,2条外接晶体的引脚,4条控制或与其它电源复用的引脚,32条输入/输出(I/O)引脚。

其引脚图如图4-1所示。

图4-1 8031单片机引脚图下面按其引脚功能分为四部分叙述这40条引脚的功能。

(1)主电源引脚VCC和VSSVCC——(40脚)接+5V电压;VSS——(20脚)接地。

(2)外接晶体引脚XTAL1和XTAL2XTAL1(19脚)接外部晶体的一个引脚。

在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。

当采用外部振荡器时,对HMOS 单片机,此引脚应接地;对CHMOS单片机,此引脚作为驱动端。

XTAL2(18脚)接外晶体的另一端。

在单片机内部,接至上述振荡器的反相放大器的输出端。

采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对XHMOS,此引脚应悬浮。

(3)控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。

推荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VCC引脚之间连接一个约10μF的电容,以保证可靠地复位。

VCC掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。

当VCC主电源下掉到低于规定的电平,而VPD在其规定的电压范围(5±0.5V)内,VPD就向内部RAM提供备用电源。

②ALE/PROG(30脚):当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。

即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。

因此,它可用作对外输出的时钟,或用于定时目的。

然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。

ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。

对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。

③PSEN(29脚):此脚的输出是外部程序存储器的读选通信号。

在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效。

但在此期间,每当访问外部数据存储器时,这两次有效的PSEN信号将不出现。

PSEN同样可以驱动(吸收或输出)8个LS型的TTL输入。

④EA/VPP(引脚):当EA端保持高电平时,访问内部程序存储器,但在PC(程序计数器)值超过0FFFH(对851/8751/80C51)或1FFFH(对8052)时,将自动转向执行外部程序存储器内的程序。

当EA保持低电平时,则只访问外部程序存储器,不管是否有内部程序存储器。

对于常用的8031来说,无内部程序存储器,所以EA脚必须常接地,这样才能只选择外部程序存储器。

对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚也用于施加21V的编程电源(VPP)。

(4)输入/输出(I/O)引脚P0、P1、P2、P3(共32根)①P0口(39脚至32脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL负载。

②P1口(1脚至8脚):是准双向8位I/O口。

由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。

P1口能驱动(吸收或输出电流)4个LS型的TTL负载。

对8052、8032,P1.0引脚的第二功能为T2定时/计数器的外部输入,P1.1引脚的第二功能为T2EX捕捉、重装触发,即T2的外部控制端。

对EPROM编程和程序验证时,它接收低8位地址。

③P2口(21脚至28脚):是准双向8位I/O口。

在访问外部存储器时,它可以作为扩展电路高8位地址总线送出高8位地址。

在对EPROM编程和程序验证期间,它接收高8位地址。

P2可以驱动(吸收或输出电流)4个LS型的TTL负载。

④P3口(10脚至17脚):是准双向8位I/O口,在MCS-51中,这8个引脚还用于专门功能,是复用双功能口。

P3能驱动(吸收或输出电流)4个LS型的TTL 负载。

作为第一功能使用时,就作为普通I/O口用,功能和操作方法与P1口相同。

作为第二功能使用时,各引脚的定义如表4-1所示。

P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。

表4-1 P3各口线的第二功能定义4.1.2 8155芯片8155芯片是为8086系列微机开发出的系列通用可编程I/O接口芯片。

8155不仅可以提供三个并行的I/O端口,在其内部还集成有256个字节的RAM存储空间、一个14位的定时/计数器,因此非常适合与MCS-51单片机连接实现系统功能的扩展。

8155的引脚图如图4-2所示:图4-2 8155引脚图(1)8155各引脚功能说明如下:RST:复位信号输入端,高电平有效。

复位后,3个I/O口均为输入方式。

AD0~AD7:三态的地址/数据总线。

与单片机的低8位地址/数据总线(P0口)相连。

单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。

RD:读选通信号,控制对8155的读操作,低电平有效。

WR:写选通信号,控制对8155的写操作,低电平有效。

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

IO/M :8155的RAM存储器或I/O口选择线。

当IO/M =0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);当IO/M =1时,选择 8155的I/O口,AD0~AD7上的地址为8155 I/O口的地址。

相关文档
最新文档