键盘程序设计
单片机按键程序设计
单片机按键程序设计单片机按键的基本原理其实并不复杂。
通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。
在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。
在实际的按键程序设计中,有多种方式可以实现按键检测。
其中一种常见的方法是查询法。
这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。
以下是一个简单的查询法示例代码:```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void main(){while(1) //无限循环{if(key == 0) //如果按键按下,引脚为低电平{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;while(key == 0);//等待按键松开}}}```上述代码中,我们首先定义了按键连接的引脚`key`,然后在主函数的无限循环中不断检测按键引脚的状态。
当检测到按键按下时,执行相应的操作,并通过`while(key == 0)`等待按键松开。
除了查询法,还有中断法可以用于按键检测。
中断法的优点是能够及时响应按键动作,不会因为程序的其他操作而导致按键响应延迟。
```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void int0_init()//中断初始化函数{IT0 = 1; //下降沿触发中断EX0 = 1; //使能外部中断 0EA = 1; //开总中断}void int0() interrupt 0 //外部中断 0 服务函数{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;}void main(){int0_init();//初始化中断while(1);//无限循环,保持程序运行}```在上述代码中,我们首先在`int0_init` 函数中对中断进行了初始化设置,然后在`int0` 函数中编写了按键按下时的处理代码。
键盘数字输入训练器设计任务书
《微机原理综合训练》设计任务书题目:键盘数字输入训练器程序设计学生姓名:学号:班级:题目类型:设计性指导教师:一、课程设计题目键盘数字输入训练器程序设计。
二、题目简介以键盘数字输入训练器为背景,对键盘数字输入、视频显示、键盘扫描程序进行分析和设计。
通过该题目的分析和设计,学习微机软、硬件系统设计开发过程,加深微机原理及应用课程基础知识的理解和综合运用能力,熟悉集成电路芯片的使用方法,熟悉微机编程及接口电路,学习体会工程实际设计的过程,培养学生独立解决实际工程问题的综合能力。
学生初步得到用汇编语言书写程序的训练,全面培养程序设计过程中的分析、设计、编码、测试及文档规范书写的能力,得到运用汇编语言的综合训练,提高解决实际问题的能力。
三、设计任务学生通过该题目的设计过程,可以初步掌握汇编语言的运用、软件开发方法并提高解决实际问题的能力。
利用汇编语言对键盘数字输入训练器进行编写的主要思路如下:在PC机中,对键盘的管理是通过中断机构和8255芯片来实现的,在8255中有两个端口PA和PB,在这个硬件接口的基础上,系统在BIOS中配备了键盘服务功能,可以调用键盘的DOS和BIOS功能编程,也可以直接在硬件接口的基础上编程。
视频显示程序设计:一般由DOS 或BIOS调用来完成。
有关显示输出的DOS 功能调用不多,而BIOS调用的功能很强,主要包括设置显示方式、光标大小和位置、设置调色板号、显示字符、显示图形等。
键盘扫描程序设计:检测键盘状态,有无输入,并检测输入各值。
设计任务包括:1.在缓冲区中预放了一些字符,当有键盘输入,则从缓冲区中取出字符并进行显示。
2.对取出的字符进行队列管理。
3.增加left_shift和right_shift键的功能,即在按下left_shift或right_shift键的同时,又按下0~9或a~z等键,则CPU取得并显示键得上档符号或大写字母。
附加要求:必要的辅助功能(设置、修改等)。
基于STM32控制的智能键盘+程序
基于STM32控制的智能键盘摘要:本设计选择STM32为核心控制元件,设计了用4个IO 口实现4*4矩阵键盘,使用C 语言进行编程。
矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。
关键词:STM32 矩阵键盘 ARM 显示电路1 引言随着21世纪的到来,以前的单个端口连接的按键已经不能满足人们在大型或公共场合的需求。
电子信息行业将是人类社会的高科技行业之一,4*4矩阵键盘设计师当今社会中使用的最广的技术之一。
4*4矩阵式键盘采用STM32为核心,主要由矩阵式键盘电路、显示电路等组成,软件选用C 语言编程。
STM32将检测到的按键信号转换成数字量,显示于数码管上。
该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。
2 总体设计方案该智能键盘电路由ARM 最小系统,矩阵键盘电路和显示电路组成,在常规的4*4矩阵键盘的基础上,通过改进实现了用4个IO 口完成4*4矩阵键盘。
2.1 总体设计框图本电路主要由3大部分电路组成:矩阵键盘电路、ARM 最小系统电路、按键显示电路。
其中ATM 最小系统主要由复位电路和时钟电路组成。
电路复位后数码管显示字符“—” 表示没有按键,显示电路由STM32的PD0—PD7来控制数码管显示是哪个按键按下。
总体设计方框图,如图1所示。
图1总体设计方框图STM32矩阵键盘电路时钟电路复位电路按键显示电路3 智能键盘设计原理分析3.1 STM32复位和时钟电路设计此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2(右)所示:其中14脚为STM32的复位端。
时钟电路如图2(左)所示:晶振采用的是8MHz和32.786KHz,8MKz分别接STM32的12脚和13脚,32.786KHz分别接STM32的8脚和9脚。
图2STM复位和时钟电路设计3.2 矩阵键盘电路的设计该电路的四个端子分别接STM32的PB12—PB15,电路如图3所示。
矩阵键盘程序设计
矩阵键盘程序设计1. 引言矩阵键盘是一种常见的输入设备,广泛应用于电脑、方式等各种电子设备中。
将介绍如何设计一个简单的矩阵键盘程序。
2. 程序设计思路矩阵键盘由多个按键组成,每个按键对应一个特定的字符或功能。
通常情况下,矩阵键盘是通过行列扫描的方式来检测按键的状态,即通过扫描每行和每列的电平来判断是否有按键被按下。
要设计一个矩阵键盘程序,需要确定矩阵键盘的行列数,然后通过相应的硬件电路将其连接到控制器上。
接下来,程序需要循环扫描每行和每列的电平,并记录下按下的按键。
根据按键的状态来执行相应的操作,输出对应的字符或执行特定的功能。
3. 硬件设计硬件设计主要包括确定矩阵键盘的行列数以及将其连接到控制器上的电路设计。
通常情况下,矩阵键盘的行使用输出电平,列使用输入电平。
在连接到控制器之前,还需要添加电阻和二极管来保护电路和消除反馈。
4. 软件设计软件设计主要包括程序的循环扫描和按键状态的处理。
可以使用循环来不断扫描每行和每列的电平,当检测到按键被按下时,记录下按键的位置信息。
接下来,根据按键的状态,进行相应的处理操作,输出对应的字符或执行特定的功能。
程序还需要处理按键的反弹,以避免误操作。
5. 示例代码以下是一个简单的矩阵键盘程序设计的示例代码,采用C语言编写:cinclude <stdio.h>include <stdbool.h>// 定义矩阵键盘的行列数define ROWS 4define COLS 4// 定义矩阵键盘的字符映射表char keys[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'', '0', '', 'D'}};// 定义矩阵键盘状态数组bool keyState[ROWS][COLS] = {0};// 矩阵键盘扫描函数void scanKeyboard() {// 扫描行for (int row = 0; row < ROWS; row++) {// 将当前行的输出电平设置为低电平setRowLow(row);// 扫描列for (int col = 0; col < COLS; col++) {// 检测当前列的输入电平if (getColLevel(col)) {// 当检测到按键被按下时,更新按键状态 keyState[row][col] = true;} else {// 当检测到按键未按下时,更新按键状态 keyState[row][col] = false;}}// 将当前行的输出电平恢复为高电平setRowHigh(row);}}int mn() {while (1) {// 扫描矩阵键盘scanKeyboard();// 处理按键状态for (int row = 0; row < ROWS; row++) {for (int col = 0; col < COLS; col++) {// 检测到按键被按下时,输出对应的字符if (keyState[row][col]) { printf(\。
矩阵键盘程序设计
矩阵键盘程序设计矩阵键盘程序设计概述矩阵键盘是一种常见的输入设备,常用于电子产品和计算机系统中。
它由多个按键组成,采用矩阵排列的方式连接到计算机系统中。
在本篇文章中,我们将讨论矩阵键盘的程序设计。
程序设计步骤步骤一:硬件连接,我们需要将矩阵键盘与计算机系统进行连接。
通常情况下,矩阵键盘的每一行和每一列都通过引脚与计算机系统中的GPIO(通用输入输出)引脚相连接。
步骤二:引脚控制接下来,我们需要使用程序控制GPIO引脚的输入输出状态。
对于矩阵键盘而言,我们通常会将一行的引脚设置为输出,将一列的引脚设置为输入,然后将输出引脚设置为高电平,输入引脚设置为上拉或下拉电阻。
步骤三:按键扫描在第二步的基础上,我们可以进行按键的扫描操作。
具体方法是,先将某一行的引脚设置为低电平,然后读取每一列的引脚状态。
如果某一列引脚为低电平,则表示该按键被按下。
步骤四:按键处理一旦我们检测到某个按键被按下,就可以执行相应的按键处理操作。
这可能包括记录按键信息、执行某些特定的功能或触发一些事件。
步骤五:循环扫描,我们需要将以上步骤放入一个循环中进行不断的扫描。
这样可以实现对整个矩阵键盘的实时检测和响应。
示例代码下面是一个简单的矩阵键盘程序设计的示例代码,使用C语言编写:cinclude <stdio.h>include <wiringPi.h>define ROWS 4define COLS 4int rows[ROWS] = { 2, 3, 4, 5 };int cols[COLS] = { 6, 7, 8, 9 };char keyMap[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'', '0', '', 'D'}};void init() {wiringPiSetup();for (int i = 0; i < ROWS; i++) {pinMode(rows[i], OUTPUT);digitalWrite(rows[i], HIGH);}for (int i = 0; i < COLS; i++) {pinMode(cols[i], INPUT);pullUpDnControl(cols[i], PUD_UP);}}char getKey() {while (1) {for (int i = 0; i < ROWS; i++) {digitalWrite(rows[i], LOW);for (int j = 0; j < COLS; j++) {if (digitalRead(cols[j]) == LOW) { return keyMap[i][j];}}digitalWrite(rows[i], HIGH);}}}int mn() {init();while (1) {char key = getKey(); printf(\。
单片机c语言程序设计---矩阵式键盘实验报告
单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。
(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
操作方完成矩阵式键盘实验。
具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。
完成思考题。
三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。
4X4矩阵式键盘输入程序
4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboard delay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
矩阵键盘程序设计
矩阵键盘程序设计矩阵键盘程序设计1.引言2.矩阵键盘的工作原理矩阵键盘由多行多列的按键组成,每个按键都与行线和列线相交。
当按下某一个按键时,行线和列线会形成一个闭合电路,通过这个闭合电路来传递按键的信号。
通过扫描行线和列线的状态,可以确定用户按下了哪个按键。
3.矩阵键盘的程序设计在程序设计中,需要初始化矩阵键盘的引脚配置,即将每个行线和列线连接到相应的引脚上。
然后,通过循环扫描行线和列线的状态,判断用户是否按下了某个按键。
一般情况下,矩阵键盘的扫描速度比较快,可以采用中断的方式来进行扫描,提高响应速度。
以下是一个简单的矩阵键盘程序设计示例:import RPi.GPIO as GPIO初始化引脚配置row_pins = [11, 13, 15, 16] 行引脚col_pins = [18, 22, 24, 26] 列引脚GPIO.setmode(GPIO.BOARD)设置行引脚为输出模式,列引脚为输入模式for pin in row_pins:GPIO.setup(pin, GPIO.OUT)for pin in col_pins:GPIO.setup(pin, GPIO.IN)循环扫描矩阵键盘while True:for row in row_pins:设置当前行引脚为低电平GPIO.output(row, GPIO.LOW)for col in col_pins:判断当前列引脚是否为高电平,即判断用户是否按下了某个按键if GPIO.input(col) == GPIO.HIGH:处理按键事件print(\。
PS2键盘的设计---C51程序
PS2键盘的设计---C51程序+详细注释(转)PS2键盘的设计---C51程序#include <reg51.H>#define Frequence 11 //晶振频率单位是MHZ#define DELAY 10*Frequence/6 //发送程序延时#define SLEEP 8*Frequence/6 //发送程序延时sbit KBCLK="P3"^0; //键盘时钟线sbit KBDATA="P3"^1; //键盘数据线bit bat(void); //基本保证测试无错误返回0,有错返回1unsigned char buf_length(); //返回缓冲区数据个数bit command_s(); //键盘命令检查,有命令要接受返回1void clr_buf(void); //清键盘缓冲区void del_head(); //删除缓冲区头unsigned char exist(unsigned char);//检查键盘缓冲区中是否有与参数相等数,有则返回位置,无则返回255//bit emputy(); //检查键盘缓冲区是否空,是返回1unsigned char get_head(); //取键盘缓冲区头,头指针不变unsigned char get_head_f();//取缓冲区头对应标记,标记为0表示对应键已经松下bit insert(unsigned char,unsigned char);//插入缓冲区,并设置对应标记,成功则返回1void ini_timer01(); //定时器初始化void receive_process(); //接收键盘命令并处理void reset(); //软件复位unsigned char scankb(unsigned char); //扫描第N行,返回列直void send_buf(); //发送缓冲区扫描码bit send_code(unsigned char _KeyNo,bit flag);//发送按键扫描码,flag=0发送断开码,flag=1发送接通码bit send(unsigned char); //发送数据void set_default(); //设置缺省值void set_timer1(); //复位定时器1void set_scan_v(unsigned char); //设置扫描速度(拍发速率、延迟时间)void set_flag(unsigned char); //设置缓冲区对应标记void set_led(unsigned char); //设置LEDvoid secret(unsigned char);void scan(void);unsigned char get_end();bit emputy(void);//-----------------------函数声明,变量定义--------------------------------------------------------#include <reg51.h>#define KEY P1unsigned char key_code; //键值unsigned char key_buf[8]; //按键缓冲区unsigned char key_COUNT; //按键计数器unsigned char COUNT_TI; //定时中断计数//-----------------------变量声明---------------------------------------------------------------------void system_init(void ); //初始化,设置定时器0的工作方式,供主程序调用void TIMER0_SCANkey(); //定时器0中断处理函数bit judge_hitkey(); //判断是否有键按下,有返回1,没有返回0unsigned char scan_key(); //扫描键盘,返回键值(高四位代表行,低四位代表列) void key_manage(unsigned char keycode); //按键处理//...........每个按键对应一个处理程序//--------------------------------------------------------------------------------------------------// 函数名称:scan_key// 函数功能:扫描键盘,返回键值(高四位代表行,低四位代表列)// 无键按下返回0//--------------------------------------------------------------------------------------------------unsigned char scan_key() //扫描键盘,返回键值(高四位代表行,低四位代表列){unsigned char scancode,keycode,keycode_line,keycode_row;scancode="0xF0"; //列置低,行置高KEY="scancode"; //输入扫描码,扫描行keycode_line=KEY;scancode="0xF0"; //列置高,行置低KEY="scancode"; //输入扫描码,扫描列keycode_row=KEY;keycode=(((keycode_line<<4)&0xF0)|(keycode_row&0x0F));return(keycode);}//--------------------------------------------------------------------------------------------------// 函数名称:Timer0_init()// 函数功能:初始化设置// 设定INT0的工作方式//--------------------------------------------------------------------------------------------------void Timer0_init(void ){TMOD="0x20"; //定时器0工作在方式2的定时模式ET0=1; //定时器0中断允许TH0=0;TL0=0;TR0=1; //定时器0开始计数EA="1"; //系统中断允许}//--------------------------------------------------------------------------------------------------// 函数名称:TIMER0_intrupt// 函数功能:定时器0中断处理程序按键定时查询//--------------------------------------------------------------------------------------------------void TIMER0_SCANkey() interrupt 1 using 1{EA="0"; //系统中断禁止if((++COUNT_TI)%30==0){switch(COUNT_TI/30){case 1:if(scan_key()==0)COUNT_TI=0; //无键按下,计数值归零break;case 2:break;case 3:if(scan_key()==0)COUNT_TI=0; //无键按下,计数值归零,上次按键未扰动elsekey_code=scan_key(); //又有效建,获取键值break;default:if(scan_key()==0) //等待按键释放key_manage(key_code); //有一个有效按键,调用按键处理程序}}EA=1;}//--------------------------------------------------------------------------------------------------// 函数名称:key_manage// 函数功能:有效按键处理// 按键计数器加1,缓存区数据后移1位//--------------------------------------------------------------------------------------------------void key_manage(unsigned char keycode){unsigned char i;for(i=7;i>=0;i--){key_buf[i]=key_buf[i-1]; //缓冲区内数据后移1位}key_buf[0]= keycode; //将键值送入缓冲区key_COUNT++; //按键计数器加一}//-----------------------函数声明,变量定义-------------------------------------------------------- #include <reg51.h>#define KEY P1sbit DATA="P3"^1; //数据线sbit CLK="P3"^2; //时钟线unsigned char key_buf[8]; //按键缓冲区unsigned char key_COUNT; //按键计数器//--------------------------------------------------------------------------------------------------// 函数名称:delay// 入口参数:N// 函数功能:延时子程序,实现(16*N+24)us的延时// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动//--------------------------------------------------------------------------------------------------void delay(unsigned int N){int i;for(i=0;i<N;i++);}//--------------------------------------------------------------------------------------------------// 函数名称:CAL_jiaoyan// 函数功能:计算校验位//--------------------------------------------------------------------------------------------------bit CAL_jiaoyan(unsigned char byte_data){//}//--------------------------------------------------------------------------------------------------// 函数名称:SEND_byte// 函数功能:发送一子节数据//--------------------------------------------------------------------------------------------------void SEND_byte(unsigned char byte_data){unsigned char i,temp;if(CLK==0) //时钟线为低temp="byte"_data;CLK="1";DA TA="0";delay(0);CLK="0"; //发送起始位for(i=0;i<8;i++){delay(0);CLK="1";DA TA=(temp&0x01); //发送数据byte_data=byte_data>>1;delay(0);CLK=0;}delay(0);CLK="1";DA TA=CAL_jiaoyan(byte_data); //发送校验位delay(0);CLK=0;delay(0);CLK="1";DA TA=1; //发送结束位delay(0);CLK=0;}//-------------------------------------------------------------------------------------------------- // 函数名称:RECEIVE_byte// 函数功能:接收一子节数据//-------------------------------------------------------------------------------------------------- unsigned char RECEIVE_byte(){unsigned char byte_data,i;CLK="0";delay(0);CLK="1"; //接收起始位,丢弃for(i=0;i<8;i++){delay(0);CLK="0";delay(0);CLK=1;byte_data=byte_data>>1;if(DATA=1)byte_data=byte_data|0x80;elsebyte_data=byte_data&0x7F; //接收8位数据}for(i=0;i<2;i++){delay(0); //接收校验位和结束位CLK="0";delay(0);CLK=1;}return(byte_data);}//--------------------------------------------------------------------------------------------------// 函数名称:manage// 函数功能:主机命令处理函数//-------------------------------------------------------------------------------------------------- void manage(unsigned char rec_data){}//--------------------------------------------------------------------------------------------------// 函数名称:SEND_keydata// 函数功能:发送按键值到主机//-------------------------------------------------------------------------------------------------- void SEND_keydata(){unsigned char ASCII_code; //// ASCII_code=judge_key(key_buf[key_COUNT]); //判断键值,按键编码成ASCII码SEND_byte(ASCII_code);key_COUNT--;}//--------------------------------------------------------------------------------------------------// 函数名称:主程序// 函数功能:循环查询主机状态//-------------------------------------------------------------------------------------------------- void main(){unsigned char rec_data;while(1){if(CLK==0&&DATA==0){rec_data=RECEIVE_byte(); //接收主机键盘manage(rec_data); //指令处理函数}if(key_COUNT!=0&&CLK==1) //有按键等待处理//线路空闲SEND_keydata();}。
基于单片机的PS2键盘设计
PS2键盘在单片机上的应用摘要:在嵌入式PC应用系统中,作为人机交互设备的键盘,往往采用结构简单按键少的矩阵键盘。
标准键盘虽然能直接与嵌入式PC机的PS/2接口相连,但是体积大,按键多,不能满足需求,本文提出用一种AT89C52单片机实现具有标准PS/2接口的矩阵键盘,具有便捷,实用的特点。
关键词:PS/2接口,PS/2键盘,拨号键,AT89C52,LCD1602Abstract:PS/2 interface is one of the most useful mouse interface.It was IBM’s patent named osulum before. It is the dedicate interface of mouse and keyboard. This text implied a plan using PS/2 to make a system. PS/2 tansmit the data which was pressed, and AT89C52 receive it ,disposed it and transmit it to Lcd1602. Lcd1602 discover it to make us know which key has been pressed. PS/2 simulate a phone’s dial keyboard. This system’s feature is the circuit is sample and useful.Keywords:PS/2 keyboard, AT89C52, LCD1602,PS/2 interface,dial keyboard目录1、前言 (1)2、整体方案设计 (2)2.1方案论证 (2)2.2方案比较 (3)3、单元模块设计 (4)3.1PS2键盘模块 (4)3.2单片机模块 (6)3.3LCD显示模块 (7)4、软件设计 (9)5、系统技术指标及精度和误差分析 (10)6、结论 (11)7、设计小结 (12)8、致谢 (14)9、参考文献 (14)附录1:电路总图 (15)附录2:仿真图 (16)附录3:软件代码 (17)1、前言单片机因其性价比高, 处理能力强, 且抗干扰能力好, 在医疗器械、机电液控制、数据传输等各类工控系统和设备仪器中得到广泛应用。
矩阵键盘程序设计
矩阵键盘程序设计一、介绍矩阵键盘是一种常见的输入设备,通常由多个行和列组成。
每个键都和一个特定的行列交叉点相连,通过检测行和列的连接状态来判断按下的是哪个键。
本文档将介绍如何设计一个基于矩阵键盘的程序。
二、硬件要求为了实现矩阵键盘程序,我们需要以下硬件设备:1-矩阵键盘:包括行和列连接点,每个键与一个特定行列连接。
2-微控制器:用于检测行列的连接状态,并处理按键输入。
3-连接线:连接矩阵键盘和微控制器的电缆。
三、程序设计步骤设计一个矩阵键盘程序的基本步骤如下:1-初始化:设置微控制器的输入输出引脚,并配置矩阵键盘的行列连接点。
2-扫描键盘:循环扫描每个连接点,判断是否有按键按下。
3-按键处理:如果有按键按下,触发相应的事件或执行相应的操作。
4-循环:重复进行扫描和处理,实现实时响应。
四、初始化设置在程序的启动阶段,需要进行初始化设置以准备矩阵键盘的使用。
1-设置输入输出引脚:将微控制器上的引脚设置为输入或输出模式,以便连接矩阵键盘和其他设备。
2-配置连接点:设置行和列的连接点,将矩阵键盘的每个键与特定的行列连接。
五、扫描键盘扫描矩阵键盘是检测按键状态的关键步骤。
1-选定一行:将矩阵键盘的行连接点设置为高电平,其他行连接点设置为低电平。
2-读取列状态:读取每一列连接点的状态,判断是否有按键按下。
3-判断按键:根据读取到的列状态,确定按下的是哪个键。
可以使用一个矩阵或查找表来管理键和行列交叉点之间的对应关系。
六、按键处理一旦检测到按键按下,程序需要触发相应的事件或执行相应的操作。
1-事件处理:例如,如果按下的是数字键,则触发相应数字的事件。
2-操作执行:例如,如果按下的是功能键,则执行相应的功能。
七、附件本文档涉及的附件包括以下内容:1-矩阵键盘的电路图:详细描述了键盘的连接方式和连接点的布局。
2-微控制器的引脚分配表:列出了微控制器上各个引脚与矩阵键盘的连接方式。
八、法律名词及注释1-版权:对于矩阵键盘的设计,可能涉及版权保护的内容,需要遵守相关法律法规。
矩阵键盘程序设计
矩阵键盘程序设计矩阵键盘程序设计一、简介矩阵键盘是一种常见的输入设备,可以通过按下不同的按键来输入各种字符或执行特定的操作。
在本文档中,我们将介绍如何进行矩阵键盘的程序设计,包括矩阵键盘的原理、接口设计、按键扫描和按键处理等内容。
二、矩阵键盘原理矩阵键盘由多行和多列的按键组成,每个按键都相当于一个开关。
按下某个按键时,对应的行和列会产生一个接通信号,程序可以通过检测这个信号来判断哪个按键被按下。
三、接口设计在进行矩阵键盘程序设计之前,我们需要确定矩阵键盘与单片机之间的接口。
一般来说,矩阵键盘会采用行列交叉的方式进行接线,行引脚与单片机的输出端口相连,列引脚与单片机的输入端口相连。
四、按键扫描为了检测矩阵键盘是否有按键被按下,我们需要进行按键扫描。
按键扫描的原理是逐个地对每个按键进行检测,判断是否有按键被按下。
按键扫描的步骤如下:1. 将矩阵键盘的行引脚设置为输出模式,列引脚设置为输入模式;2. 逐个将行引脚置为低电平,检测列引脚的电平状态,如果某列引脚为低电平,则说明有按键被按下,记录下对应的行和列;3. 循环上述步骤,直到检测完所有的行和列。
五、按键处理在检测到按键被按下后,我们需要进行相应的按键处理。
按键处理的内容可以包括记录按键的值、执行特定的操作等。
按键处理的步骤如下:1. 根据记录的行和列信息,计算出对应的按键值;2. 根据按键值执行相应的操作,输入字符、调用某个函数等。
六、示例代码下面是使用C语言编写的一个简单的矩阵键盘程序示例:cinclude <stdio.h>// 矩阵键盘行列定义define ROWS 4define COLS 4// 矩阵键盘按键值定义char keys[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'', '0', '', 'D'}};// 按键扫描函数char scan_key() {char key = 0;int row, col;// 设置行引脚为输出模式,列引脚为输入模式 // 逐个检测每个按键是否被按下for (row = 0; row < ROWS; ++row) { // 将当前行引脚置为低电平// 检测列引脚的电平状态// 有按键被按下key = keys[row][col];break;}}return key;}int mn() {char key_pressed;while (1) {key_pressed = scan_key();if (key_pressed != 0) {printf(\。
经典的矩阵键盘扫描程序
经典的矩阵键盘扫描程序矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。
为了实现对矩阵键盘的扫描和输入响应,需要编写一个矩阵键盘扫描程序。
本文将详细介绍如何编写一个经典的矩阵键盘扫描程序。
1. 程序功能描述矩阵键盘扫描程序的主要功能是实现对矩阵键盘的扫描,并根据按键的状态进行相应的处理。
程序需要实现以下功能:- 扫描矩阵键盘的按键状态;- 根据按键状态进行相应的处理;- 输出按键的值或执行相应的操作。
2. 程序设计思路矩阵键盘通常由多行多列的按键组成,每个按键都有一个唯一的行列地址。
程序的设计思路如下:- 初始化矩阵键盘的引脚和状态变量;- 循环扫描矩阵键盘的按键状态;- 检测按键状态变化,并根据变化进行相应的处理;- 输出按键的值或执行相应的操作。
3. 程序代码示例下面是一个简单的矩阵键盘扫描程序的代码示例:```#include <stdio.h>#include <stdbool.h>// 定义矩阵键盘的行列数#define ROWS 4#define COLS 4// 定义矩阵键盘的引脚int rowPins[ROWS] = {2, 3, 4, 5}; int colPins[COLS] = {6, 7, 8, 9}; // 定义矩阵键盘的按键值char keys[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'*', '0', '#', 'D'}};// 初始化矩阵键盘void setup() {// 设置引脚模式为输入for (int i = 0; i < ROWS; i++) { pinMode(rowPins[i], INPUT); }// 设置引脚模式为输出for (int i = 0; i < COLS; i++) {pinMode(colPins[i], OUTPUT);}}// 扫描矩阵键盘void scanKeypad() {for (int i = 0; i < COLS; i++) {// 将当前列引脚设置为高电平digitalWrite(colPins[i], HIGH);for (int j = 0; j < ROWS; j++) {// 检测当前行引脚的状态bool state = digitalRead(rowPins[j]); // 如果按键状态发生变化if (state != lastState[i][j]) {// 更新按键状态lastState[i][j] = state;// 如果按键被按下if (state == LOW) {// 输出按键的值Serial.println(keys[j][i]);// 执行相应的操作switch (keys[j][i]) {case '1':// 执行操作1break;case '2':// 执行操作2break;// 其他按键的操作}}}}// 将当前列引脚设置为低电平 digitalWrite(colPins[i], LOW); }}void loop() {// 扫描矩阵键盘scanKeypad();// 延时一段时间,避免频繁扫描delay(10);}```4. 程序运行结果编写完成矩阵键盘扫描程序后,可以将程序上传到相应的开发板或单片机上进行测试。
按键程序
作者:hexiaoxiao栏目:单片机
我用C51做的键盘程序,望大家批砖
该程序没有被仿真过,可能有一些错误.不过编译是;intrins.h>
#include<reg51.h>
#define uCHAR unsigned CHAR
if(state!=0x0F) //Óмü°´ÏÂ
{
SWITCH(state)
{
case 0x0E:
key=(0x4-i)*0x4+0x1;
break;
case 0x0D:
key=(0x4-i)*0x4+0x2;
break;
case 0x0B:
{
delayms();
if((P0&0x0f)!=0x0f) //确认有键按下
{
for(i=0;i<4;i++) //扫描4行
{
P0=m; //从P0.4=0(第一行)开始扫描
if(KEY_A==0) //列1有效
{
h=h+1; //算出列1键盘值
flag0=1;
while(KEY_A==0) //等待按键松开
11楼:>>参与讨论
作者:fushaobing于2005-4-15 17:32:00发布:
--------------------------------------------------------------------------------
TO xwj:
你的意思是不是这样:把键盘扫描放在定时中断子程序中(定时周期约10ms),可以用两次中断的时间间隔来去抖动,可以引入“键龄”的概念来实现连击的处理(在中断中使键龄减1)。例如,如果设“键龄=25”,则每25*10=250ms操作一次按键。
一、 独立式键盘接口电路及程序设计
; 选择边沿触发方式 ; 允许外部中断0 ; 允许CPU中断 ; 送8155命令口地址
; 控制字写入 ; 模拟主程序
ORG 0120H
; 中断服务程序
KEYJMP:MOV R3, #08H
; 设循环次数
MOV DPTR,#0EF01H ; 送A口地址
MOV R4, #00H
; 计数器清零
MOVX A, @DPTR ; 读入按键状态
一、 独立式键盘接口电路及程序设计
首先判断有无键按下; 若检测到有键按下,延时10ms避开抖动的影响,查询是哪 一键被按下并执行相关的操作。 然后再用软件查询等待按键的释放,当判明键释放后,用 软件延时10ms后再返回。
第二次延时的作用是: 一方面避开按键释放时触点 抖动的影响;另一方面也具 有防连击的功能。
二状态分析法设计键盘分析程序的设计32led321led显示原理322七段led显示及接口323点阵led显示及接口led即发光二极管它是一种由某些特殊的半导体材料制作成的pn结由于参杂浓度很高当正向偏置时会产生大led显示器具有工作电压低体积小寿命长约十万小时响应速度快小于1s颜色丰富红黄绿等等特点是智能仪器最常使用的显示器
SB0: … … ; 转相…应…功能处理
SB1;:入J口…MP地…址K表EYRET ……
JMP KEYRET ……
AJMP SB4
……
AJMP SB5
SB7: … …
AJMP SB6
……
AJMP SB7
JMP KEYRET
;S0键功能程序 ;S0键执行完返回 ;S1键功能程序
;S7键功能程序
二、 矩阵式键盘接口电路及程序
能完成上述工作的程序清单如下:
ORG 0000H AJMP MAIN ORG 0003H AJMP KEYJMP
嵌入式系统下按键操作的软件设计方法
嵌入式系统下按键操作的软件设计方法嵌入式系统键盘软件设计存在3方面问题:软件去抖动、等待按键抬起和连击处理。
1嵌入式系统键盘软件设计的3个问题1.1软件去抖动问题一次完整按键过程的时序波形如图1所示。
当按键未被按下时,单片机端口输入为通过上拉电阻获得的高电平;按下时,端口接至地,端口输入为低电平。
当机械触点断开、闭合时会有抖动,这种抖动对人来说是感觉不到的,但对计算机来说,则是完全可以感应到的。
计算机处理的速度是us级,而机械抖动的时间至少是ms级,对计算机而言,这已是漫长的时间了。
为使单片机能正确地读出端口的状态,对每一次按键只作一次响应,这就必须考虑如何去除抖动的问题。
嵌入式系统一般采用软件延时去除抖动。
软件延时去除抖动其实很简单,就是在单片机获得端口有按键动作时,不是立即认定按键开关已被按下,而是延时10 ms 或更长一段时间后再次检测端口,如果仍为动作电平,则说明按键开关的确按下了,这实际上是避开了按键按下时的抖动时间;而在检测到按键释放后(端口为高)再延时5~10 ms,消除后沿的抖动,然后再对键值处理。
当然,实际应用中对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是软件延时去除抖动的基本原则。
1.2等待按键抬起问题单片机在查询读取按键时,不断地扫描键盘,扫描到有键按下后,进行键值处理。
它并不等待键盘释放再退出键盘程序,而是直接退出键盘程序,返回主程序继续工作。
计算机系统执行速度快,很快又一次执行到键盘程序,并再次检测到键还处于按下的状态,单片机还会去执行键值处理程序。
这样周而复始,按一次按键系统会执行相应处理程序很多次。
而程序员的意图一般是只执行一次,这就是等待按键抬起问题。
通常的解决办法是,当按键抬起后再次按下才再次执行相应的处理程序,等待时间一般在几百ms以上。
通常在软件编程中,当执行完相应处理程序后,要加一个非常大的延时函数,再向下执行。
对于软件去抖动问题和等待按键抬起问题,若采用软件延时,会大大削弱系统的实时性;若采用中断方式延时,会占用定时器,耗费了系统资源,且软件的多任务编程会增大软件设计的复杂度。
第六章键盘鼠标的程序设计
第6章键盘、鼠标的程序设计本章学习目标通过本章学习应理解VB可视化程序设计的中事件驱动程序设计的概念;理解鼠标、键盘事件的触发机制;掌握对鼠标和键盘进行编程的基本技术;掌握窗体与常用组件的重要键盘事件和鼠标事件;初步学会对一些常用VB组件进行程序设计,实现事件驱动的鼠标拖放功能和OLE的鼠标拖放功能。
在前面我们已经学习了通用过程和一些常用的事件过程,那么在本章,我们继续学习键盘和鼠标的有关事件过程。
在键盘事件的过程中可以处理当按下或释放键盘上某个按键时所执行的一些操作。
而鼠标的事件过程可以用来处理鼠标按钮和光标位置移动有关的一些操作。
Windows程序的工作模式,称为事件(也称消息)驱动方式。
所谓“事件”,是指作用于某个对象上的一种操作或动作,如运行程序时用鼠标单击窗体上菜单条的某个命令项时,“单击”(Click)这个动作就是作用在该命令项上的一个事件,也可以描述为该命令项发生了Click事件,当双击窗体上的某个命令按钮时,“双击”(Dblclick)就是作用在该命令按钮上的一个事件。
VB中的每个对象通常都可以响应多个不同的事件。
VB应用程序除了能响应鼠标的单击(Click)和双击(DbClick)事件外,还能响应多种其他鼠标事件和键盘事件。
本章主要介绍VB对象能够识别的3种键盘事件:KeyPress、KeyDown、KeyUp事件和3个鼠标事件:MouseDown、MouseUp、MouseMove事件。
此外,VB应用程序还可同时支持事件驱动的鼠标拖放功能和OLE的鼠标拖放功能。
本章介绍了VB提供的用于鼠标拖放操作处理的DragMode和DragIcon属性、Drag方法、DragOver和D)ragDrop事件。
同时,简要介绍了VB所支持的OLE拖放的实现方法。
6.1 键盘事件键盘事件是用户敲击键盘时触发的事件。
通常对于接受文本输入的控件,在键盘事件中进行编程检测输入数据的合法性或对于不同键值的输入实现不同的操作。
FPGA矩阵键盘课程设计
逻辑仿真与调试
调试工具:使用调试工具对 FPGA矩阵键盘进行调试, 找出并解决设计中的问题
逻辑仿真:使用仿真软件对 FPGA矩阵键盘进行逻辑仿 真,验证设计是否正确
仿真结果分析:分析仿真结 果,找出设计中存在的问题,
并进行修改
调试结果分析:分析调试结 果,找出设计中存在的问题,
并进行修改
FPGA矩阵键盘驱动程序开 发
FPGA矩阵键盘软件设计
软件算法设计
键盘扫描算法:实现键盘矩阵的 扫描和按键检测
键值转换算法:将扫描到的键值 转换为对应的字符或功能键
键盘响应算法:处理键盘输入, 实现按键响应和功能键处理
键盘驱动程序设计:实现键盘的 驱动程序,支持键盘的初始化、 扫描、键值转换和响应等功能
VHDL/Verilog语言实现
FPGA芯片:选择合适的 FPGA芯片,如Xilinx或 Altera
驱动电路:设计键盘驱动电 路,如LED背光、按键反馈
等
电源管理:设计电源管理电 路,如电源输入、电源转换
等
硬件调试:进行硬件调试, 确保键盘功能正常
元器件选型
FPGA芯片:选择合适的 型号和品牌,如Xilinx、 Altera等
游戏机中的矩阵键盘用于控制游戏 角色或操作游戏界面
矩阵键盘可以提高游戏操作的准确 性和响应速度
添加标题
添加标题
添加标题
添加标题
矩阵键盘可以提供多种按键组合, 实现复杂的游戏操作
矩阵键盘在游戏机中的使用可以提 高用户体验和游戏乐趣
矩阵键盘在医疗设备中的应用
矩阵键盘可以提供多种功能, 如输入密码、选择菜单、调 整参数等
未来发展方向与展望
技术发展趋势:FPGA技术的不断发展和更新,如更高性能、更低功耗等 应用领域拓展:FPGA在更多领域的应用,如人工智能、物联网等 课程设计优化:课程设计的不断优化和完善,提高教学质量和效果
《键盘程序设计》课件
键盘性能调试
01
02
03
04
调整按键响应速度
根据个人使用习惯,调整按键 的响应速度。
调整按键触发力度
调整按键的触发力度,使其更 适合个人手感。
调整背光亮度
如果键盘带有背光,调整背光 亮度以满足不同使用场景。
调整音量调节
如果键盘带有音量调节功能, 确保其能正常工作。
键盘故障排除
检查连接线
确保键盘连接线无破损、无松动,尝试更换 连接线排除故障。
按键开关设计
每个按键对应一个开关, 通过电路连接实现按键触 发。
接口设计
提供USB、PS/2等接口, 方便与电脑连接。
键盘材料选择
按键材料
选择手感舒适、耐用、不易磨损的材料,如硅胶或橡胶。
外壳材料
选择轻便、坚固、耐用的材料,如ABS塑料或金属。
线材选择
选择质量好、耐用的线材,确保键盘与电脑之间的连接稳定可靠 。
重置键盘默认设置
检查键盘的驱动程序是否为最新版本,必要 时更新驱动程序。
软件驱动更新
尝试将键盘恢复出厂设置,看是否能解决问 题。
专业维修
如以上方法均无效,可寻求专业维修人员的 帮助。
05
键盘设计案例分析
机械键盘设计案例
总结词
机械键盘是采用机械轴作为开关的键盘,具有手感好、寿命长的特点。
详细描述
机械键盘的按键下方通常有一个独立的机械轴,当按下按键时,机械轴会触发开关,产生相应的信号。由于每个 按键都有独立的机械轴,因此机械键盘的手感通常比薄膜键盘更加出色,按键的响应也更加迅速。此外,由于机 械键盘的机械轴结构复杂,因此其寿命通常比薄膜键盘更长。
03
键盘软件编程
键盘扫描程序编写
键盘输入子程序流程图设计
图 4-4 为键盘输入子程序流程图,首先开始,是否有键闭合,如有跳入二次 调用子程序 12MS,如没有调用显示子程序延迟 6ms 再返回。二次调用后,是否 再有键闭合,如有判断闭合建号-栈,如没有跳到第一次检测键闭合。再次检测 闭合键释放否,如释放键入键号-A,如没有调用显示子程序延迟 6ms 返回闭合键 释放检测[14]。最后返回。
开始
Y 有键闭合否
N 调用子程序 延时 6ms
调用子程序 延时 12ms
N 有键闭合否 Y
判断闭合键号→栈
N 闭合键释放否
Y 输入键号→A
返回
图 4-4 为键盘输入子程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return(88);
3.3.3 利用延时程序防止键盘抖动, 实现键盘输入
按键按下产生的抖动现象持续的时间不会很久, 因此在按键按下后,可延时一段时间跳过抖动, 再对按键的状态检测,从而实现键盘输入。本案 例完成通过两个键盘设计,实现对数码管显示数 据的调整。
一、电路原理
在单片机最系统的基础上,KEY1、KEY2两个键 盘一端分别接P3.0、P3.1,另一端接地,见图3-32所示。数码管仍使用共阳型。在Proteuse软件中, 按键的英文名字为BUTTON,在Switches & Relasy 下的Switches里。
if(P1 != P_scan[i])
//延时一段时间后,分析一下P1口是什么数据
{ for(j = 0;j<16;j++) //如果P1口上的数据与键盘临时数据相同,输出临
时键值
{
if(P1 == key_temp[j])
return(j);
}
}
eles
//如果没有按键按下,输出没有按键按下标志“88”
void main(void) { char i;
while(1) {
key_scan(); if(key1_state = 1) { i++;
key1_state = 0; if(i>9) i = 0; } if(key2_state = 1) { i--; key2_state = 0; if(i < 0) i = 9; } P0 = seven_seg[i]; } }
3.3.1 键盘抖动现象
按键按下都会发出一声响,谁然有的按键 声音很轻微,但这都是导体碰撞产生的震 动。这种现象称为键盘抖动。如果不对键 盘的抖动进行处理,按键会对系统电路或 程序产生意外的干扰。为了观察按键的抖 动现象,我们先做一个小实验,分析一下 一个微触按键产生抖动对系统的影响。
加数计数小系统
从图中可以了解到,按键按下的瞬间由于震 动会是按键内部的导体稳定接触,而是在导 通和不导通之间来回弹跳,虽然时间一瞬间, 但使CP端获得了多个电平的上升沿。按键抖 动时间的长短由按键的机械特性决定,一般 为5ms~10ms。因此不能直接把按键作为1个 脉冲的输入。
在数字电路中,常利用触发器消除键盘抖动, 但在单片机系统中,按键可以直接接在单片 机的I/O口上,常利用键盘程序来消除键盘的 抖动现象。
uchar key1_down_state, key1_up_state,
//变量声明,初始值为0
……
if(key1== 0)
{delay(200)
if(key1== 0)keydownstate = 1; //如果按键按下,按下状态变量 为1
}
if(key1 == 1 && keydownstate = 1) //如果按键按下又放开
3.把键盘扫描key_scan()函数放在主函数的 while循环体中,程序执行时会断调用 key_scan(),如果没有按键按下,执行 key_scan()的时间很短,如果有按键按下, 用于按键扫面函数又调用了延时函数,程 序执行时间会变长。
3.3.4 4×4键盘程序设计
4×4键盘16键盘阵列,本案例采用P1口完成, 见图3-3-5所示,把P18条I/O口分成4条列线4条行 线交叉但不接触,16个按键放置交叉位置,在单 片机复杂系统需要较多按键时,这种接法可以节 省单片机的硬件资源。键盘和P1口之间采用总线 连接布局,在电路原理设计过程中,总线只是图 示引脚之间的相连接关系,但不具有电气连接特 性,相连引脚之间需要标注相同的网络标号采用 电气连接特性,如图3-3-5中,单片机的P1.0与键 盘阵列上的P1.0相连。在设计单片机系统或其它 电子系统时,由于器件引脚较多,器件与器件之 间会经常采用总线连接,并且把电路模块化设计。
//如果按键按下
{ delay(200);
//延时一段时间,消除键抖
while(key1 == 0) key1_state = 1;
//再对按键检测,如果确实按
下,按键状态变量为1
}
if(key2 == 0)
{ delay(200);
while(key2 == 0)
key2_state = 1;
}
}
//调用键盘扫描函数 //判断键盘状态变量,如1,说明有按键按下
//显示数据增加 //数据增加后,键盘状态变量清零
//数据增加超过9后,回到0
//显示键盘调整数据
三、程序说明
1.如果按键按下不放开,程序一直执行语句 while(key1 == 0),这时程序在此处死循环, 不能执行其它程序,所以本案例按键抬起后 数据才能得到调整。此种编程方法并不影响 单片机驱动1个数码管工作,但动态显示电路 在此种情况下不能正常工作。如果把while改 换成if,按键只要按下数据就能调整,但如 果按下不放开按键,数据自动快速增加或减 小。如果按键按下既不让程序死循环,也不 让由于按键按的时间过长而数据调整失控, 最可靠的办法是利用变量记忆按键按下和放 开的两种状态,根据判断实现键盘输入。程 序如下;
3.3.2 利用外部中断INT0实现键盘输入
本案列利用外部中断INT0作为键盘输入端,当按 键按下时,让单片机执行外部中断服务程序,在 中断服务中完成键盘控制。
一、参考电路
在最小系统基础上,单片机的P0.0口接一只 LED,键盘接在P3.2端口,按键不按时,由于P3.2 接有上啦电阻R3,所以P3.2此时为高电平+5V, 如果按键按下,P3.2电源地短路,P3.2为低电平。 为了消除键盘抖动现象,键盘两端并联滤波电容 器C4。
//INT0中断1次,i值改变1次
LED = i;
//INT0中断1次,LED工作状态变化1次
delay();
//调用延时函数
}
void main(void)
{ LED = 0;
//芯片初始化时,LED灭
EA = 0;
EX0 = 1;
//开启INT0中断
PX0 = 1;
//INT0中断优先,可以省去
二、程序设计
#include<reg51.h>
#define uchar unsigned char
code uchar P_scan[] = {0x01,0x02,0x04,0x08};
//键盘行扫描临时数值
code uchar key_temp[] = {0x11,0x12,0x14,0x18 //键盘按下得到的临时数据
EA = 1;
//开启总中断开关
while(1);
//等待按键按下,中断发生
}
三程序说明
这里没有设置INT0是下降沿触发中断或是低电平触发中断, 原因是按键按下,不管产生不产生键抖现象,总能使INT0 引脚产生1个下降沿和低电平。如果设置只有下降沿才触 发INT0中断,需要利用设置计时器控制寄存器TCON的 IT0 = 1位,按键按下是否产生中断,可以利用程序检测 TCON的IE0位。利用外部中断触发作为按键输入很好的解 决了键盘抖动问题。如果需要多个键盘,把INT0口与I/O 口之间用键盘连接,I/O输出低电平扫面信号即可。在数 码管动态显示电路中,为了节省硬件资源,可以在INT0口 和P2口之间接入键盘,实现8只按键输入。
键盘程序设计
按键是一种开关,通过外界作用力,导电金属或导 电非金属接触与分离实现电路通断的控制是按键的 基本机械原理,如计算机键盘、手机、MP3以及电 子表按键。按键是计算机系统输入设备,也是人机 信息交换的主要途径。 按键按下会产生抖动现象,不能安全有效的对系统 控制,本节根据按键产生的抖动机理,提出以中断、 延时等措施消除键盘输入过程中的不稳定因素,实 现单片机系统键盘的稳定输入。
if(key_count == 0 && key == 0); key_flog = 1; } eles if(key == 0)key_count = times; }
2.利用按键调整数据时,有时会调整过量, 需要进行判断重置。本案例i为char型变量,
数值在—128~127之间,语句if(i>9) i = 0是向 上增加过量复位。
sbit key1 = P3.0;
sbit key2 = P3.1;
uchar key1_state,key2_state;
//按键按下的状态变量
void delay(uchar i)
{ while (i) i--; }
void key_scan (void)
//键盘扫描函数
{ if(key1 == 0)
图 3-3-4 利用延时函数消除键盘抖动实现键盘输入电路
二、程序设计
#include<reg51.h>
#define uchar unsigned char
code uchar seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
0x21,0x22,0x24,0x28
0x41,0x42,0x44,0x48
0x81,0x82,0x84,0x88};
code uchar seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uchar i)
图3.3.1
图3.3.2
在图3-3-1所示的一个加数计数小系统中,设 计数器的脉冲输入端CP为上升沿有效,加计 数器初始显示为0。按键不按时,CP = 0,计 数器不加1计数。一般认为:按键按下,CP
端由低电平变为高电平,含有电平上升沿,
计数器加1计数,并且按下1次,计数器加1。 实际实验时会发现,按键按下1次,计数器不 是加1,而是跳跃一次性增加3或4。原因是按 键按下在导体接触的瞬间产生了震动。图33-2是按键按下过程中CP端实际电平改变情况。 T1为不按按键时刻,T2为按键按下瞬间的抖 动,T3为按键按下稳定时刻,T4为按键放开 时刻瞬间,T5为按键放开时刻。