0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机键盘输入的程序

Wildesbeast 来源:21IC 作者:21IC 2020-06-21 11:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

这是读取键盘的子程序

主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法

以及如何处理读入的键值

思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反

那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms

消除干扰,然后,等待用户释放,否则,可能重复的到某种结果,发生意外情况

应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘的抗干扰设计等在单电能机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种查询式键盘的工作原理与读取方式。

下面是汇编语言写的单片机键盘输入程序

**************************************************

led1 bit p1.0 ;LED 显示位定义

led2 bit p1.1

led3 bit p1.2

led4 bit p1.3

led5 bit p1.4

led6 bit p1.5

led7 bit p1.6

led8 bit p1.7

s1 bit p0.0 ;数码管位定义

s2 bit p0.1

s3 bit p0.2

s4 bit p0.3

s5 bit p0.4

s6 bit p0.5

s7 bit p0.6

s8 bit p0.7

led_data equ p2 ;数码管显示数据定义

key1 bit p3.5 ;按键引脚定义

key2 bit p3.6 ;

key3 bit p3.7 ;

key equ 46h ;按键寄存单元

org 00h

jmp main

org 030h

main:mov sp,#30h ;首先定义

lcall REST;初始化子程序

lp:lcall pro_key ;调用键盘查询子程序

lcall KEYPR ;用来显示所查询到的键值

jmp lp;反复调用,不断查询

REST:

mov a,#00h

mov b,#00h

mov p0,#0

mov p1,0ffh ;

mov p2,#0

mov key,#00h

mov p2,#255

clr beep

RET

KEYPR:

mov a,key ;键值在累加器KEY中

jz PROEND ;如果 A= 0,表示没有按键,返回

cjne a,#1,k1;A= 1 ,用户按了第一个键

mov a,#1 ;处理 A = 1的情况

mov dptr,#tab_nu ;查表

movc a,@a+dptr

mov led_data,a ;显示 “1”

setb s1 ;在第一位

clr s2;其余两位不显示

clr s3

jmp PROEND;处理完成,子程序返回

;以下分别处理KEY = 2,3 的情况

k1:cjne a,#2,k2

mov a,#2

mov dptr,#tab_nu

movc a,@a+dptr

mov led_data,a

clr s1

setb s2

clr s3

jmp PROEND

k2:cjne a,#3, PROEND

mov a,#3

mov dptr,#tab_nu

movc a,@a+dptr

mov led_data,a

clr s1

clr s2

setb s3

PROEND:ret

**** 本内容跟帖回复才可浏览 *****

;************ 定时20 ms *************

delay20ms: push psw ;保存原来的寄存器单元

clr psw.3;设置新的寄存器

clr psw.4;

mov r0,#2;延时参数1

mov r1,#250;延时参数2

mov r2,#2;延时参数3

dl1:djnz r0,dl1 ;延时循环1

mov r0,#250 ;重新设置循环数据

dl2:djnz r1,dl1 ;开始第二道循环

mov r0,#240;

mov r1,#248;

dl3:djnz r2,dl1;第三道循环

nop;修正定时精度

pop psw ;恢复原来的寄存器组

ret ;返回

;*********** end *******************

;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16

; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推

tab_nu:

db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ;数字0-7 不带小数点代码

db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ;数字8-f 不带小数点代码

db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ;数字0-7 带小数点代码

db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ;数字8-f 带小数点代码

end;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。

;c语言

**************************************************

//按不同的按键,会显示不同的结果

#include 《8051.h》

#define uchar unsigned char

#define key1 P3_4 //键盘定义

#define key2 P3_5

#define key3 P3_6

//****************************************************************************

void delay(uchar times);

void display(uchar disseg,uchar disdata);

uchar keyb();

// 这里定义的是数码管对应的字符字根

code uchar disbuf_u[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,

0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,

0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};

// ***************************************************************************

uchar keybuf;

void main()

{

uchar keym = 0; //键盘返回结果的缓冲区

keybuf = 0;

P1 = 255; //关闭LED显示

P0 = 0; //关闭数码显示

P2 = 255; //

while(1) //设置一个无限制循环

{

keym = keyb(); //得到按键结果

if(keym) keybuf = keym; //如果返回有效的按键结果才保存

display(keybuf-1,keybuf); //在相应的位置显示返回的结果

}

}

//*****************************************************************************

//下面是延时程序。具体的延时时间不能通过表面程序看出,(为什么?)

//如果我们需要一个精密的延时程序,那么我们可以采用内嵌汇编代码的方式

void delay(uchar times)

{

int t=100; //延时倍数

uchar i=times;

for(;i!=0;i--)

{for(;t!=0;t--){}}

}

//这里是显示子程序,入口参数为

// disseg -》 位选 可选范围 0-7 一共8个数码管

// disdata -》 段选 可选范围 0-31 一个32个字符

// 段选 0-15 16个字符 为 “0”-》“F”

// 段选 16-31 16个字符 为 “0.”-》“F.”

void display(uchar disseg,uchar disdata)

{

uchar dataf;

if(disseg 《 8) //只有当要显示的位数有效,才显示。否则,不显示

{

dataf = 1;

while(disseg)

{

dataf 《《= 1;

disseg--;

}

P0 = dataf;

P2 = disbuf_u[disdata];

}

else{P0=0,P2=255;} //关闭数码管显示

}

uchar keyb()

{

uchar key,keytmp;

key1 = 1; //将输出线拉高

key2 = 1;

key3 = 1;

key = P3 ; //读回来

key = key & 0xf0; //获得键盘结果

if(key == 112 ) return 0; //如果用户没有按键返回 0

else

{

keytmp = key;

delay(1); //判断是不是干扰

key = P3 & 0xf0;

if (key != keytmp ) return 0; //是干扰,返回 0

else //不是干扰,等待用户释放按键

{

do{

key1 = 1; //输出拉高

key2 = 1;

key3 = 1;

key = P3 & 0xf0; //读回来

P1_0 = ~P1_0; //如果用户不释放,闪烁 p1.0

}while(key != 112 ); //等待用户释放

P1_0 = 1; //用户释放以后,清除p1.0指示灯

switch(keytmp)

{

case 96: return 3;//返回用户按键结果

case 80: return 2;

case 48: return 1;

}

}

}

}

//

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    243

    文章

    24438

    浏览量

    687490
  • 单片机
    +关注

    关注

    6074

    文章

    45341

    浏览量

    663643
  • 键盘
    +关注

    关注

    4

    文章

    868

    浏览量

    41548
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机程序的执行

    更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈。 而对于PC而言,Flash的速度太慢
    发表于 12-04 06:20

    单片机系统硬件的调试方法

    流的保护值.确定具体的保护信号。漏电保护装置的总体结构是由电流采样电流、电源模块、串行通信构成单片机.并提供数字输出功能、数字输入功能、键盘输入功能、液晶显示功能。漏电保护装置设置在机车上,可以显示漏电
    发表于 12-03 06:10

    单片机烧录原理是怎样的?辉芒微单片机烧录程序详细步骤讲解

    烧录(Programming)就是把 .hex/.bin 文件里的机器码搬运进单片机片内 Flash 的过程。辉芒微(FMD)单片机内部有一块 自举 BootROM,上电时会先跑这段程序;如果检测
    的头像 发表于 09-17 16:14 1399次阅读
    <b class='flag-5'>单片机</b>烧录原理是怎样的?辉芒微<b class='flag-5'>单片机</b>烧录<b class='flag-5'>程序</b>详细步骤讲解

    什么单片机比较耐用

            在工业控制、户外设备、医疗仪器等场景中,单片机的耐用性直接决定了设备的稳定运行与维护成本。耐用的单片机通常具备宽温工作范围、强抗干扰能力、稳定的电源适应性和长寿命的硬件设计。深圳市安
    的头像 发表于 07-31 13:48 560次阅读

    单片机的储存优点是什么

    单片机作为嵌入式系统的核心,其储存系统是实现数据存储与程序运行的关键部分。与独立存储芯片相比,单片机的储存单元在集成度、功耗、可靠性等方面具备独特优势,这些优点使其能适应从消费电子到工业控制的多样化
    的头像 发表于 07-31 10:09 497次阅读

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机应用开发、程序调试和性能优化具有重要
    的头像 发表于 07-25 11:39 480次阅读

    单片机怎么驱动电机?

    在各类自动化设备和智能装置中,电机是重要的执行部件,而单片机作为控制核心,需要通过特定的方式驱动电机运转。单片机驱动电机并非直接连接即可,而是要根据电机类型和功率,搭配合适的驱动电路,才能实现稳定
    的头像 发表于 07-25 09:31 439次阅读

    单片机是怎么控制的

    单片机作为电子系统的控制核心,通过接收外部信号、执行预设程序、驱动外部设备的方式实现控制功能,其控制过程涉及信号输入、数据处理和指令输出三个关键环节,每个环节的协同配合决定了整体控制效果。 信号
    的头像 发表于 07-23 13:59 481次阅读

    单片机怎么烧程序

    单片机程序是将编写好的程序代码写入单片机内部存储单元,让单片机按照预设逻辑工作的过程,是单片机
    的头像 发表于 07-23 11:47 655次阅读

    STC单片机范例程序

    电子发烧友网站提供《STC单片机范例程序.zip》资料免费下载
    发表于 06-04 16:27 8次下载

    2.4寸TFT彩屏配套测试程序-51单片机

    如题,2.4寸TFT彩屏配套测试程序-51单片机
    发表于 06-04 16:26 0次下载

    单片机和伺服有什么区别

    单片机和伺服的区别 单片机(Microcontroller)和伺服(Servo System)是两种完全不同的技术概念,分别属于 控制系统硬件 和 运动控制执行系统 。以下是它们的详细对比和区别
    的头像 发表于 05-26 09:18 586次阅读

    C51单片机及C语言知识点必备秘籍

    定时/计数器实验 21:单片机串行口介绍 系列四 22:单片机串行口通信程序设计 23:LED 数码管静态显示接口与编 24:动态扫描显示接口电路及程序 25:
    发表于 05-15 14:00

    单片机Debug工具性能对比 单片机调试常用命令

    单片机(Microcontroller Unit, MCU)调试是嵌入式开发中的一个重要环节,它帮助开发者发现和修复代码中的错误,优化程序性能。不同的单片机和开发环境可能使用不同的调试工具和命令
    的头像 发表于 12-19 09:56 2172次阅读

    单片机Debug与仿真区别

    是指在软件或硬件开发过程中,通过特定的工具和技术来查找、诊断和修复错误的过程。在单片机开发中,Debug通常涉及到以下几个方面: 硬件调试 :检查单片机的硬件连接是否正确,包括电源、时钟、I/O接口等。 软件调试 :使用调试器(Debugger)来检查
    的头像 发表于 12-19 09:47 1415次阅读