欢迎来到一句话经典语录网
我要投稿 投诉建议
当前位置:一句话经典语录 > 心得体会 > 4x4矩阵键盘实验心得体会

4x4矩阵键盘实验心得体会

时间:2015-11-06 03:11

谁能给我讲明白单片机的4x4矩阵键盘工作原理

首先,给P1赋值0xf0,这时P1^4,P1^5,P1^6,P1^7为高电平,P1^0,P1^1,P1^2,P1^3为低电平。

如果这时候有按键按下那么P1^4,P1^5,P1^6,P1^7就有一个会变成低电平。

因此P1的值就不等于0xf0,这是就可以判断有按键按下。

然后延时一段时间去抖动,然后给P1赋值0xfe,也就是P1^0为低电平,其他为高电平,这时如果有在P1^0线上的P1^4,P1^5,P1^6,P1^7有按键按下,那么就会出现低电平,从而判断哪个按键按下;如果没有那么就给P1赋值0xfd,也就是P1^1为低电平,其他为高电平.,相同方法判断是否有按键按下;如果没有那么就给P1赋值0xfb·····如此类推,一共四次检测。

4X4矩阵键盘程序?

4x4键盘的程序有扫描法与线反法,但我个人认为用线反法较好,用扫描法得依次扫描所有行或列,如果用线反法就简单多了。

先使键盘的行置为低、列置为高(或列置为高、行置为低),接着读回端口的值。

比如:如果使用P0为键盘接口就先使低四位为低、高四位为高即P0=0xf0然后就读回P0口的值赋给一个变量,a=P0;紧接就给行列赋相反的值行置为高、列置为低(或列置为低、行置为高)即P0=0x0f然后就读回再与a运算就能得到唯一的识别码下面的程序就是用线反写一个4x4键盘识别程序:#include#include#define KEY_SCAN P1#define uchar unsigned char\\\/\\\/char num;\\\/********************************\\\/\\\/*函数名称:KEY_DOWN() *\\\/\\\/*函数功能:延时子函数 *\\\/\\\/*参 数:无 *\\\/\\\/*返 回:返回1或0 *\\\/\\\/*备 注:1表示有键按下,0则无*\\\/\\\/********************************\\\/bit KEY_DOWN(){ KEY_SCAN=0x0f; \\\/\\\/先给键盘口赋个初值 if(KEY_SCAN!=0x0f) \\\/\\\/判断是有按键按下,即KEY_SCAN不等于初值时有键按下 { delayms(10); \\\/\\\/消抖 if(KEY_SCAN!=0x0f) \\\/\\\/再次判断是否真有键按下 return 1; \\\/\\\/真有就返回1没有返回零 else return 0; } else return 0;}\\\/********************************\\\/\\\/*函数名称:SCAN_GET() *\\\/\\\/*函数功能:键盘值函数 *\\\/\\\/*参 数:无 *\\\/\\\/*返 回:返回1或0 *\\\/\\\/*备 注:无 *\\\/\\\/********************************\\\/uchar SCAN_GET(){ char button; uchar key_code; button=KEY_SCAN; KEY_SCAN=0xf0; button=(button|KEY_SCAN); while(KEY_SCAN!=0xf0); delayms(10); switch(button) { case 0xd7: key_code='1';break; case 0xdb: key_code='2';break; case 0xdd: key_code='3';break; case 0xb7: key_code='4';break; case 0xbb: key_code='5';break; case 0xbd: key_code='6';break; case 0x77: key_code='7';break; case 0x7b: key_code='8';break; case 0x7d: key_code='9';break; case 0xeb: key_code='0';break; case 0xee: key_code=0xee;break; default : break; } return key_code;}\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/此程序是上两个程序结合的\\\/********************************\\\/\\\/*函数名称:Key_Get() *\\\/\\\/*函数功能:键盘扫描函数 *\\\/\\\/*参 数:无 *\\\/\\\/*返 回:无 *\\\/\\\/*备 注:无 *\\\/\\\/********************************\\\/void Key_Get(){ char button; KEY_SCAN=0x0f; if(KEY_SCAN!=0x0f) { delayms(5); if(KEY_SCAN!=0x0f) { button=KEY_SCAN; KEY_SCAN=0xf0; button=(button|KEY_SCAN); while(KEY_SCAN!=0xf0); switch(button) { case 0xd7: num='1';P0=0x00;break; case 0xdb: num='2';P0=0x0f;break; case 0xdd: num='3';break; case 0xb7: num='4';break; case 0xbb: num='5';break; case 0xbd: num='6';break; case 0x77: num='7';break; case 0x7b: num='8';break; case 0x7d: num='9';break; case 0xeb: num='0';break; case 0xe7: num='a';break; case 0xed: num='b';break; case 0xee: num='c';break; case 0xde: num='d';break; case 0xbe: num='e';break; case 0x7e: num='f';break; default : break; } } }}

关于4X4矩阵键盘扫描程序的问题,本人菜鸟。

能否尽量详细地说一下: P1=0x0F; \\\/\\\/低四位输入 delay(1); \\\/\\\/稍稍延时temp=P1; \\\/\\\/读P1口 temp=temp&0x0F; \\\/\\\/取低四位 temp=~(temp|0xF0); if(temp==1) \\\/\\\/检测按下的键所在的列号,在第一列 key=0; else if(temp==2) \\\/\\\/在第二列 key=1; else if(temp==4) \\\/\\\/在第三列 key=2; else if(temp==8) \\\/\\\/在第四列 key=3; else key=16; \\\/\\\/否则显示-这一段的意义你只要我解释这段的意义吧。

这一段是确定按下的键所在的列号。

我看几乎每行都有注释啊,而且注释的很好。

