1、一般都不在键盘程序中延时,而是通过隔一段时间调用(
电脑键盘输入延迟故障及解决方法

电脑键盘输入延迟故障及解决方法在使用电脑时,经常会碰到键盘输入延迟的问题。
这种问题会导致打字速度变慢,影响工作效率和用户体验。
今天我们就来了解一下键盘输入延迟的故障原因以及解决方法。
一、故障原因分析1. 驱动程序问题:键盘驱动程序可能受到损坏、过时或冲突等问题影响,导致系统无法顺利读取键盘输入信号。
2. 资源占用过高:在运行大型程序或游戏时,系统可能会将资源集中分配给这些程序,导致键盘输入信号被延迟读取。
3. 病毒或恶意软件:电脑感染病毒或恶意软件可能会导致系统异常,其中包括键盘输入延迟的问题。
4. 键盘硬件故障:键盘的物理问题,如键盘线松动或键盘接触不良,都可能导致输入延迟。
二、解决方法1. 更新驱动程序:检查并更新键盘驱动程序是解决输入延迟的第一步。
可以通过访问电脑制造商的官方网站或设备管理器来获得最新的驱动程序,并按照提示进行安装。
2. 关闭资源占用程序:运行大型程序或游戏时,其他软件可能会对系统资源产生竞争。
在出现输入延迟问题时,可以尝试关闭其他占用大量资源的程序,以释放系统资源。
3. 扫描病毒和恶意软件:使用安全软件对电脑进行全面扫描,确保没有病毒或恶意软件感染。
如果发现有问题,按照安全软件的提示清除病毒或恶意软件。
4. 清洁键盘:如果键盘有物理故障,可以尝试清洁键盘以解决输入延迟问题。
使用合适的清洁工具,如吸尘器或键盘清洁剂,定期清洁键盘的表面和键位间的空隙。
5. 更换键盘:如果以上方法都无法解决输入延迟问题,可能是键盘硬件损坏所致。
此时最好的解决办法就是更换新的键盘。
总结电脑键盘输入延迟问题可能由各种原因引起,包括驱动程序问题、资源占用过高、病毒或恶意软件感染以及键盘硬件故障。
解决这一问题的方法包括更新驱动程序、关闭资源占用程序、扫描病毒和恶意软件、清洁键盘以及更换键盘。
通过采用这些解决方法,我们可以有效地解决键盘输入延迟故障,提高使用体验和工作效率。
希望以上内容对解决电脑键盘输入延迟故障有所帮助。
河南理工大学《微型计算机控制技术》课后题答案优选全文

稳定性。
原理:模拟量开关AS闭合时,进入采样状态(跟踪),由于A1输出阻抗小,A1输出端给电容快速充电,输出跟随输入变化;模拟开关AS断开时,进入保持状态,由于A2输入阻抗大,输入电流几乎为0,保持输出端的电压值不变。
不是,对于输入信号变化很慢,如温度信号;或者A/D转换时间较快,使得在A/D转换期间输入信号变化很小,在允许的A/D转换精度内,就不必再选用采样保持器。
补充:模拟量输入通道由哪些部分组成?各部分的作用是什么?答:模拟量输入通道一般由I/V变换、多路转换器、采样保持器、A/D转换器、接口及控制逻辑电路组成。
(1)I/V变换:提高了信号远距离传递过程中的抗干扰能力,减少了信号的衰减,为与标准化仪表和执行机构匹配提供了方便。
(2)多路转换器:用来切换模拟电压信号的关键元件。
(3)采样保持器:A/D转换器完成一次A/D转换总需要一定的时间。
在进行A/D转换时间内,希望输入信号不再变化,以免造成转换误差。
这样,就需要在A/D转换器之前加入采样保持器。
(4)A/D转换器:模拟量输入通道的任务是将模拟量转换成数字量,能够完成这一任务的器件,称为之模/数转换器(Analog/Digital Converter,简称A/D转换器或ADC)。
采样保持器有什么作用?试说明保持电容的大小对数据采集系统的影响。
答:采样保持器的作用:A/D转换器完成一次A/D转换总需要一定的时间。
在进行A/D转换时间内,希望输入信号不再变化,以免造成转换误差。
这样,就需要在A/D转换器之前加入采样保持器。
保持电容对数据采集系统采样保持的精度有很大影响。
保持电容值小,则采样状态时充电时间常数小,即保持电容充电快,输出对输入信号的跟随特性好,但在保持状态时放电时间常数也小,即保持电容放电快,故保持性能差;反之,保持电容值大,保持性能好,但跟随特性差。
补充:A/D转换器的结束信号有什么作用?根据该信号在I/O控制中的连接方式,A/D 转换有几种控制方式?它们在接口电路和程序设计上有什么特点?答:A/D转换器的结束信号的作用是用以判断本次AD转换是否完成。
2022年哈尔滨理工大学计算机应用技术专业《计算机系统结构》科目期末试卷A(有答案)

2022年哈尔滨理工大学计算机应用技术专业《计算机系统结构》科目期末试卷A(有答案)一、选择题1、在操作系统机器级,一般用()程序()作业控制语句。
A.汇编程序,翻译B.汇编程序,解释C.机器语言,解释D.机器语言,翻译2、CRAY-I的流水线是( )A.多条单功能流水线B.一条单功能流水线C.多条多功能流水线D.一条多功能流水线3、对系统程序员不透明的应当是( )。
A.Cache存贮器XB.系列机各档不同的数据通路宽度C.指令缓冲寄存器D.虚拟存贮器4、目前,MO由()实现,M1用()实现,M2至M5大多用()实现。
A.软件,固件,硬件B.固件,软件,硬件C.硬件,软件,固件D.硬件,固件,软件5、若输入流水线的指令既无局部性相关,也不存在全局性相关,则()。
A.可获得高的吞吐率和效率B.流水线的效率和吞吐率恶化C.出现瓶颈D.可靠性提高6、计算机系统的层次结构按照由高到低的顺序分别为()。
A.高级语言机器级,汇编语言机器级,传统机器语言机器级,微程序机器级B.高级语言机器级,应用语言机器级,汇编语言机器级,微程序机器级C.应用语言机器级,传统机器语言机器级,汇编语言机器级,操作系统机器级D.应用语言机器级,操作系统机器级,微程序机器级,传统机器语言机器级7、1TFLOPS计算机能力,1TBYTE/S的I/O带宽和()称为计算机系统的3T性能目标。
A,1TBYTE 硬盘容量B.1TBYTE 软盘容量C.1TBYTE 主存容量D.A和B8、传统机器语言机器级,是用()来()机器指令。
A.硬件,翻译B.编译程序,翻译C.微指令程序,解释D.微指令程序,翻译9、在计算机系统设计中,比较好的方法是()。
A.从上向下设计B.从下向上设计C.从两头向中间设计D.从中间开始向上、向下设计10、高级语言程序经()的()成汇编语言程序。
A.编译程序,翻译B.汇编程序,翻译C.汇编程序,解释D.编译程序,解释二、判断题11、计算机仿真用微程序解释,计算机模拟用机器语言解释。
[专升本(地方)考试密押题库与答案解析]浙江省专升本计算机基础分类模拟12
![[专升本(地方)考试密押题库与答案解析]浙江省专升本计算机基础分类模拟12](https://img.taocdn.com/s3/m/341ac3c1915f804d2a16c1c7.png)
答案:B[考点] 计算机基础知识
[解析] 可以关闭打印的进程,而不是关闭电源。
问题:27. 如果不记得刚编辑过的文件的存放位置,则再也无法找到它。
答案:B[考点] 计算机基础知识
[解析] 可以根据相关信息在“搜索框”中进行搜索,找到所需文件或文件夹。
问题:8. 资源管理器主要作用是用于组织和管理磁盘中的文件。
答案:A[考点] 计算机基础知识
[解析] 文件或文件夹的创建、打开、移动、复制、删除、重命名都可以使用“资源管理器”实现。
问题:9. Windows 7是多任务操作系统,所以可以用计算机一边播放视频,一边进行其他操作。
答案:A[考点] 计算机基础知识
答案:A[考点] 计算机基础知识
[解析] 也可以在桌面生成快捷方式。
问题:5. 任务栏只能放在桌面底部,不能放在其他地方。
答案:B[考点] 计算机基础知识
[解析] 可以放在桌面的底部、顶端、左侧和右侧。
问题:6. 在Windows中可使用长文件名,但文件名不能包含空格。
答案:B[考点] 计算机基础知识
答案:B[考点] 计算机基础知识
[解析] 正常选择、忙碌、链接选择、帮助等状态下,鼠标光标的表现形式并不一样。
问题:3. 按Alt+F6组合键可快速退出当前执行的Windows应用程序窗口。
答案:B[考点] 计算机基础知识
[解析] 退出应用程序窗口使用Alt+F4组合键。
问题:4. 一般应用程序在安装完毕后,会自动在程序菜单中建立快捷方式文件夹,以方便启动应用程序。
[解析] “写字板”建立的文件默认扩展名是.rtf。
单片机基础及应用项目四课后习题及答案

1.设计8个按键控制8个LED灯闪烁,比如K1按下对应的发光二极管LED1亮,依次类推,要求采用外部中断实现按键按下的检测。
电路:
程序
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P2
#define ANJIAN P0
void main()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
while(1);
}
void inter0(void) interrupt 0
{
LED=ANJIAN;
}
void inter1(void) interrupt 2
{
LED=ANJIAN;
2.独立式按键和矩阵式键盘分别具有什么特点?适用于什么场合?
答:独立按键特点是每个按键占用一条I/O线,当按键较少的场合。矩阵按键特点是电路连接复杂,软件编程较复杂,但I/O口利用率高,适合需要大量按键的场合。
3.C51的中断函数和一般的函数有什么不同?
A、98H B、84H C、42H D、22H
3.当CPU响应外部中断INT0的中断请求后,程序计数器PC的内容是(A)
A、0003H B、000BH C、0013H D、001BH
4.单片机C51中关键字(C)用来改变寄存器组
A、interrupt B、unsigned C、using D、reentrant
}
实物:
答:中断函数的定义格式:
函数类型函数名interrupt n using n
单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法在单片机的程序中,常常会遇到延时和中断的问题。
延时是指在程序中需要暂时停顿一段时间,而中断是指在程序执行过程中突然发生的事件,需要立即处理。
一、延时问题:单片机中的CPU速度非常快,一条指令可以在几十甚至几百纳秒内执行完毕。
在需要进行延时的情况下,不能直接使用空指令来实现延时,否则延时的时间将会非常短暂。
解决延时问题的方法如下:1. 软件延时:将一个循环执行的空指令放在一个循环中,通过多次执行该循环来实现延时。
这种方法实现简单,但由于CPU速度非常快,必须通过增加空指令的执行次数来实现较长的延时时间,不适用于需要精确延时的场合。
2. 硬件延时:通过外接的计时器或计数器来实现延时。
这种方法可以精确控制延时时间,但需要额外的硬件支持。
二、中断问题:1. 中断产生的条件:中断是指在程序执行过程中,某个特定的条件满足时,CPU会暂停当前的工作,转入到一个中断服务程序中去执行。
中断产生的条件可以是外部触发比如按键、定时器、串口通信等,也可以是内部触发比如指令执行错误、电源电压不稳等。
2. 中断服务程序的编写:中断服务程序是在中断发生时被调用的程序,需要在程序中事先编写好。
一般情况下,中断服务程序需要尽量短小,以免影响正常的程序执行。
在中断服务程序中,需要首先保存CPU的现场,然后根据中断源的不同进行相应的处理,最后恢复CPU的现场,继续原来的程序。
3. 中断优先级:当多个中断同时发生时,需要按照一定的优先级来处理。
在单片机中,可以通过设置中断的优先级寄存器来实现优先级的分配。
4. 中断的使能与屏蔽:有些中断是可以被屏蔽的,有些是不能被屏蔽的。
可以通过设置中断使能寄存器和屏蔽寄存器来控制中断的开启和屏蔽。
总结:延时和中断问题是单片机编程中常见的问题,解决这些问题需要合理地选择延时方法和编写中断服务程序。
在实际的应用中,需要根据具体的要求和硬件配置来选择最适合的解决方案。
需要注意中断的优先级和使能与屏蔽,以确保程序的正常运行。
教科版高中亻技术必修二信息系统与社会知识点总结

信息系统与社会一、信息系统的组成与功能1.信息系统信息系统(lnforn1ation System)是指由计算机硬件、网络和通信设备、计算机软件、信息资枙、信息用户和规章制度组成的以处理信息流为目的的人机一体化系统,简单地说,信息系统就是输入数据/信息,通过加工处理产生信息的系统,是人造系统。
2.信息系统的基本组成信息系统以人为主导,以计算机技术和网络技术为基础(硬件/软件、数据和通信方式),信息系统处理的对象是数据。
计算机网络则是实现资源共享和信息交换的重要基础。
3.信息系统的分类从系统结构组成的复杂程度来看,信息系统可分为简单系统、复杂系统和随机系统。
简单系统:特征是元素数目少,可以用较少的变量数来描述。
复杂系统:特征是元素数目较多,元素间存在着强烈的耦合作用。
随机系统:特征是元素和变量数虽多,但它们之间的耦合是微弱的或随机的。
以上三个系统并不是完全孤立的,一个复杂系统可以包含多个简单系统、随机系统。
4.信息系统具有五大基本功能:输入功能、存储功能、处理功能、输出功能和控制功能。
5.信息系统的功能类型事务处理系统(TPS): 收集各类事务数据并保存到数据库中供其他信息系统使用,一般都具有在线处理功能,能够远程提交或取消事务,如网络购物系统、票务系统、医院挂号系统、网约车系统等。
管理信息系统(MIS) : 是一个以人为主导,利用计算机硬件、软件、网络通信设备以及其他办公设备,进行信息的收集、传输、加工、储存、更新、拓展和维护的系统,如:校园—卡通系统、学生信息管理系统、图书管理系统等。
决策支持系统(DSS):针对决策问题支持决策活动的具有智能作用的人机系统,如临床决策支持系统、天气预报信息系统等。
专家系统(ES): 是一种在特定领域内具有专家水平解决问题能力的程序系统,通过知识库和“推理机“软件进行操作,最终得出决策、结论或建议,如车辆故障诊断专家系统、农作物病虫害诊断系统等。
二、计算机系统1.计算机系统由硬件系统和软件系统组成。
《Java程序设计任务驱动式教程 》习题答案

(1)下载并安装SDK软件包,尝试查看其中的JDK文档。
(2)简述Java虚拟机的概念,并说明Java虚拟机同Java的跨平台特性之间的关系。
答:Java虚拟机(Java Virtual Machine,JVM)是在一台计算机上用软件模拟也可以用硬件来实现的假想的计算机。
是软件模拟的计算机,它可以在任何处理器上(无论是在计算机中还是在其他电子设备中)安全兼容地执行保存在.class文件中的字节码。
字节码的运行要经过三个步骤:加载代码、校验代码和执行代码。
Java程序并不是在本机操作系统上直接运行,而是通过Java虚拟机向本机操作系统进行解释来运行。
这就是说,任何安装有Java虚拟机的计算机系统都可以运行Java程序,而不论最初开发应用程序的是何种计算机系统。
首先,JAVA编译器在获取JAVA应用程序的源代码后,把它编译成符合JAVA虚拟机规范的字节码class 文件(class文件是JVM中可执行文件的格式)。
JAVA虚拟规范为不同的硬件平台提供了不同的编译代码规范,该规范使JAVA软件独立于平台。
然后,JAVA解释器负责将JAVA字节码文件解释运行,为了提高运行速度,JAVA提供了另一种解释运行方法JIT,可以一次解释完,再运行特定平台上的机器码,这样就实现了跨平台、可移植的功能。
(3)使用JDK开发Java程序时,一般要设置环境变量,请说明WINDOWS系统环境下如何设置其环境变量,及各变量的作用。
答:在安装完JDK之后不能立刻使用,还需要设置环境变量。
设置环境变量的目的在于让系统自动查找所需的命令。
其具体步骤如下:1)右击“我的电脑”,在弹出的快捷菜单中选择“属性”选项。
2)在“系统属性”对话框中,选择“高级”选项卡,单击“环境变量”按钮,将会弹出如图1-6所示的对话框。
在该对话框中可以设置只有当前用户登录时才有效的用户变量,也可以设置该系统的所有用户登录时都有效的系统变量。
3)单击“系统变量”选项组下的“新建”按钮,打开“新建系统变量”对话框。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如10毫秒)来扫描按键,以尽量释放CPU 资源;2、所有键盘程序基本上都是一个模式,可以处理加速键、一键多功能等情况;3、对外接口只有2个,换用不同硬件的键盘只需把该键盘程序加入工程编译即可,其他不需要作任何改动,非常方便。
基本上都是一个模式:有键?--YES——和上次相同?--No--Keyold=0;退出| || YES--Keyold ;| || Keyold==首键延时KEYDELAY?--No--退出| || YES--Keyok=1; //按下不放一定时间发首键,后面发加速键| 保存键值到Keydata;(必要时译码)| Keyold=KEYDELAY-KEYLOOP(按住不放的延时);--退出|No--Keyold==0?--YES--退出|N0--Keyok=1; //不为0说明按了键再放开,当然作按键有效处理保存键值到Keydata;(必要时译码)Keyold=0;--退出所有键盘程序对外接口:unsigned char KeyGetCode(void) //返回按键码{key_ok=0;return(key_data);}bit KeyTest(void) //检查有无按键{KeyScan(); //键扫描return(key_ok);}//--------------------------------------------------------------------------//// 源程序大公开//// (c) Copyright 2001-2005 xuwenjun //// All Rights Reserved //// V1.00 ////--------------------------------------------------------------------------////标题: P1口行列式键盘程序////文件名: xwj_hlkey.c ////版本: V1.00 ////修改人: 徐文军E-mail:xuwenjun@ ////日期: 05-05-13 ////描述: P1口行列式键盘程序////声明: //// 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //// 如用于商业用途请与作者联系. E-mail:xuwenjun@ //// 有问题请mailto xuwenjun@欢迎与我交流! ////--------------------------------------------------------------------------////老版本: 无老版本文件名: ////创建人: 徐文军E-mail:xuwenjun@ ////日期: 05-05-13 ////--------------------------------------------------------------------------//#include <reg52.h>#include "xwj_hlkey.h" // P1口行列式键盘////#include "xwj_bp.h" //峰鸣器#define KEYDELAY 25 /*首键延迟次数*/#define KEYLOOP 10 /*连续键间隔次数,需小于KEYDELAY*/unsigned char key_bak;unsigned char key_temp;unsigned char key_old;unsigned char key_data;bit key_ok;// P1口行列式键盘//#define KEYPIN_L P1 // 定义键扫描列端口为P1低四位输入//#define KEYPIN_H P1 // 定义键扫描行端口为P1高四位扫描输出////内部私有函数//unsigned char fnKeycode(unsigned char key); // 根据键盘映射表输出顺序键值// // P1口行列式键盘////---------------------------------------------------------------------------//void KeyScan(void) //键扫描{unsigned char sccode,recode;KEYPIN_L = KEYPIN_L|0x0f; // P1低四位为列线输入//KEYPIN_H = KEYPIN_H&0x0f; // P1高四位为行线发全零扫描码//if ((KEYPIN_L&0x0f) != 0x0f) //有键按下{key_temp = 键值; //键扫描,获得键值if (key_temp == key_bak){key_old ;if (key_old==KEYDELAY) //连续键,不要则把此if屏蔽{key_ok=1;key_data=fnKeycode(key_temp); //键解码key_old=KEYDELAY-KEYLOOP;}}else{key_old=0;key_bak=key_temp;}}else //键抬起{if (key_old){key_ok=1;key_data=fnKeycode(key_temp); //键解码/* if (key_old==100) //加上时间,不同时间不同功能,与连续键冲突{bp(1);key_data = 0x10;}if (key_old==200){bp(2);key_data = 0x20;}*/}key_old=0;}KEYPIN_H = KEYPIN_H|0xf0;}//---------------------------------------------------------------------------// unsigned char KeyGetcode(void) //返回按键码{key_ok=0;return(key_data);}bit KeyTest(void) //检查有无按键{KeyScan(); //键扫描return(key_ok);}键盘接口软件设计键盘接口软件设计软件设计要考虑以下3部分内容:键盘缓冲区的设置;初始化程序;中断服务程序。
1、键盘缓冲区键盘缓冲区地址为:30H-4FH,共32个字节。
使用R1作为缓冲区放数指针,R7为取数指针。
缓冲区为环形。
放满后将R1置为30H,再从头放数;当放数指针追上取数指针时,停止放数。
当取数指针追上放数指针时,停止取数。
2、初始化程序包括8052的初始化和键盘的初始化。
程序清单如下:MOV IE,#0H ;关中断CLR F0 ;F0=0为类型1键盘;F0=1为类型2键盘MOV R0,#0HMOV R1,#30H ;置缓冲区放数指针起始值MOV R2,#0HMOV R3,#0HMOV R4,#0HMOV R5,#0HMOV R6,#0HMOV R7,#2FH ;置缓冲区取数指针起始值MOV B,#0HMOV TCON,#0H ;置INT0为电平触发方式KEYINT: ;主中断服务程序MOV IE,#0H ;关中断MOV A,R7 ;取数指针放到AXRL A,R1 ;与放数指针比较JZ KL4 ;放数指针=取数指针则退出INC R0 ;脉冲计数KL1: JNB P3.2,KL1 ;等待时钟脉冲为“1”CJNE R0,#01H,K12 ;首次收到脉冲则判断键盘类型MOV C,P1.0KL2:JB F0,KL3 ;根据F0的值转不同服务程序MOV F0,C ;保存键盘类型MOV C,P1.0 ;采用数据LCALL INTB ;类型2键盘中断服务程序MOV IE,#81H ;开中断RETIKL3: MOV C,P1.0 ;采样数据LCALL INTA ;类型1键盘中断服务程序KL4: MOV IE,#81H ;开中断RETI限于篇幅,以下公列出类型1键盘中断服务子程序的处理程序,类型2键盘中断服务子程序除需要进行奇校验及计数脉冲个数不同外,流程基本一致。
类型1键盘中断服务子程序:INTA:MOV A,R2 ;数据位移入R2和R3中RRC AMOV R2,AMOV A,R3RRC AMOV R3,ACJNE R0,#0AH,INTA1 ;计数脉冲不为10退出,否则转换CLR CMOV A,R3RLC AMOV A,R2RLC AMOV R5,A ;数据存入R5ANL A,#80HJNZ INTA3 ;是否为放键码,是则退出MOV A,R5MOV DPTR,#1000H ;1000H为码表转换区起址MOVC A,@A DPTR ;扫描码转换为ASCII码MOV @R1,A ;ASCII码存入键盘缓冲区INC R1CJNE R1,#50H,INTA3MOV R1,#30H ;缓冲区满则R1=30HINTA3: CJNE R7,#2FH,INT4MOV R7,#30HINTA4: MOV R0,#0H ;脉冲计数清零MOV R5,#0HINTA2: MOV R2,#0HMOV R3,#0HINTA1: RETORG 1000H ;码表转换区ORG 1002H ;这里仅列出0-9的转换表DB 31H,32H,33H,34H,35H,36H,37H,38H,39H,30H按键扫描驱动程序按键扫描驱动程序//按键扫描驱动程序unsigned char key,key_h,kpush;unsigned int key_l;//按键连接到p1.0、p1.1、p1.2void int_t0(void) interrupt 1 {unsigned char dd,i;TL0=TL0 30;TH0=0xfb; //800/* 按键判别*/if ((P1&0x7)==0x7) {if ((key_l>30)&&(key_l<800)&&(key_h>30)) { //释放按键,如果之前按键时间少于1秒,读入键值key=kpush;}if (( key_h)>200) key_h=200;key_l=0;if (key>=0x80) key=0; //如果之前的按键为长按1秒,清除键值} else {kpush=P1&0x7;key_l ;if ((key_l>800)&&(key_h>30)) { //如果按键超过1秒,键值加0x80标志长按键key=kpush|0x80;key_h=0;key_l=0;}}}void main(void) {TMOD=0x1;TR0=1;ET0=1;EA=1;while (1) {while (!key) {}switch (key) {case 1:break;case 2:break;}}}支持键盘双击事件的C程序设计!/********************************************************************************** KeyBoard Encode ProgramThis Program can encode press_key up to 128 and it can deal KB_DBClick MessageThis is just a test proram and only use 2 key.If More Key need to Encode ,pleasemodify the function:KBKeyPress()This Porgram use Message_Driver method,the KB_Msg is used to record what KB_Msg has occured. The meaning of 'SysKBMsg' is list as following.Program Design:LiBaizhanVer:1.10Date:2003-3-16************************************************************************************/ #include <reg51.h>#include <intrins.h>sbit Key1 = P1^0;sbit Key2 = P1^1;/*Some System Var Pre_DefinitionCrystal Frequence is 11.0592MHz*/#define TIME_2MS 0X74#define TIME_20MS 0X043B#define KB_INTERNAL 3 /*Key DBClk Detection Internal *//*SysKBMsg define Keyboard Message,it include Single_Click or Double_ClickIt's bit6~bit0 record key_encode and bit 7 record DBClk(1) or SglClk(0)It can record and encode up to 127(2^7-1) keysNo key is press when it is 0This method did not deal key such as Ctrl_Key or Alt_Key or Shift_Key...etc.*//*_________________________________________________*/data unsigned char SysKBMsg=0; /*| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |*//*| D/S | KB6 | KB5 | KB4 | KB3 | KB2 | KB1 | KB0 |*/data unsigned char KBCounter=0;bit KBCounterStart=0;bit KBCounterStop=0; /*if KeyBoard counter stop then this bit is 1*/bit KBCounterFlag=0; /*Current Counter is used by KeyBoard*/void TimerInt0(void) interrupt 1 /*timer 0 interrupt use to record how long key is press*/{TR0=0;if(KBCounterFlag) /*Current Counter is used by KeyBoard*/{if(KBCounter<KB_INTERNAL) /*if DBClk Detection is not finish then detect continue*/{KBCounter ;TR0=1;}else{KBCounter=0; /*DBClk Detection is finish*/KBCounterStop=1;}}}void DelayMS(unsigned int dltime);void Init51(void);unsigned char KBKeyPress(void); /*only return what key is press*/void KBKeyEncode(void); /*encode which key is pressed and DBClk or SglClk*/void KBStartTimer(unsigned char CntH,unsigned char CntL); /*load counter initial value and start timer*/ void KBStopTimer(void);void KBDealPressKey(void); /*deal key_press message*/void main(void){Init51();while(1){KBKeyEncode(); /*recored what KeyBoard Msg occure:which key is press and single clk or db clk*/ KBDealPressKey();}}/*Delay Time is :(20 17*dl_time)*12/CrystalFrequence(us)*/void DelayMS(unsigned int dltime){unsigned int i;for(i=0;i<dltime;i );}void Init51(void)SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */TMOD = 0x21; /* timer 1 mode 2: 8-Bit reload *//* timer 0 mode 1: 16-bit Timer */TH1 = BAUD_4800; /* reload value 9600 baud */TR1 = 1; /* timer 1 run */IE = 0X12; /* enable Serial INT,Timer0 INT */ES = 0; /* disable Serial INT*/EA = 1; /* Open INT Ctrl */}void KBKeyEncode(void){data unsigned char CurrPress=0,LastPress=0;if((LastPress=KBKeyPress())!=0) /*if some key is press then start encode*/{KBStartTimer(0,0); /*some key is press then start DBClk Detection Counter*/SysKBMsg=LastPress; /*record the key that is pressed this time*/while(!KBCounterStop){if((CurrPress=KBKeyPress())!=0X0) /*if some key is pressed during DBClk Detection then jump out to see wether DBclk is occured*/break;}if((KBCounterStop==0)&&(LastPress==CurrPress)) /*this key DBClk occured*/SysKBMsg|=0X80;KBStopTimer();}}unsigned char KBKeyPress(void){data unsigned char KeyPress=0;if((P1&0X03)!=0X03){DelayMS(TIME_20MS);if((KeyPress=(P1&0X03))!=0X03) /*some key is press*/{if(KBCounterStart)TR0=0;while((P1&0X03)!=0X03); /*wait until key is free*/DelayMS(TIME_20MS);if(KBCounterStart)TR0=1;}else /*Key is not real press*/KeyPress=0;}}return KeyPress;}void KBStartTimer(unsigned char CntH,unsigned char CntL){TR0=0;TH0=CntH;TR0=1; /*Start Counter*/TL0=CntL;KBCounterFlag=1; /*this counter is used by KeyBoard*/KBCounterStart=1;KBCounterStop=0;}void KBStopTimer(void){TR0=0;TH0=0;TL0=0;KBCounter=0;KBCounterFlag=0;KBCounterStart=0;}void KBDealPressKey(void){data unsigned char tmp=0;switch(SysKBMsg) /*here is just a test program,test to deal Sgl_Clk and DB_Clk Msg*/ {case 0X01: tmp=0X01;break;case 0X02: tmp=0X02;break;case 0X81: tmp=0X81;break;case 0X82: tmp=0X82;break;default : break;}SysKBMsg=0; /*this key msg has been done*/from: 作者:李佰战一种软件去除键抖动的方法来源:单片机及嵌入式系统应用肖广安时间:2006-05-16 发布人:meitai 概述在单片机控制系统中,通过按键实现控制功能是很常见的。