当前位置:文档之家› 独立按键扫描程序

独立按键扫描程序

独立按键扫描程序
独立按键扫描程序

;*****独立按键************ ;**2011.01.20************* ;**11.0592MHZ************* ;************************* ;************************* ;----单元定义-------------

KEY EQU 20H;开关键ENKEY EQU 21H;前沿键

L20MS EQU 30H;20ms单元KEY0 EQU 31H;暂存

;----字节定义-------------

SW0 BIT KEY.0

SW1 BIT KEY.1

SW2 BIT KEY.2

SW3 BIT KEY.3

ESW0 BIT ENKEY.0

ESW1 BIT ENKEY.1

ESW2 BIT ENKEY.2

ESW3 BIT ENKEY.3

;****主程序*************** ORG 0000H

LJMP MAIN

MAIN: MOV SP,#60H

MOV P2,#0FFH

MOV R1,#0FFH

MOV TMOD,#01H

MOV TH0,#0F7H;2.5MS

MOV TL0,#000H

SETB TR0

MAIN1: JNB TF0,$

CLR TF0

MOV TH0,#0F7H

MOV TL0,#000H

CALL DULIKEY

JNB SW0,D6

D0: ;DJNZ R1,MAIN1

; MOV R1,#0FFH

MOV P2,#0FEH

DJNZ R0,MAIN1

MOV R0,#0C8H

; DJNZ R1,MAIN1

; INC R2

; MOV P2,R2

; LJMP MAIN1

D6: JNB ESW1,D1

MOV P2,#0DFH

DJNZ R0,MAIN1

MOV R0,#0C8H

D1: JNB SW1,D7

DJNZ R1,MAIN1

MOV R1,#0FFH

MOV P2,#0FDH

DJNZ R0,MAIN1

MOV R0,#0C8H

D7: JNB ESW3,MAIN1

MOV P2,#0BFH

DJNZ R0,MAIN1

MOV R0,#0C8H

LJMP MAIN1

;*************************

;****子程序***************

;----独立按键-------------

;----DULIKEY--------------

;----2011.01.20-----------

;----11.0592MHZ----------- DULIKEY:MOV P1,#0FH;设置口

NOP

MOV A,P1;读键

ANL A,#0FH;

XRL A,#0FH;逻辑正

MOV KEY0,A

CJNE A,KEY,ANJ0;键变转移

MOV L20MS,#08H;去抖初值

SJMP ANJ1

ANJ0: MOV A,L20MS

JZ ANJ1

DEC L20MS

MOV KEY0,KEY;放弃不稳定的键ANJ1: MOV A,KEY;提取键前沿XRL A,KEY0

ANL A,KEY0

MOV ENKEY,A;前沿键

MOV KEY,KEY0;开关新键

RET

END

独立式按键和一位数码显示

独立式按键和一位数码显示 一.实训目的: 1.练习按键编程 2.练习数码显示编程 二.实训任务: (可以根据实际条件改做类似按键和显示的实验) 1. 8个按键,分别对应一个子程序,按1号键,执行第一个子程序,按2号键执行第二个子程序,依此类推。 2.每个子程序功能是,在一位数码管上显示键号。 三.实训准备: 1.分析电路,准备材料,按图连接电路 2.分析任务,编写程序,并仿真调试 3.要求用散转指令实现多分支 参考仿真文件:按键数码.DSN 参考电路: 技能训练9-2参考电路图 说明:此图省略了单片机的复位和晶振电路,试验时必须要加上。 四.参考程序: M1: LCALL ANJIAN MOV A,R7 JZ M1 MOV 20H,A RL A ADD A,20H MOV DPTR,#TAB1 JMP @A+DPTR TAB1: LJMP PRG0

LJMP PRG1 LJMP PRG2 LJMP PRG3 LJMP PRG4 LJMP PRG5 LJMP PRG6 LJMP PRG7 LJMP PRG8 LJMP M1 PRG0: LJMP M1 PRG1: LCALL DISP LJMP M1 PRG2: LCALL DISP LJMP M1 PRG3: LCALL DISP LJMP M1 PRG4: LCALL DISP LJMP M1 PRG5: LCALL DISP LJMP M1 PRG6: LCALL DISP LJMP M1 PRG7: LCALL DISP LJMP M1 PRG8: LCALL DISP LJMP M1 ORG 0080H ANJIAN: MOV R7,#0 MOV A,P2 CPL A JZ ANJIANE MOV R6,#8 ANJIANL:CLR C RRC A INC R7 JC ANJIANE DJNZ R6,ANJIANL ANJIANE:RET

独立按键控制数码管

青岛农业大学海都学院 单片机课程设计实习报告 院系工程系 专业 2014级电气Z1班 学号 201471019 姓名隋永博 实习时间第11周 实习课程单片机应用课程设计 2015年11月6日

按键控制数码管加减显示 目录 一、前言 (3) 二、设计要求 (3) 三、系统硬件设计与说明 (4) 3.1系统组成及总体框图 (4) 3.2 AT89C51 (4) 四、系统软件设计与说明 (5) 4.1 软件部分的程序流程图 (5) 4.2 源程序 (5) 五、仿真过程描述 (7) 六、总结 (8)

一、前言 随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。 基于当前市场上的智能数字市场需求量大,其中数码管显示技术就是一个很好的应用方面。单片机技术使我们可以利用软硬件实现数码管准确显示各种数码。以液晶显示技术的发展为背景,选择了比较常用的T6963C内置控制器型图形LCD(液晶显示嚣)模块,从应用角度介绍了该控制器的特点和基本功能,并描述了单片机控制T6963CLCD模块的显示机理。在此前提下以C51硬件开发语言为基础,给出了8051单片机与T6963C 的接口电路框图,并以字符、图形的具体显示方法为例简要介绍了软件的设计流程及实现。 二、设计要求 名称:K1-K4控制数码管移位显示 说明:按下K1时加1计数并增加显示位, 按下K2时减1计数并减少显示位, 按下K3时清零。

三、系统硬件设计与说明 3.1系统组成及总体框图 图1 系统硬件总图 3.2 AT89C51 该课程设计中我们选用的芯片是AT89C51。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 AT89C51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash

按键控制键盘检测原理与应用

按键控制键盘检测原理与应用 一、任务目标: 认知目标 1、 掌握按键分类及工作原理 2、 掌握IF 条件选择结构和使用方法 3、 掌握循环结构和使用原理 4、 掌握独立按键子函数的编写原理及方法 1、独立键盘 在简单的单片机应用系统中,往往只需要几个功能键就能满足要求, 此时,可采用独立 式按键结构。 独立式按键是直接用 I/O 口线构成的单个按键电路,其特点是每个按键单独占用一根 I/O 口线,每个按键的工作不会影响其它 I/O 口线的状态。独立式按键的典型应用如图 1.2.1 所示。 独立式按键示意图 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根 I/O 口线,因此, 在按键较多时,I/O 口线浪费较大,不宜采用。 程序开始,检测按键是否被按下,若按下,则移动机器人启动,未被按下,继续检测。 这里将程序分成三个部分,分别是延时子函数、按键子函数、主函数。 延时子函数,通过参数 t 设置延时时间;按键模块子函数需用到延时函数,对按键进行 消抖;主函数主要调用按键检测程序,实现对移动机器人的控制。程序流程图如图 1.2.2所 示 xnu Lnu Jnu L] iu lu o 1 3 4 5 6 - IL I 」 IL IL IL IL IL IL- PPPPFFPP 3 S-I

程序示例: 在编写程序开始的部分,将系统头文件“STC89C52RC.H ”包含进来,对常用的变量类 型进行宏定义,规划各函数和变量,对变量进行定义和初始化,对自定义子函数进行声明并添加相应标注,程序开始部分如下 sbit IN仁P1A0; sbit IN2=P1A1; Void key(); 编写主函数,在主函数中就是调用按键检测函数。 Void mai n() { key(); } 编写key()按键检测函数,按键按下,输出低电平,通过if语句检测低电平,延时10ms 后,再次检测,若检测为高电平,则表示为机械抖动,若检测到低电平表示按键按下。 Void key() { if(IN1==0) { delay_ms(10); if(IN 仁=0) { while(IN 仁=0); IN2=~IN2 ; } } } 在上面的程序中,就只有一个检查按键扫描的函数key(),key()函数是检查有没有按键

实验报告七-键盘扫描及显示实验

信息工程学院实验报告 课程名称:微机原理与接口技术 实验项目名称:键盘扫描及显示实验 实验时间: 班级: 姓名: 学号: 一、实 验 目 的 1. 掌握 8254 的工作方式及应用编程。 2. 掌握 8254 典型应用电路的接法。 二、实 验 设 备 了解键盘扫描及数码显示的基本原理,熟悉 8255 的编程。 三、实 验 原 理 将 8255 单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。键盘采用 4×4 键盘,每个数码管显示值可为 0~F 共 16 个数。实验具体内容如下:将键盘进行编号,记作 0~F ,当按下其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近 6 次按下的按键编号。 键盘及数码管显示单元电路图如图 7-1 和 7-2 所示。8255 键盘及显示实验参考接线图如图 7-3 所示。 图 7-1 键盘及数码管显示单元 4×4 键盘矩阵电路图 成 绩: 指导老师(签名):

图 7-2 键盘及数码管显示单元 6 组数码管电路图 图 7-3 8255 键盘扫描及数码管显示实验线路图 四、实验内容与步骤 1. 实验接线图如图 7-3 所示,按图连接实验线路图。

图 7-4 8255 键盘扫描及数码管显示实验实物连接图 2.运行 Tdpit 集成操作软件,根据实验内容,编写实验程序,编译、链接。 图 7-5 8255 键盘扫描及数码管显示实验程序编辑界面 3. 运行程序,按下按键,观察数码管的显示,验证程序功能。 五、实验结果及分析: 1. 运行程序,按下按键,观察数码管的显示。

(整理)独立式键盘控制灯移动.

课程设计说明书 课程名称:单片机原理及应用 设计题目:独立式键盘控制灯移动 院系:电子信息与电气工程系 学生姓名: 学号: 专业班级: 指导教师:

课程设计任务书

独立式键盘控制灯移动设计 摘要:单片机具有人机对话功能,开关、键盘是实现人机对话的主要输入设备,也是最常用的设备,通过它能发出各种控制命令和数据到单片机。本课题即针对拨动开关作为输入信号控制输出端拟定。该设计以8位AT89C52单片机为核心,以12MHZ晶振和电容构成外部时钟电路,用电容、电阻和开关组成复位电路,桥堆2W10和7805、电容组成电源电路为整个电路供电,桥堆2W10和7805、电容组成电源电路为整个电路供电,四个按键开关K1、K2、K3、K4分别与单片机P2.4、P2.5、P2.6、P2.7相连,组成独立式键盘接口输入电路;P1端口接8只发光二极管,用作输出演示。 关键词:AT89C52 共阳极二极管 7805 桥堆2W10

目录 1设计背景 (1) 1.1课题的提出…………………………………………………………‥1 1.2单片机的发展现状 (1) 2设计方案 (2) 2.1硬件部分设计方案 (2) 2.2软件部分设计方案 (2) 3方案实施 (2) 3.1硬件部分实施方案 (2) 3.2软件部分实施方案 (6) 4结果与结论 (8) 4.1结果 (8) 4.2结论 (8) 5收获与感谢 (8) 6参考文献 (8) 7附录 (9) 附录一仿真图 (9) 附录二元器件清单 (10) 附录三源程序 (11)

1.1课题的提出 随着单片机的运算速度和处理能力的不断提高,其在各个领域得到更广泛的应用。然而随着其应用领域的不断扩大及集成化的不断提高,单片机的发展与应用越来越智能化。单片机的智能化水平不断提高能够满足人们更多方面的需求。这里以AT89C52系列为例介绍一种人机对话功能,本课题针对独立式键盘的应用而拟定。四个按键开关分别与单片机相连,组成独立式键盘接口电路,8只发光二极管用作输出演示。 1.2单片机的发展现状 目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。由于单片机有许多优点,因此其应用领域之广,几乎到了无孔不入的地步。单片机应用的主要领域有:1、智能化家用电器2、智能化家用电器3、商业营销设备4、工业自动化控制5、智能化仪表6、智能化通信产品7、汽车电子产品。 单片机应用的意义不仅在于它的广阔范围及所带来的经济效益。更重要的意义在于,单片机的应用从根本上改变了控制系统传统的设计思想和设计方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。以前自动控制中的PID调节,现在可以用单片机实现具有智能化的数字计算控制、模糊控制和自适应控制。这种以软件取代硬件并能提高系统性能的控制技术称为微控技术。随着单片机应用的广,微控制技术将不断发展完善。

独立按键控制LED灯

项目五独立按键控制LED灯 1.掌握独立按键消抖原理 2.掌握独立按键接口电路设计 1.设计独立按键控制LED的硬件电路 2.编写程序分别实现按下按键1和按键2,LED灯闪烁方式不同 3.下载程序到单片机中,运行程序观察结果并进行软硬件的联合调试 键盘是常见的计算机输入设备,在单片机应用中,按键可以设置电子钟的时间;简易计算器中,按键可以输入数字;按键还可以实现单片机中两个不同功能程序切换。本项目要求两个按键分别实现LDE灯的不同闪烁方式,按键1按下时,8个LED灯从右向左依次点亮,按键2按下时,8个LED灯从左向右依次点亮。 本项目只需2个按键实现LED灯闪烁方式控制,因此按键接口电路设计成独立按键。独立按键即每个按键直接与单片机I/O端口连接,当按键按下和弹开时,单片机I/O端口呈现不同的电平。独立按键接口电路可以设计成当按键按下时,单片机I/O端口为高电平或者低电平,读者可以根据自己的需求自行设计。单片机应用中的独立按键多是机械弹性开关,在按键按下和弹开时,由于按键的机械特性,有抖动产生。消除抖动有硬件方式和软件方式,软件方式就是编程读取I/O端口电平时,产生一个5ms~10ms延时后,再次读取I/O端口电平,以确认按键是否按下或弹开。

1.独立按键与矩阵按键 键盘是实现人机交互的重要计算机输入设备,其中按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。按键按照接口原理可分为编码键盘和非编码键盘,编码键盘是用硬件来实现对键的识别,非编码键盘由软件来实现按键的识别。非编码键盘按连接方式可分为独立按键和矩阵按键。 独立按键特点是每个按键占用一条I/O线,当按键数量较多时,I/O口利用率不高,但程序编制简单,适合所需按键较少的场合。矩阵按键特点是电路连接复杂,软件编程较复杂,但I/O口利用率高,适合需要大量按键的场合。下图为常见独立按键和矩阵按键接口电路。 图独立按键接口电路与矩阵按键接口电路上图四个按键(常开触点开关)S1,S2,S3,S4分别与单片机的四个I/O端口连接。当按键没有按下时,四个I/O端口的电压为高电平;当按键按下

单片机矩阵键盘扫描程序

#include #include #define uint unsigned int #define uchar unsigned char sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 uint keyflag ; //键盘正在读取标志位,如果Keyflag为1 ,表示正在读取键盘,停止其他功能; char x,y,m,n,c; //Keyflag为0,读取键盘结束,恢复其他功能 char flag1=0; //频率范围10~1000Hz uchar Hrate = 0; //一个周期内高点平占据时间 uchar Lrate = 0; //一个周期内低电平占据时间 uint FREQ0; //定时器T0的计数变量// uint FREQ1; //定时器T1的计数变量// sbit P2_1=P2^0; //设置P2.1,作为信号输出口// uint disbuf[3]; uint figure=0; int sum2=0; int sum1=0; int flag=0; uint count=0; uint max=0; uint disbuf_temp=0; /******************************************************************** * 名称: 1602显示延时函数delay() * 功能: 延时,延时时间大概为5US。

* 输出: 无 ***********************************************************************/ void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************** * 名称: bit Busy(void) * 功能: 这个是一个读状态函数,读出函数是否处在忙状态 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ bit Busy(void) { bit busy_flag = 0; RS = 0; RW = 1; E = 1; delay(); busy_flag = (bit)(P0 & 0x80); E = 0; return busy_flag; } /******************************************************************** * 名称: wcmd(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void wcmd(uchar del) { while(Busy()); RS = 0; RW = 0; E = 0; delay(); P0 = del; delay(); E = 1;

任务3.3 独立按键的实现

任务3.3 独立按键 3.3.1 任务介绍 在数字钟中有四个独立按键,功能分别是调整、加、减、确定,用以调整系统的时间。在单片机系统中,键盘是基本和常用的接口,它是构成人机对话通话的一种常用方式,实现向单片机系统输入数据、传送命令等功能,是人工干预、设置和控制系统运行的主要手段。 本节的任务要求: 利用开发板上的四个按键,配合任务3.2数码管显示程序,实现数字钟的调时,为了简化程序,用3个LED的亮灭来代替对应数码管的闪烁(数码管的闪烁在这里有些难)。正常走时,3个LED都不点亮,当按下“调整”键时,“小时”对应的LED点亮,再次按下“调整”键,则“分”对应的LED点亮,然后再按下“调整”键,则“秒”对应的LED点亮,依次循环,直到按下“确定”键,三个LED返回到不点亮的状态。当按下“调整”键后,按下“加”或者“键”按键,则对应的数码管的显示值每次加1或者减1。 3.3.2 知识准备 1、轻触按键的认识 键盘分为编程键盘和非编程键盘。键盘上闭合键的识别由专用的硬件编码器来实现的为编程键盘,如计算机键盘;闭合键的识别由软件来实现的为非编程键盘,轻触按键属于非编程键盘。轻触按键具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统中。图3.3.1所示的是市面常见的轻触按键,从封装来区分,有贴片的,也有直插的;从引脚的数量来区分,有2个引脚的,也有4个引脚的。开发板上使用的按键时4引脚直插按键,尺寸为6×6×5,如图3.3.2所示。 图3.3.3 各种形状的按键图3.3.2 开发板使用的按键

2、按键的硬件电路和识别方法 图3.3.3是轻触按键的内部结构图,按键的4个引脚两两连通(可以用万用表测量),不连通的引脚,当按键被按下时,在金属弹片和反作用弹簧的作用下也会连通,当按键释放后,弹簧不起作用,引脚不连通。 图3.3.3 轻触按键内部结构图3.3.4 轻触按键的接口电路 图3.3.4是轻触按键的单片机接口电路,按键一端接地,另外一端接I/O口,同时通过上拉电阻接电源(上拉电阻大小5K~10K)。简单分析一下按键检测的原理:当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。 3、检测按键按下 按键的检测原理看起来比较简单,我们按照上述的原理先试着写一段任务中的程序看看运行效果怎么样。程序实现的内容为:百位数内的计数器,,按键每按下一次,计数器加1,将计数器的值显示在开发板的两位数码管上。程序如下: #incldue #define uchar unsigned char #define uint unsigned int sbit KeyInput=P1^0; //按键接口 //段码 uchar code Seg7Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code Seg7Posit[]={0xfe,0xfd}; //位码 uchar DispBuffer[2]; //缓冲区

独立按键控制数码管

/*独立键盘控制数码管*/ #include //#include "intrins.h" sbit P34=P3^4; // LCDEN sbit P35=P3^5; // RS sbit P36=P3^6; //WR sbit P37=P3^7; //RD sbit dula=P2^6; //段选 sbit wela=P2^7; //位选 #define uint unsigned int #define uchar unsigned char uchar display_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x00}; //0、1、2、3、4、关闭数码管段选uchar display_data[]={0x3d,0x3b,0x37,0x2f,0x1f,0xff}; //第1、2、3、4位数码管、关闭位选 void delay(uint k) //延时程序 { uchar i,j; for(j=k;j>0;j--) for(i=250;i>0;i--); } void display(uchar i) //显示函数程序 { uchar j; for(j=0;j<5;j++) { P0=display_data[i]; /*位值送入位寄存器*/ wela=1; // _nop_(); // _nop_(); wela=0; P0=display_code[i]; /*段值送入段寄存器*/

dula=1; // _nop_(); // _nop_(); dula=0; delay(1); } } void main() { while(1) { P2=0x00; if(P34==0) //按键LCDEN按下 { delay(20); if(P34==0) { display(1); //在第四位显示1 while(P34==0) ; } } if(P35==0) //按键LCDEN按下 { delay(20); if(P35==0) { display(2); //在第三位显示2 while(P35==0) ; } }