temp=temp&0x0F; \\\/\\\/取低四位temp=~(temp|0xF0);这行没注释,我就说一下,就是对temp低四位取反, 因为 P0是段选,低电平有效,这样能分离出按键信息。

举个例子,如果是第一列有键按下,temp在执行此句前,低四位应该是1110(低电平有 效 )执行后低四位才变成0001,恰好能为下面的 if,else if 提供正确的逻辑。

如果没键按下,temp=0x00,所以有else key=16。

显示“-”。

我想应该解释清楚了,如有疑问,给我留言。

4X4矩阵键盘程序?

这个好像是 键盘上右边 的 小键盘区吧

一般是运用于 单手盲打的快速输入区域吧

能用于 账号密码的输入 计算器 鼠标的移动控制 还有个别的 功能快捷键 DELETE PGDN END ENTER HOME 等等~~ 不过一般这些快捷键不怎么常用到

谁能给我讲明白单片机的4x4矩阵键盘工作原理

首先,给P1赋值0xf0,这时P1^4,P1^5,P1^6,P1^7为高电平,P1^0,P1^1,P1^2,P1^3为低电平。

如果这时候有按键按下那么P1^4,P1^5,P1^6,P1^7就有一个会变成低电平。

因此P1的值就不等于0xf0,这是就可以判断有按键按下。

然后延时一段时间去抖动,然后给P1赋值0xfe,也就是P1^0为低电平,其他为高电平,这时如果有在P1^0线上的P1^4,P1^5,P1^6,P1^7有按键按下,那么就会出现低电平,从而判断哪个按键按下;如果没有那么就给P1赋值0xfd,也就是P1^1为低电平,其他为高电平.,相同方法判断是否有按键按下;如果没有那么就给P1赋值0xfb·····如此类推,一共四次检测。

4x4矩阵键盘控制液晶 急

\\\/\\\/需要注意的地方说明\\\/\\\/1;在定义数组时,要用字符串定义,即字符数组\\\/\\\/2:lcd_delay(30)作用:字符一个一个出来的速度,纯粹为显数据,可以关闭这个延时.并且换行延时也可以关闭。

显的更快\\\/\\\/特别注意:所有显示数据,或者打印数据。

都遵循ASSIC码,显示时都必须转换成字符型。

#ifndef ___1602_H__#define ___1602_H__#include sbit lcd_RS=P2^5; \\\/\\\/定义寄存器sbit lcd_RW=P2^6; \\\/\\\/定义是否读写sbit lcd_E=P2^7; \\\/\\\/定义使能端sbit lcd_flag=P0^7; \\\/\\\/定义是否Busy标志sbit pd=P1^0;sbit pu=P1^1;sbit spdd=P1^2;sbit spdu=P1^3;unsigned char code lcd_Assic[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};unsigned char dis[2][16]={{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20},{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}; \\\/\\\/0x20默认输出是空,即空格void lcd_deal(unsigned char i,unsigned char j,unsigned char dat){ dis[i][j]=lcd_Assic[dat];}bit lcd_busy() \\\/\\\/判断是否忙碌 RS=Low,RW=High,E=High:读状态{ bit flag=0; lcd_RS=0; \\\/\\\/寄存器为Low lcd_RW=1; \\\/\\\/是否读写为High lcd_E=1; \\\/\\\/使能端为High if (lcd_flag==1) flag=1; else flag=0; lcd_E=0; return flag; \\\/\\\/返回标志,判断是否LCD忙碌}void lcd_putcommand(unsigned char command) \\\/\\\/写指令 RS=Low,RW=Low,E=High:写指令{ while (lcd_busy()); \\\/\\\/判断是否忙碌 lcd_RS=0; lcd_RW=0; lcd_E=0; P0=command; lcd_E=1; lcd_E=0;}void lcd_putchar(unsigned char putchar) \\\/\\\/写数据 RS=High,RW=Low,E=High:写数据{ while(lcd_busy()); \\\/\\\/判断是否忙碌 lcd_RS=1; lcd_RW=0; lcd_E=0; P0=putchar; lcd_E=1; lcd_E=0;}void lcd_moveto(unsigned char x,unsigned char y) \\\/\\\/显示字符的位置:第x行y列(X=1或2,Y=0~15){ if (x==0) lcd_putcommand(0x80|y); \\\/\\\/第一行,并初始化从第y-1个字符开始显示 if (x==1) lcd_putcommand(0xc0|y); \\\/\\\/第二行,并............}void lcd_delay(unsigned int ms) \\\/\\\/延时函数{ unsigned char i; while(ms--) { for(i=0;i<250;i++) { _nop_();_nop_();_nop_();_nop_(); } }}void lcd_init(void){ lcd_putcommand(0x38); lcd_delay(1); \\\/\\\/LCD为2行,5×7字\\\/\\\/ cd_putcommand(0x0e); \\\/\\\/打开显示,显示光标,光标不闪\\\/\\\/ lcd_putcommand(0x0f); \\\/\\\/....................光标闪烁 如果加后续程序,修改数据时,比较直观 lcd_putcommand(0x0c); \\\/\\\/纯粹是为了显数据,关闭光标比较好 lcd_delay(1); lcd_putcommand(0x06); lcd_delay(1);\\\/\\\/每次右移一字符}void _1602(void){ unsigned char *p; lcd_init(); \\\/\\\/初始化 lcd_delay(10); \\\/\\\/while(1) \\\/\\\/{ lcd_moveto(0,0); for(p=dis[0];p

你的程序根本不对,去掉键盘也 不行

4x4矩阵键盘单片机C语言程序有点问题

要不你把scan函数里面的局部变量改成外部变量

声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。联系xxxxxxxx.com

Copyright©2020 一句话经典语录 www.yiyyy.com 版权所有

友情链接

心理测试 图片大全 壁纸图片