【C51自学笔记】独立键盘+矩阵键盘

发布者:码字奇思最新更新时间:2022-04-21 来源: eefocus关键字:C51  独立键盘  矩阵键盘 手机看文章 扫描二维码
随时随地手机看文章

独立键盘:

键盘:


v键盘分编码键盘(如PS2的键盘)和非编码键盘。


v键盘上按键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等。


v而靠软件编程来识别的称为非编码键盘;


v 在单片机组成的各种系统中,用的最多的是非编码键盘。非编码键盘又分为:独立式非编码键盘和行列式非编码键盘。


独立键盘:

符合线与概念:开关闭合之后,IO为低电平(一条线上,一端为0,另一端也为0)


线或:有一端为高组态,完全看另一端的表现。


防抖动:

硬件消抖:CPU太过繁忙


软件消抖:延时函数


如何检测键盘是否按下:


给IO口置为1,时刻检测IO,如果IO为0,说明按下。


举例:

利用key1控制数码管的数字变化:


#include

#define uchar unsigned char 

#define uint unsigned int 

 

sbit key1=P3^2;//key1按键

sbit led0=P0^0;

 

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

//unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};

 

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

//延时函数,在12MHz的晶振频率下

//大约50us的延时

//大约50ms的延时

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

void delay_50us(uint t)

{

uchar j;

for(;t>0;t--)

        for(j=19;j>0;j--);

}

void delay_50ms(uint t)