单片机独立按键和矩阵按键

单片机按键(独立按键和矩阵按键) 独立按键 常用的按键电路有两种形式,独立式按键和矩阵式按键,独立式按键比较简单,它们各自与独立的输入线相连接,如图8-6 所示。 图8-6 独立式按键原理图 4 条输入线接到单片机的IO 口上,当按键K1 按下时,+5V 通过电阻R1 然后再通过按键K1 最终进入GND 形成一条通路,那么这条线路的全部电压都加到了R1 这个电阻上,KeyIn1 这个引脚就是个低电平。当松开按键后,线路断开,就不会有电流通过,那么KeyIn1和+5V 就应该是等电位,是一个高电平。我们就可以通过KeyIn1 这个IO 口的高低电平来判断是否有按键按下。 这个电路中按键的原理我们清楚了,但是实际上单片机IO 口内部,也有一个上拉电阻的存在。我们的按键是接到了P2 口上,P2 口上电默认是准双向IO 口,我们来简单了解一下这个准双向IO 口的电路,如图8-7 所示。

图8-7 准双向IO 口结构图 首先说明一点,就是我们现在绝大多数单片机的IO 口都是使用MOS 管而非三极管,但用在这里的MOS 管其原理和三极管是一样的,因此在这里我用三极管替代它来进行原理讲解,把前面讲过的三极管的知识搬过来,一切都是适用的,有助于理解。 图8-7 方框内的电路都是指单片机内部部分,方框外的就是我们外接的上拉电阻和按键。这个地方大家要注意一下,就是当我们要读取外部按键信号的时候,单片机必须先给该引脚写“1”,也就是高电平,这样我们才能正确读取到外部按键信号,我们来分析一下缘由。 当内部输出是高电平,经过一个反向器变成低电平,NPN 三极管不会导通,那么单片机IO 口从内部来看,由于上拉电阻R 的存在,所以是一个高电平。当外部没有按键按下将电平拉低的话,VCC 也是+5V,它们之间虽然有2 个电阻,但是没有压差,就不会有电流,线上所有的位置都是高电平,这个时候我们就可以正常读取到按键的状态了。 当内部输出是个低电平,经过一个反相器变成高电平,NPN 三极管导通,那么

经典的矩阵键盘扫描程序

键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。 4*4矩阵键盘的结构如图1(实物参考见万用板矩阵键盘制作技巧)。在本例中,矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。 查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高; 否则第二行输出0,检查列线是否非全高; 否则第三行输出0,检查列线是否非全高; 如果某行输出0时,查到列线非全高,则该行有按键按下; 根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。 下面是具体程序:

void Check_Key(void) { unsigned char row,col,tmp1,tmp2; tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使 P1.4~P1.7中有一个为0 for(row=0;row<4;row++) // 行检测 { P1 = 0x0f; // 先将p1.4~P1.7置高 P1 =~tmp1; // 使P1.4~p1.7中有一个为0 tmp1*=2; // tmp1左移一位 if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(col =0;col<4;col++) // 列检测 { if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 { key_val =key_Map[ row*4 +col ]; // 获取键值,识别按键;key_Map为按键的定义表 return; // 退出循环 } tmp2*=2; // tmp2左移一位 } } } } //结束 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。

独立按键程序

/******************************************************************** * 文件名:独立按键.c * 描述: 该程序实现独立按键的判断,按了相应的独立按键后, 会在数码管上显示最先被按下的值,只有按复位按键或者重新开电才消失。* 创建人:2013年2月7日 * 版本号:1.0 * 杜邦线接法: 独立按键接法: P3.2接J8的1端。 P3.3接J8的2端。 P3.4接J8的3端。 P3.5接J8的4端。 用8针排线把P0口和J12的1-8连接(P0.0接J12的1端)。 P2.0对应J13的8端。 ***********************************************************************/ #include #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; sbit KEY2 = P3^3; sbit KEY3 = P3^4; sbit KEY4 = P3^5; //数码管的段码编码 uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /******************************************************************** * 名称: Delay_1ms() * 功能: 延时子程序,延时时间为1ms * x * 输入: x (延时一毫秒的个数) * 输出: 无 ***********************************************************************/ void Delay_1ms(uint i) { uint x,j; for(j=0;j

51单片机矩阵键盘扫描程序

/*----------------------------------------------- 名称:矩阵键盘依次输入控制使用行列逐级扫描 论坛:https://www.doczj.com/doc/c43330429.html, 编写:shifang 日期:2009.5 修改:无 内容:如计算器输入数据形式相同从右至左使用行列扫描方法 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 #define KeyPort P1 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 unsigned char KeyPro(void); void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num,i,j; unsigned char temp[8]; Init_Timer0(); while (1) //主循环 { num=KeyPro();

C语言 4x4键盘扫描程序

C语言 4*4键盘扫描电路模块 #include #define uchar unsigned char //byte #define uint unsigned int //word void keyscan(); //函数声明 void fun0(); //定义每个按键的功能函数 void fun1(); void fun2(); void fun3(); void fun4(); void fun5(); void fun6(); void fun7(); void fun8(); void fun9(); void fun10(); void fun11(); void fun12(); void fun13(); void fun14(); void fun15(); /******************************************************************** ******** 主程序 ********************************************************************* *******/ void main(void) { while(1) //循环扫描 { keyscan(); } } /******************************************************************** ******** 按键功能函数 fun0~fun15 ********************************************************************* *******/ void fun0(void) { P3=0x00; }

经典的矩阵键盘扫描程序

经典的矩阵键盘扫描程序 查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高; 否则第二行输出0,检查列线是否非全高; 否则第三行输出0,检查列线是否非全高; 如果某行输出0时,查到列线非全高,则该行有按键按下; 根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。 下面是具体程序: void Check_Key(void) { unsigned char row,col,tmp1,tmp2; tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使 P1.4~P1.7中有一个为0 for(row=0;row<4;row++) // 行检测 { P1 = 0x0f; // 先将p1.4~P1.7置高 P1 =~tmp1; // 使P1.4~p1.7中有一个为0 tmp1*=2; // tmp1左移一位 if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(col =0;col<4;col++) // 列检测

{ if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 { key_val =key_Map[ row*4 +col ]; // 获取键值,识别按键;key_Map为按键的定义表 return; // 退出循环 } tmp2*=2; // tmp2左移一位 } } } } //结束 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。 4*4矩阵键盘扫描程序 /* 设置行线为输入线,列线为输出线 */ uchar KeyScan(); //按键扫描子程序 void delay10ms(); //延时程序 uchar key_free(); //等待按键释放程序 void key_deal(); //键处理程序 //主程序 void main() { while(1) { KeyScan(); key_free(); key_deal(); } } //按键扫描子程序 uchar KyeScan() { unsigned char key,temp; P1=0xF0; if(P1&0xF0!=0xF0) { delay10ms(); //延时去抖动 if(P1&0xF0!=0xF0) { P1=0xFE; //扫描第一列

独立按键和矩阵按键

第八章独立按键和矩阵按键 我们和单片机之间进行信息交互,主要包含两大类,输入设备和输出设备。前边讲的LED小灯、数码管、点阵都是输出设备,这节课我们学习一下最常用的输入设备——按键。在本节课的学习过程中我们还会穿插介绍一点硬件设计的基础知识。 8.1 单片机最小系统电路解析 8.1.1 电源 我们在学习过程中,很多指标都是直接用的概念指标,比如我们说+5V代表1,GND代表0等等这些。但在实际电路中是没有这么精准的,那这些指标允许范围是什么呢?随着我们所学的内容不断增多,大家要慢慢培养一种阅读手册的能力。 比如我们使用STC89C52RC单片机的时候,我们找到他的手册的11页,第二个选项,工作电压:5.5V-3.4V(5V单片机),这个地方就说明我们这个单片机正常的工作电压是个范围值,只要电源VCC在5.5V到3.4V之间都可以正常工作,电压超过5.5V是绝对不允许的,会烧坏单片机,电压如果低于3.4V,单片机不会损坏,但是也不能正常工作。而在这个范围内,最典型、最常用的电压值就是5V,这就是后面括号里“5V单片机”这个名称的由来。除此之外,还有一种常用的工作电压范围是2.7V-3.6V、典型值是3.3V的单片机,也就是所谓的“3.3V单片机”了。日后随着大家接触的东西慢慢增多,对这点会有更深刻的理解。 现在我们再顺便多了解一点,大家打开74HC138的数据手册,会发现74HC138手册的第二页也有一个表格,上边写了74HC138的工作电压范围,最小值是4.75V,额定值是5V,最大值是5.25V,可以得知它的工作电压范围是4.75V-5.25V。这个地方讲这些目的是让大家清楚的了解,我们获取器件工作参数的一个最重要,也是最权威的途径,就是通过器件的数据手册。 8.1.2 晶振 晶振通常分为无源晶振和有源晶振两种类型,无源晶振一般称之为crystal(晶体),而有源晶振则叫做oscillator(振荡器)。 有源晶振是一个完整的谐振振荡器,他是利用石英晶体的压电效应来起振,所以有源晶振需要供电,当我们把有源晶振电路做好后,不需要外接电路,它就可以主动产生振荡频率,并且可以提供高精度的频率基准,信号质量比无源信号好。 而无源晶振自身无法振荡起来,它需要芯片内部的振荡电路一起工作才能振荡,它允许不同的电压,但是信号质量和精度较有源晶振差一些。相对价格来说,无源晶振要比有源晶振价格便宜很多。无源晶振两侧通常都会有两个电容,一般其容值都选在10pF~40pF之间,如果手册中有具体电容大小的要求则要根据要求来选电容,如果手册没有要求,我们用20pF 就是比较好的选择,这是一个长久以来的经验值,具有极其普遍的适用性。 我们来认识下比较常用的两种晶振的样貌,如图8-1和图8-2所示。

2x2行列式键盘扫描程序

#include #define uchar unsigned char #define uint unsigned int sbit rs=P3^5; sbit dula=P2^6; sbit wela=P2^7; sbit led2=P1^1; sbit led4=P1^3; sbit led6=P1^5; sbit led8=P1^7; sbit feng=P2^3; uchar templ; void delay1(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { dula=1; P0=0; dula=0; while(1) { P3=0xfb; templ=P3; templ=templ&0xf0; while(templ!=0xf0) { delay1(10); templ=P3; templ=templ&0xf0; while(templ!=0xf0) { templ=P3; switch(templ) { case 0xbb: led6=~led6; feng=0;

feng=1; break; case 0xeb: led4=~led4; feng=0; delay1(100); feng=1; break; } while(templ!=0xf0) { templ=P3; templ=templ&0xf0; } } } P3=0xfe; templ=P3; templ=templ&0xf0; while(templ!=0xf0) { delay1(10); templ=P3; templ=templ&0xf0; while(templ!=0xf0) { templ=P3; switch(templ) { case 0xbe: led8=~led8; feng=0; delay1(100); feng=1; break; case 0xee: led2=~led2; feng=0;

经典按键扫描程序

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。以下以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。 核心算法: unsigned char Trg; unsigned char Cont; void KeyRead( void ) { unsigned char ReadData = PINB^0xff; // 1 Trg = ReadData & (ReadData ^ Cont); // 2 Cont = ReadData; // 3 } 下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。 1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。(端口值与0XFF 按位异或,有按键按下为0,异或后相应的位就为1,相当于将读取的端口值取反) 2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。 3:算法2,用来计算连续变量。 看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。 我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。(STM32可以将端口设置为输入上拉模式)那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。下面就看看具体几种情况之下,这算法是怎么一回事。 (1)没有按键的时候 端口为0xff,ReadData读端口并且取反,很显然,就是 0x00 了。(0XFF^0XFF=0X00)Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。 Cont = ReadData; 保存Cont 其实就是等于ReadData,为0; 结果就是: ReadData = 0; Trg = 0; Cont = 0; (2)第一次PB0按下的情况 端口数据为0xfe,ReadData读端口并且取反,很显然,就是 0x01 了。(0XFE^0XFF=0X01)Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。那么这个式子的值也不难算,也就是 Trg = 0x01 & (0x01^0x00) = 0x01 Cont = ReadData = 0x01; 结果就是: ReadData = 0x01; Trg = 0x01;Trg只会在这个时候对应位的值为1,其它时候都为0 Cont = 0x01;

相关主题
文本预览
相关文档 最新文档