单片机按键的解决方法
单片机一些常用的延时与中断问题及解决方法

单片机一些常用的延时与中断问题及解决方法(总4页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--单片机一些常用的延时与中断问题及解决方法延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机常见的延时与中断问题及解决方法,希望对单片机新手们,有所帮助!一、单片机延时问题20问1、单片机延时程序的延时时间怎么算的答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。
如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用 2 MHz、12 MHz或6 MHz晶振。
第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MHz的晶振。
最长的延时时间可达216=65 536 μs。
若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
2、求个单片机89S51 12M晶振用定时器延时10分钟,控制1个灯就可以答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。
中断20次为1S,10分钟的话,需中断12000次。
计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。
而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。
用c 的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时3、51单片机C语言for循环延时程序时间计算,设晶振12MHz,即一个机器周期是1us。
C8051F单片机常见问题及解决方案

C8051F单片机常见问题及解决方案1000字C8051F单片机常见问题及解决方案C8051F系列单片机是一款常用的32位微型控制器。
在使用中,常常会遇到各种问题,以下列出了一些常见问题及解决方案,供大家参考。
1.如何选择晶振?C8051F单片机的内部时钟频率有两种选择:内部振荡器(24MHz)和外部晶振(最高可达25MHz,具体要看选用的晶振规格)。
选择晶振时,可以考虑系统时钟的需求量,以及对系统稳定性的要求。
2.如何处理硬件复位?硬件复位是指在单片机系统上电时,自动执行初始化操作的过程。
C8051F单片机实现硬件复位的方法有两种:使用复位电路(RST#复位)、通过预编程的复位向量(从C2寄存器获取程序计数器初始值)。
通常情况下,我们可以使用预编程的复位向量,以方便地重新启动程序。
3.如何处理软件复位?软件复位是指通过程序代码实现的复位。
在C8051F单片机中,软件复位可以通过配置系统管理单元(SMU)来实现。
这个过程通常包括设置复位源、配置访问时间窗口、启用复位源、复位等操作。
在进行软件复位之前,我们需要仔细查看数据手册中的相关章节,并根据实际需求进行配置。
4.如何配置GPIO口?GPIO(通用输入输出)口是单片机系统中的基本输入输出接口,用于实现I/O操作和外设控制等功能。
在C8051F单片机中,GPIO口的配置可以通过专用寄存器(P0、P1、P2、P3等)来实现。
具体的配置包括:指定口线方向、设置上下拉电阻、确定端口中断引脚等。
5.如何编写中断服务程序?中断服务程序是用于响应中断请求、处理相应事件的程序代码实现。
在C8051F单片机中,编写中断服务程序包括两个步骤,一是将中断请求源打开(或禁止),二是编写相应的中断处理程序。
具体的实现方法会有一些细微的差别,需要仔细查看数据手册中的相关章节。
6.如何使用定时器?定时器是单片机中常用的计时器件,用于实现时间处理、调度和控制等功能。
在C8051F单片机中,使用定时器需要涉及一些内容,包括:设置定时器的工作模式、配置计数器时钟源和初始化计数器等。
单片机使用中的错误排查与修复技巧

单片机使用中的错误排查与修复技巧单片机(Microcontroller)是一种集成了中央处理器、存储器和输入输出设备的微型计算机系统,常用于嵌入式系统中。
在单片机的使用过程中,由于硬件或软件问题,可能会出现各种错误。
这篇文章将介绍一些常见的错误,以及排查和修复这些错误的技巧。
一、硬件错误排查与修复技巧1. 电源问题:当单片机无法正常工作时,首先应检查电源问题。
可能的原因包括电源电压不稳定、电源连接错误或损坏的电源线。
排查方法:- 使用万用表测量电源电压,确保其在指定范围内。
- 检查电源连接是否正确,确认是否存在接触不良或松动的接线。
- 更换损坏的电源线。
修复方法:- 确保使用稳定可靠的电源。
- 确认电源线连接正确、可靠。
- 使用去噪电容或稳压电源解决电压波动问题。
2. 时钟问题:时钟信号是单片机正常工作的重要参考信号。
若时钟信号不正确或不稳定,单片机可能无法正常工作。
排查方法:- 检查时钟源选择是否正确。
- 使用示波器测量时钟信号,确认其频率和占空比是否满足要求。
- 检查时钟电路的连接是否存在接触不良或损坏。
修复方法:- 确认时钟源选择正确。
- 检查时钟电路的连接,确保其可靠性。
- 使用时钟缓冲器或外部晶振解决时钟不稳定问题。
3. 引脚问题:在单片机的使用过程中,常常会出现引脚连接错误或引脚损坏的问题。
这可能导致严重的功能故障或者不可预测的工作情况。
排查方法:- 检查引脚连接是否正确,确认是否存在接触不良或者误连的情况。
- 使用万用表或示波器测量引脚的电平,确认其是否符合预期。
- 在其他引脚上测试相同功能,以确定引脚是否损坏。
修复方法:- 修正引脚连接错误,确保连接可靠。
- 更换损坏的引脚。
- 使用外部元件(如继电器)重新分配引脚功能。
二、软件错误排查与修复技巧1. 编译错误:编译错误是开发单片机软件时常遇到的问题,通常是由于语法错误、头文件引用错误等引起的。
排查方法:- 仔细阅读编译错误信息,确定具体的错误原因。
单片机按键模块设计

VS
开关电源
使用开关电源为单片机和按键模块供电, 效率高,体积小,重量轻,但成本较高。
03
单片机按键模块软件设计
按键扫描算法设计
扫描方式
采用定时器定时扫描或外部中断扫描方式,确保按键 的实时响应。
扫描算法
采用线性扫描或矩阵扫描算法,减少硬件资源占用, 提高扫描效率。
延时去抖动
通过软件延时消除按键抖动,提高按键识别的准确性 。
单片机按键模块设计
汇报人: 202X-12-21
目录
• 引言 • 单片机按键模块硬件设计 • 单片机按键模块软件设计 • 单片机按键模块测试与调试 • 单片机按键模块应用案例分析 • 结论与展望
01
引言
目的和背景
目的
设计一个稳定、可靠、高效的单片机按键模块,以满足各种应用场景的需求。
背景
单片机按键模块是嵌入式系统中的重要组成部分,广泛应用于智能家居、工业控制、医疗设备等领域 。随着技术的不断发展,对单片机按键模块的要求也越来越高,需要具备更高的性能和更低的功耗。
案例描述
在智能家居控制系统中,按键模块作为人机交互的 重要接口,实现了对灯光、窗帘、空调等设备的远 程控制。
案例总结
单片机按键模块在智能家居控制系统中发挥 了重要作用,提高了家居设备的智能化程度 和用户体验。
案例二:工业自动化控制系统中的应用
01
工业自动化控制系统的按键模块设计
通过单片机实现按键输入,控制工业设备的启动、停止、调节等功能。
异常处理
设计异常处理机制,对异常情况进行处理,如按键卡死、异 常按下等。
04
单片机按键模块测试与调试
硬件测试与调试
01
,电压 是否符合要求。
单片机按键程序设计

单片机按键程序设计单片机按键的基本原理其实并不复杂。
通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。
在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。
在实际的按键程序设计中,有多种方式可以实现按键检测。
其中一种常见的方法是查询法。
这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。
以下是一个简单的查询法示例代码:```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` 函数中编写了按键按下时的处理代码。
基于单片机的快速按键识别方法

基于单片机的快速按键识别方法基于单片机的快速按键识别方法快速按键识别技术是信息处理方面的一个重要领域,应用于各种设备与系统。
在现代电子产品中,按键控制是常用的操作方式之一。
而基于单片机的快速按键识别方法,是目前较为常见的实现方式之一。
一、快速按键识别原理快速按键识别是通过按键接通时,产生的电信号来判断你所按的按键类型及次数,进而执行对应的操作。
单片机通过外部中断或定时器来进行按键事件的处理和识别,实现快速的数据处理与反馈。
二、快速按键识别系统设计1.硬件设计硬件设计主要包括单片机、键盘、蜂鸣器和LED等模块。
其中,单片机为整个系统的核心部件,键盘是输入信号的来源,蜂鸣器是输出信号的反馈,LED则为系统的指示灯。
2.软件设计软件设计则需要通过编程实现按键事件的处理、识别及反馈,其中主要包括定时器、外部中断、键盘扫描和矩阵按键扫描等方式。
三、快速按键识别方法1.定时器扫描法通过定时器来设定扫描周期,通过中断来响应按下事件,实现按键的检测。
相比其他方法,定时器扫描法的扫描速度较快,适用于对响应速度有要求的场合。
2.(硬件)按键编码法每个按键使用一个编码计数器的,通过单片机译码器来解码,实现按键的响应。
这种方法根据不同的按键引脚电平来区分每个按键,适合于按键比较多的场合。
3.矩阵按键扫描法矩阵扫描是常用的键盘扫描方法,遵循矩阵思想,通过行列交叉检测来检测按键的按下,比较简单可靠,适合于按键数量较多的场合。
四、总结基于单片机的快速按键识别方法应用广泛,可以有效提高按键的响应速度和灵敏度,实现更加智能化的操作。
实现这种技术需要考虑系统的硬件和软件设计,但是相比其他识别方式,它更加高效和快速,更容易向各个方向进行扩展。
单片机技术的使用中常见问题及解决方案集锦

单片机技术的使用中常见问题及解决方案集锦引言:单片机技术作为嵌入式系统开发的核心,广泛应用于各个领域。
然而,在实际使用过程中,我们常常会遇到各种问题,这不仅会影响项目的进展,还可能导致系统的稳定性和可靠性下降。
本文将针对单片机技术的使用中常见问题进行分析,并提供一些解决方案,帮助读者更好地应对这些问题。
一、电路设计问题及解决方案在单片机技术的应用中,电路设计是至关重要的,一个合理的电路设计能够提高系统的稳定性和可靠性。
以下是一些常见的电路设计问题及解决方案:1. 电源干扰问题电源干扰是导致单片机系统不稳定的常见问题之一。
解决方案是在电源输入端添加电源滤波电路,如电容滤波器和磁珠滤波器,以减小电源线上的噪声。
2. 时钟电路问题时钟电路是单片机系统中的关键部分,它提供了系统的时钟信号。
如果时钟电路设计不合理,可能会导致系统时钟不准确或者不稳定。
解决方案是使用稳定的时钟源,并在时钟信号线上添加适当的阻抗匹配电路,以降低时钟信号的反射和干扰。
3. 脉冲干扰问题脉冲干扰是由于电路中的开关动作引起的,它会导致单片机系统的工作不正常。
解决方案是在输入端添加合适的滤波电路,如RC滤波器或者磁珠滤波器,以减小脉冲干扰的影响。
二、软件编程问题及解决方案单片机技术的应用离不开软件编程,一个高效、可靠的程序是保证系统正常运行的关键。
以下是一些常见的软件编程问题及解决方案:1. 内存管理问题单片机的内存资源有限,合理地管理内存是提高程序效率的关键。
解决方案是合理地分配内存空间,避免内存碎片的产生,并使用适当的数据结构和算法来优化程序。
2. 中断处理问题中断是单片机系统中常用的一种处理方式,但不正确的中断处理可能导致系统死机或者数据丢失。
解决方案是在中断处理程序中尽量减少对全局变量的访问,避免死锁和资源竞争的问题。
3. 时序控制问题时序控制是单片机系统中的重要部分,它决定了系统各个模块的工作顺序和时序关系。
解决方案是合理地设计时序控制逻辑,并使用定时器和计数器等硬件资源来辅助实现。
单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法在单片机的程序中,常常会遇到延时和中断的问题。
延时是指在程序中需要暂时停顿一段时间,而中断是指在程序执行过程中突然发生的事件,需要立即处理。
一、延时问题:单片机中的CPU速度非常快,一条指令可以在几十甚至几百纳秒内执行完毕。
在需要进行延时的情况下,不能直接使用空指令来实现延时,否则延时的时间将会非常短暂。
解决延时问题的方法如下:1. 软件延时:将一个循环执行的空指令放在一个循环中,通过多次执行该循环来实现延时。
这种方法实现简单,但由于CPU速度非常快,必须通过增加空指令的执行次数来实现较长的延时时间,不适用于需要精确延时的场合。
2. 硬件延时:通过外接的计时器或计数器来实现延时。
这种方法可以精确控制延时时间,但需要额外的硬件支持。
二、中断问题:1. 中断产生的条件:中断是指在程序执行过程中,某个特定的条件满足时,CPU会暂停当前的工作,转入到一个中断服务程序中去执行。
中断产生的条件可以是外部触发比如按键、定时器、串口通信等,也可以是内部触发比如指令执行错误、电源电压不稳等。
2. 中断服务程序的编写:中断服务程序是在中断发生时被调用的程序,需要在程序中事先编写好。
一般情况下,中断服务程序需要尽量短小,以免影响正常的程序执行。
在中断服务程序中,需要首先保存CPU的现场,然后根据中断源的不同进行相应的处理,最后恢复CPU的现场,继续原来的程序。
3. 中断优先级:当多个中断同时发生时,需要按照一定的优先级来处理。
在单片机中,可以通过设置中断的优先级寄存器来实现优先级的分配。
4. 中断的使能与屏蔽:有些中断是可以被屏蔽的,有些是不能被屏蔽的。
可以通过设置中断使能寄存器和屏蔽寄存器来控制中断的开启和屏蔽。
总结:延时和中断问题是单片机编程中常见的问题,解决这些问题需要合理地选择延时方法和编写中断服务程序。
在实际的应用中,需要根据具体的要求和硬件配置来选择最适合的解决方案。
需要注意中断的优先级和使能与屏蔽,以确保程序的正常运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机按键的解决解决方案1、单片机上的按键控制一般采用两种控制方法:中断和查询。
中断必须借助中断引脚,而查询按键可用任何IO端口。
按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。
2、中断形式STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器.4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
每一个中断源都必须定义2个优先级。
有几点需要注意的是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
GPIO外部中断:STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间智能使用一个,如:PA0,PB0,PC0,PD0,PE0,PF0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能使用了,在此情况下我们使用类似于PB1,PC2这种末端序号不同的外部中断源,每一组使用一个中断标志EXTI x.EXTI0~EXTI4这5个外部中断有着自己单独的中断响应函数。
EXTI5~EXTI9共用一个中断响应函数,EXTI10~EXTI15共使用一个中断响应函数。
对于中断的控制,STM32有一个专用的管理机构NVIC.中断的使能,挂起,优先级,活动等等都是由NVIC在管理的。
编写IO口外部中断步骤及其注意事项:(1)设置中断优先级组;(2)开启时钟(IO口时钟,复用时钟);(3)设置中断线并对中断进行初始化配置(设置中断线,确定中断模式,中断触发沿设置,使用指定设置初始化外部中断);(4)设置中断管理器NVIC各参数(包括:使能产生外部中断外设的IO口所在的外部中断通道;设置外部中断的优先级---抢占优先级,响应优先级;使能外部中断通道;使用设置好的各个中断管理器上的参数来初始化中断管理器)。
外部中断服务函数完成中断操作需要最终达到的目标。
3、矩阵形式键盘矩阵原理:a*b矩阵键盘由a条行线和b条列线组成,行线接端口P3(p3表任一端口)P3.0、P3.1、P3.2……p3.(a-1);列线接p 3.a,p3.(a+1)……P3.(b-1).按键位于每条行线和列线的交叉点上。
按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。
第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。
当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。
第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。
第三步,将第一步得到的列码和第二步得到的行码合并得到按键的位置码,即是Y3Y2Y1Y0X3X2X1X0(因为行线和列线各有一条电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。
也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平.比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y3Y2Y1Y0x3X2X1X0为11101110即是0xEE.全部按键码为:矩阵键盘在单片机上的简单应用-----显示数码管:0~F(51单片机)#include<reg51.h>#define uchar unsigned char#define uint unsigned intSbit buzzer =P1^0;Uchar code_dis[]=//0~9,A~F{0xC0,0XF9,0XA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0z88,0x83,0xC6,0xA1,0x86,0x8E};Uchar code_tab[]=//矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x)//延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan()//矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b;//得到位置码for(i=0;i<16;i++){if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}}Void beep(void)//蜂鸣器发出声音,模拟按键声音{Uchar i;For(i=0;i<100;i++){Buzzer=~buzzer;Delay(1);}Buzzer=0;}Void main(void){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1)//有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}扫描法:矩阵键盘工作原理:由于按键没有接地,4行4列正好占用8个I/O 如果4行我们送P3.0到P3.3送入0 1 1 1 然后去读取4列的值,如果P3.0的按键按下那么P3.4---P3.7的值等于0 1 1 1,假如是第2个键按下的话那么读回来的值是1 0 1 1 ,如果第3个键按下去读回来的值是1 1 0 1 ,如果第4个键按下去读回来的值是 1 1 1 0 ,如果没有键按下去读回来就是1 1 1 1。
所以我们就根据读回来的值来判断按下去的是那个键。
当然这是对P3.0这一行,因为矩阵键盘是扫描的,所以下次把P3.0 给1 P3.1 给0对第2行,陆续的第3 行第4行,0111 1011 1101 1110 而每次都去从新扫描一遍列值列有4个值,以确定是那个键按下。
无论何时任何一个时间有一个按键被按下就跳出循环。
当然不可能有2个键刚好一起按下你的手没有这么好的力度,就算有2个键一起按键,程序也有先后检测的顺序,只能检测一个后面的检测不到。
P3 = 0XFE; //第一行给0temp ;定义个变量temp = P3 ;读回来由于读需要先写1 因为P3= FE 已经把高4位给1了所以能读了temp & oxf0 如果没有按键按下结果还是0xf0 .如果有键按下结果就不是0xf0了。
num 然后我们再定义一个变量让它赋值给这个按下去的按键值。
一次类推把第一行赋值0 扫描一遍然后把第2行赋值0扫描一遍..............共扫描1 6遍。
只要有键按下就会得到一个值 num 就从1排到16. 共16个按键 4*4 的矩阵键盘。
我再总结下思路:首先低4位是行共4行分别把每行给0 低电平就4次 0 1 1 1 、1 0 1 1 、 1 1 0 1 、1 1 1 0 对吧然后去检测高4位 4列啊先不考虑极端情况,4列就4个按键只要按下一个 P3口的高4位就会有一个值。
根据这个值就能判断是那个键了。
如:P3= 1111 1110 低四位是行先把第一行给0有按键下的话 temp = P3 读回来 1101 1110 然后temp & 0xf0 与运算下就判断下还等于oxf0吗?如还等于就没有按下,如果不等于就肯定有按键按下。
定义个变量让它等于这个不是0XF0的值,做个标记。
依次类推。
然后用这个思路写个程序吧!写的不太好看的不是很清楚只是做个参考吧,只要把思路理清楚就行了。
是这样我们分别按这16个按键让它分别显示是第几个比如按下第一个数码管就显示1 第2个数码管就显示2,依次类推。
一直到 F (为了方便让所有的数码管显示同一个数0 ---F)#include#define uint unsigned int#define uchar unsigned charsbit dula = P2^6;sbit wela = P2^7;sbit key1= P3^4;uchar code table []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0//加这个0就是什么都不显示};uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();//声明一下//void display(uchar num1);//这里可以做个显示函数,但是我没做。