{

uint j;

for(;t>0;t--)

for(j=6245;j>0;j--);

 

void main()

{

uchar num;

P3=0xff;

while(1)

{

if(key1==0)

{

delay_50us(200);

if(key1==0)

{

num++;

led0=0;//led灯的反馈 亮

if(num==10)

num=0;

while(!key1);

}

delay_50us(200);

while(!key1);//等待松手进入下一次循环

}

else 

led0=1;//led灯的反馈 灭

P1=smg_du[num];//松手变数

}

}


矩阵键盘:

           如果开发的系统要用到很多的按键,为了节省I/O口,我们一般使用4*4键盘。


这样用一个8位的I/O口就可以驱动16个键盘。


原理图:


0-3:行线


4-7:列线


扫描按键的方法:


初始化P3= 1111 0000

k = P3 读取P3状态

k&1111 0000(获取高四位)(获得列位置)

k= k|00001111(高四位+低四位全为1)

P3 = k(可以获得行位置,线与)

k2 = P3(获取状态)

k2 = k2&00001111(屏蔽高四位)k = k&11110000(屏蔽低四位)

a = k+k1(获取位置)

switch语句判断

实例:

#include

#define uchar unsigned char 

#define uint unsigned int 

 

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

 

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

//延时函数,在12MHz的晶振频率下

//大约50us的延时

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

void delay_50us(uint t)

{

uchar j;

for(;t>0;t--)

        for(j=19;j>0;j--);

}

 

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

//延时函数,在12MHz的晶振频率下

//大约50ms的延时

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

void delay_50ms(uint t)

{

uint j;

for(;t>0;t--)

for(j=6245;j>0;j--);

 

void main()

{

uchar key_l,key_h;

uchar key;

while(1)

{

P3=0xf0;

key_l=P3;

key_l=key_l&0xf0;

if(key_l!=0xf0)

{

delay_50us(100);

if(key_l!=0xf0)

{

key_l=P3&0xf0; //11100000

key_l=key_l|0x0f;//11101111

P3=key_l;

key_h=P3;

key_h=key_h&0x0f;//00001110

key_l=key_l&0xf0;//11100000

key=key_h+key_l; //11101110

}

}

switch (key)

{

case 0xee:P1=smg_du[0];break;

case 0xde:P1=smg_du[1];break;

case 0xbe:P1=smg_du[2];break;

case 0x7e:P1=smg_du[3];break;

case 0xed:P1=smg_du[4];break;

case 0xdd:P1=smg_du[5];break;

case 0xbd:P1=smg_du[6];break;

case 0x7d:P1=smg_du[7];break;

case 0xeb:P1=smg_du[8];break;

case 0xdb:P1=smg_du[9];break;

case 0xbb:P1=smg_du[10];break;

case 0x7b:P1=smg_du[11];break;

case 0xe7:P1=smg_du[12];break;

case 0xd7:P1=smg_du[13];break;

case 0xb7:P1=smg_du[14];break;

case 0x77:P1=smg_du[15];break;

 

}

}

}

关键字:C51  独立键盘  矩阵键盘 引用地址:【C51自学笔记】独立键盘+矩阵键盘

上一篇:51单片机定时器设置方式_51单片机定时器/计数器
下一篇:【C51入门笔记】IIC总线+E2PROM芯片(24C02)

推荐阅读最新更新时间:2024-11-13 10:25

C51 INT0中断程序
//INT0中断程序 #include reg52.h void delay(unsigned int x); main() { IT0=1; //下降沿触发 EX0=1; //开INT0中断 EA=1; P1=0xff; while(1) { } } void int0() interrupt 0 { IT0=0; //关中断, P1=~P1; delay(20000); //延时 IT0=1; //开中断 } void delay(unsigned int x) //延时 { unsigned int i; for(i=0;i x;i++) {} }
[单片机]
C51的基础 8 《 控制流程语句 》
1.3 控制流程语句 Turbo C2.0提供了丰富、灵活的控制流程语句, 主要有:条件语句、循环语句和开关语句。下面将对这些语句作详细介绍。 1.3.1 条件语句 象其它语言一样Turbo C2.0也提供条件语句。在Turbo C2.0中条件语句的一般形式为: if(表达式) 语句1; else 语句2; 上述结构表示: 如果表达式的值为非0(TURE)即真, 则执行语句1, 执行完语句1从语句2后开始继续向下执行; 如果表达式的 值为0(FALSE)即假, 则跳过语句1而执行语句2。所谓表达式是指关系表达式和逻辑表达式的结合式, 关于表达式前面已作过介绍, 这是不再重复。 注意
[单片机]
Keil C51 中指针的使用
  指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用。   keil51的指针,包含两种指针:普通指针,兼容标准C;内存特殊指针   1 普通指针 char * ptr; //指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节char * xdate ptr; //指针存储在片外,xdate 是修饰ptr的char * idate ptr; //指针存储在片内,指针指向的数据可以是片内也可以是片外   2 内存特殊指针 char xdate * ptr; //指针存储占字节不一定,根据变量存
[单片机]
Keil <font color='red'>C51</font> 中指针的使用
STM32学习——矩阵键盘
在之前的学习中就学过了IO口的操作,矩阵键盘就是对IO口的操作,还有一个就是扫描模式。 方法一: 逐行扫描:通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 方法二: 行列扫描:通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。 在这里用到了中断的方法,行输出高电平,列做模拟输入口。当有按键按
[单片机]
STM32学习——<font color='red'>矩阵键盘</font>
基于c51单片机8位数码管显示电子时钟程序
/* 8位数码管显示 时间格式 05—50—00 标示05点50分00秒 S1 用于小时加1操作 S2 用于小时减1操作 S3 用于分钟加1操作 S4 用于分钟减1操作 */ #include reg52.h sbit KEY1=P3^0; //定义端口参数 sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED =P1^2; //定义指示灯参数 code unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0—9 unsigned
[单片机]
单片机--数码管显示模块(C51
下面是51单片机数码管显示模块的代码,具体说明在注释里表达得比较清楚。 #include reg52.h #define uchar unsigned char #defind uint unsigned int sbit seg_oe=P1^3; //数码管显示使能端,低电平有效 sbit duanxuan=P1^4; //数码管的段选端 sbit weixuan=P1^5; //数码管的位选端 uchar code smg_duan ={ //数码管段选码表,我们的数码管是共阴极数码管 0x3F,0x06,0x5B,0x4F, 0x66,0x6d,0x7d,0x07, 0x7
[单片机]
C51中float定义的实数存放形式
C51中的浮点数采用IEEE-754标准来表示,存储长度为4个字节,其中包含3个位域:数符,阶码和尾数。 (1)1位数符位:D31 (2)8位阶码:D30----D23(补码形式存放),其中D30是符号位,与一般表示方法不同,它用1表示正,用0表示负。 (3)23位尾数:D22----D0(原码形式存放)(注意第一位尾数不出现在内存中,它总是1,故省略了。) 将一个实数存数在C中的方式为: (1)将这个实数的绝对值转化成二进制格式。(整数部分:除二取余,逆序排列;小数部分:乘2取整,顺序排列。) (2)将这个二进制格式实数的小数点,左移或右移n位,直到整数部分有且只有一位有效数字(即整数部分必须为一个1)。 (3)从小数点左边第
[单片机]
ARM矩阵键盘设计及其linux驱动实现
在嵌入式系统开发中,经常通过键盘来实现人机交互。本文介绍了一种直接利用ARM的I/O口扩展矩阵键盘的方法。同时以TQ2440开发板为例,对硬件电路连接和相应的linux驱动设计方法都作了详细说明。 1.引言 ARM微处理器已广泛应用于工业控制、消费类电子产品、通信系统等领域。矩阵键盘是一种常用的键盘形式,它将按键设计成M行N列,这样共需M+N根信号线,却可驱动M×N个按键,大大节约了I/O资源。本文介绍了一种利用TQ2440开发板的GPIO口扩展5×4矩阵键盘的方法,并将所有按键重新布局成手持终端的键盘形式,方便操作。 2.硬件设计 本设计扩展5行4列的矩阵键盘,如图1所示。其中行线ROW1-ROW5连接S3C24
[单片机]
ARM<font color='red'>矩阵键盘</font>设计及其linux驱动实现

推荐帖子

CC1101只能发送一次数据
我使用CC1101+STM8,两个模块能够实现通信,但是只能收发一次,必须要复位一下接收端才能再收一次,无法连续接收数据,接收成功时,发送端收到ACKOK,之后就是ACKerror,为什么接收端只能收一次数据,怎么解决这个问题,求助大神解答CC1101只能发送一次数据检查程序吧,典型的程序错。 有没有遇到同样的问题?一般会是程序哪里出错 自己检查吧,没有“一般”之说,错误人人不同。默认情况下,接收端接收一次数据后就会进入空闲模式
书小叶 无线连接
基于单片机的汽车组合电子仪表
仪表是人和汽车的交互界面,为驾驶员提供所需的汽车运行参数、故障、里程等信息,是每一辆汽车必不可少的部件。仪表显示的直观与美观使得驾驶不但是代步之必需,也成为舒适生活的一部分,而参数传递的准确与可靠性则直接关系到汽车行驶的安全。现代仪表最突出的特点是功能的模块化,通常要组装一块仪表,只需将几个功能模块在定制PCB的基础上联合起来,就可以得到一个完整的系统。长安等经济型汽车的指针仪表一般为独立的模块,提示/报警功能由PCB上的小灯泡完成。SANTANA系列的指针由印刷电路板上的十字线圈驱动,
frozenviolet 汽车电子
世界著名汽车品牌标识演化历史------雷诺
雷诺Renault雷诺的名字来自于他的创始人法国人路易斯·雷诺(LouisRenault)。路易斯·雷诺打造出自己的第一辆汽车的时候,只有21岁,那是1898年。这辆车诞生在父母家的后院,使用的是德席琳迪翁发动机(DeDion-engine),排量只有273毫升。随后,他和他的两个兄弟费尔南多(Fernand)、马塞尔(Marcel)一起成立了雷诺汽车公司,公司在塞纳河边的布伦城Billancourt,并很快就接到了订单。第一次世界大战期间,
1ying 汽车电子
CC2530和STM32F103之间的串口通信问题
最近在写Zigbee网关通信程序,需要用到CC2530和STM32F103ZET6之间的串口通信。两者的串口配置都是一样的,CC2530之间可以进行通讯,STM32之间也可以进行通讯;STM32发CC2530收也可以正常通讯,但是CC2530发、STM32收就不能正常通讯,请问这是怎么回事?求大神指点,谢谢!我用万用表测了两者串口引脚的电平,STM32的TX端配置为推挽输出(电平为3.3V),RX端为浮空输入(电平为0.15V);CC2530串口0的两个引脚均为3.3V。是不
fgh_asd RF/无线
51单片机能控制的TFT触摸屏
51单片机能控制的TFT触摸屏直接上一段源码大家看看,希望大家多多支持啊/************************************************TFT6448BS-5.7显示武汉谷鑫为您添光增彩www.mcutech.cn*************************************************/sfrAUXR=0x8e;//////////////////////////////////注意增加该语句。#in
gxkj001 51单片机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved