通过单片机外接一个4*4单片机矩阵键盘电路,设置“0-9”启动”10个按键,进行30秒倒计时显示通过2位数码管实时显示

21ic官方微信-->
矩阵键盘多个按键同时按下的问题
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
情况:现在要做一个电脑键盘,电路图采用的是最普通的矩阵键盘设计(只有按键跟导线)在按键的排版碰到了许多问题!当按下某三个键的时候,会默认为有第四个键按下(不管按下没,满足检测是否按下的按下条件)。
关于这种情况,我在网上没怎么找到相关资料,希望论坛里面的高手能够指点下!
, , , , , ,
满意回复+10
我有用软件识别过, 实际就是判断行或者列上是否有多键就可以了
矩阵式键盘,一百多键,要占用二三十个IO口吧,太浪费。
用全组合式方式5、6个接口就行了,不过要加很多二极管。
应该有现成的标准键盘方案吧。 ...
考虑在按键上串联一个二极管能否解决
同意楼上的在X1-X4或者Y1-Y4加4个二极管及ok了!
要做没有鬼键的Windows键盘?
我有现成的
本帖子中包含更多资源
才可以下载或查看,没有帐号?
中级技术员, 积分 142, 距离下一级还需 158 积分
中级技术员, 积分 142, 距离下一级还需 158 积分
中级技术员, 积分 142, 距离下一级还需 158 积分
中级技术员, 积分 142, 距离下一级还需 158 积分
考虑在按键上串联一个二极管能否解决
助理工程师, 积分 1138, 距离下一级还需 862 积分
助理工程师, 积分 1138, 距离下一级还需 862 积分
助理工程师, 积分 1138, 距离下一级还需 862 积分
助理工程师, 积分 1138, 距离下一级还需 862 积分
同意楼上的在X1-X4或者Y1-Y4加4个二极管及ok了!
中级技术员, 积分 254, 距离下一级还需 46 积分
中级技术员, 积分 254, 距离下一级还需 46 积分
中级技术员, 积分 254, 距离下一级还需 46 积分
中级技术员, 积分 254, 距离下一级还需 46 积分
要做没有鬼键的Windows键盘?
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
zhhbncwu 硬件电路不能改了,不知道软件有什么办法来检测按键
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
usbyt 鬼键是硬件无法避免的,但是我不知道该怎么处理。我用的电脑键盘,但按下的三个键(已经产生鬼键),你再按其它的按键,它处理为没有任何键按下!但是怎么把鬼键全部找出来我不会!能提供点帮助么!
中级技术员, 积分 254, 距离下一级还需 46 积分
中级技术员, 积分 254, 距离下一级还需 46 积分
中级技术员, 积分 254, 距离下一级还需 46 积分
中级技术员, 积分 254, 距离下一级还需 46 积分
我有现成的
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
usbyt 把你的知识给我们分享下吧,让我们这些小白学习学习啊,谢谢!说说你程序检测鬼键的思路,我还没想到怎么来判断是否产生鬼键了!
初级技术员, 积分 68, 距离下一级还需 32 积分
初级技术员, 积分 68, 距离下一级还需 32 积分
初级技术员, 积分 68, 距离下一级还需 32 积分
初级技术员, 积分 68, 距离下一级还需 32 积分
我有用软件识别过, 实际就是判断行或者列上是否有多键就可以了
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
助理工程师, 积分 1397, 距离下一级还需 603 积分
chuming666 可以详细说一下你的判断方法不?
高级技术员, 积分 671, 距离下一级还需 329 积分
高级技术员, 积分 671, 距离下一级还需 329 积分
高级技术员, 积分 671, 距离下一级还需 329 积分
高级技术员, 积分 671, 距离下一级还需 329 积分
矩阵式键盘,一百多键,要占用二三十个IO口吧,太浪费。
用全组合式方式5、6个接口就行了,不过要加很多二极管。
应该有现成的标准键盘方案吧。
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
多站点io口无所谓了&&只要方便修改就行&&有好是方案吗
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
你看看这段程序怎么样?我自己写的。
#include &reg51.h&
#define KEY P1
//按键码,按键之间按位或运算
#define KEY1&&0x11
#define KEY2&&0x12
#define KEY3&&0x14
#define KEY4&&0x18
#define KEY5&&0x21
#define KEY6&&0x22
#define KEY7&&0x24
#define KEY8&&0x28
#define KEY9&&0x41
#define KEY10 0x42
#define KEY11 0x44
#define KEY12 0x48
#define KEY13 0x81
#define KEY14 0x82
#define KEY15 0x84
#define KEY16 0x88
void Delay10ms(u8 c)//延时10ms
& && && &u8 a,b;
& && && &for( ; c&0; c--)
& && && && && &&&for(b=38; b&0; b--)
& && && && && && && && & for(a=130; a&0; a--);
u8 GetKeyboard()//获取矩阵键盘按键值,支持多按键
& && && &u8 key,i;
& && &&&key = 0xFF;
& && && &for(i=KEY_D i&0; i--)//按键延时 KEY_Delay*10ms
& && && &{
& && && && && &&&KEY = 0x0F;
& && && && && &&&if(KEY == 0x0F)
& && && && && &&&if(KEY != (key & 0x0F))
& && && && && &&&{
& && && && && && && && & Delay10ms(1);//消抖
& && && && && && && && & if(KEY != (key & 0x0F))
& && && && && && && && && && && &key &= (KEY | 0xF0);
& && && && && &&&}
& && && && && &&&KEY = 0xF0;
& && && && && &&&if(KEY == 0xF0)
& && && && && &&&if(KEY != (key & 0xF0))
& && && && && &&&{
& && && && && && && && & Delay10ms(1);//消抖
& && && && && && && && & if(KEY != (key & 0xF0))
& && && && && && && && && && && &key &= (KEY | 0x0F);
& && && && && &&&}
& && && && && &&&Delay10ms(1);
& && && &}
& && && &return (~key);
本于技术交流原则。请不要用该代码用于商业用途.
另外,本人现在穷的揭不开锅了,借贴求职
助理工程师, 积分 1163, 距离下一级还需 837 积分
助理工程师, 积分 1163, 距离下一级还需 837 积分
助理工程师, 积分 1163, 距离下一级还需 837 积分
助理工程师, 积分 1163, 距离下一级还需 837 积分
你看看这段程序怎么样?我自己写的。
#define KEY P1
就你这代码,还用于商业用途。。。
资深技术员, 积分 396, 距离下一级还需 104 积分
资深技术员, 积分 396, 距离下一级还需 104 积分
资深技术员, 积分 396, 距离下一级还需 104 积分
资深技术员, 积分 396, 距离下一级还需 104 积分
本帖子中包含更多资源
才可以下载或查看,没有帐号?
中级技术员, 积分 121, 距离下一级还需 179 积分
中级技术员, 积分 121, 距离下一级还需 179 积分
中级技术员, 积分 121, 距离下一级还需 179 积分
中级技术员, 积分 121, 距离下一级还需 179 积分
按键串联一个二极管就好了
扫描二维码,随时随地手机跟帖
时间类勋章
技术奇才奖章
人才类勋章
欢快之小溪
发帖类勋章
社区建设奖章
等级类勋章
时间类勋章
甘甜之泉水
发帖类勋章
希望之星奖章
等级类勋章
时间类勋章
技术高手奖章
人才类勋章
技术新星奖章
人才类勋章
您需要登录后才可以回帖
热门推荐 /6博客分类:
今天学习了下矩阵键盘,
分别代表0~F这16个数字
我们按了哪个键就显示到数码管上
看完郭老师讲解原理后就自己动手写了,郁闷的是
在keil软件中,我在switch-case语句中 少了个冒号,竟然编译通过!
结果当然不正确了,然后我再keil中调试代码,那更郁闷了,P3口在扫描到第2行键盘时就
会复位成0xff,怎么赋值都没用,其实是没写冒号啊!
调了半天都不行,最后不得不将STC89C52RC换上仿真芯片SST89E516,在线调试后才发现的错误,
然后参考书上的代码才调试成功的,表示无语~~~
#include &reg52.h&
#include "MY51.H"
void showKey(uint8 num); //静态显示
void keyScan();
void main()
showKey(18);
//初始显示的是6个负号
{ //循环检测
keyScan();
void showKey(uint8 num)
// 打开6个数码管
P0=table[num];
void keyScan()
uint8 num=0;
//定义显示的数字
uint8 temp=0;
//P3口回读信息
uint8 i=0;
//定义矩阵键盘行号索引
for(i=0; i&4;i++)
P3=_crol_(0xfe,i);
//扫描的行索引号,从第0行到第3行
//读取P3口
temp=temp&0xf0;
//提取高4位
if(temp!=0xf0)
delayms(5);
temp=temp&0xf0;
if(temp!=0xf0)
//真的按键了
switch(temp)
num=0+4*i;
num=1+4*i;
num=2+4*i;
num=3+4*i;
//18号索引是负号
// 按了不该按的指示灯
//松开按键检测
//读取P3口
temp=temp&0xf0;
//提取高4位
if(temp==0xf0)
//松开按键了
delayms(5);
temp=temp&0xf0;
if(temp==0xf0)
//真的松开键盘了
showKey(num);
//静态显示按键
void T0_Work()
//T0定时器调用的工作函数
#ifndef _MY51_H_
#define _MY51_H_
#include &math.h&
#include &intrins.h&
typedef int
typedef int
typedef unsigned int
typedef unsigned int
typedef unsigned short
typedef unsigned short
typedef unsigned long
typedef unsigned long
typedef unsigned long
typedef un
typedef signed long
typedef signed long
typedef float
typedef double
typedef signed char
typedef signed char
typedef unsigned char
typedef unsigned char
//WINDOWS的windef.h里面是这么定义的
typedef unsigned char
typedef unsigned char UCHAR ;
typedef unsigned char UINT8 ;
typedef unsigned char uint8 ;
typedef unsigned char BOOL
//windows中定义BOOL为int
typedef unsigned char bool
//bool是c++的内置类型
#define TRUE
#define true
#define FALSE
#define false
#define open
//open和close用于 标志打开和关闭状态
#define OPEN
#define close
#define CLOSE
#define lock
#define start
#define START
#define stop
#define STOP
#define keyDown
#define keyUp
sbit dula =P2^6;
//段选锁存器控制
sbit wela =P2^7;
//位选锁存器控制
#define led P1
//灯总线控制
sbit led0=P1^0;
//8个led灯,阴极送低电平点亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit keyS2=P3^4;
//4个独立按键
sbit keyS3=P3^5;
sbit keyS4=P3^6;
sbit keyS5=P3^7;
void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);
void delayms(uint16 ms);
void T0_Work();
void delayms(uint16 ms)
//软延时函数
uint16 i,j;
for(i=i&0;i--)
for(j=113;j&0;j--)
///////////////////////////////////////////////////////////////////////////
#define dark 0x11
//在段中,0x11是第17号元素,为0是低电平,数码管不亮
#define dotDark 0xff //小数点全暗时
uint8 code table[]= {
//0~F外加小数点和空输出的数码管编码
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40
空时是第0x11号也就是第17号元素
/////////////////////////////////////////////////////////////////////////////
TH0Cout=0 ;
TL0Cout=0 ;
T0IntCout=0;
//中断计数
T0IntCountAll=0; //(N-1)/65536+1;
//总中断次数
//使用延时函数标志,初始未用
//中断处理函数执行结果之一
void startT0(uint32 ms)
//开启定时器
t=ms/1000.0;
//定时时间
fox =11.0592*(pow(10,6));
//晶振频率
N=(t*fox)/12 ;
//定时器总计数值
TH0Cout =(65536-N%6;
//装入计时值零头计数初值
TL0Cout =(65536-N%6;
T0IntCountAll=(N-1)/65536+1;
//总中断次数
TMOD=TMOD | 0x01;
//设置定时器0的工作方式为1
//打开总中断
//打开定时器中断
//定时器装入初值
//启动定时器
void delayT0(uint32 ms)
//硬延时函数,自己乱写的不好用,求指点
startT0(ms);
//启动定时器
//告诉T0定时器,起用延时模式
while(bT0Over==false); //时间没到的话继续检测
//时间到了,让标志复位
void T0_times() interrupt 1 //T0定时器中断函数
T0IntCout++;
if(T0IntCout==T0IntCountAll)
//达到总中断次数值
T0IntCout=0;
//中断次数清零,重新计时
//时间真的到了
if(bT0Delay)
//本次中断是用来延时的吗
//如果是由延时函数开启T0的话,关闭T0
//循环定时的话要重装初值,每次定时1秒,重装一次
T0_Work();
//工作函数
////////////////////////////////////////////////////////////////////////////////
void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)
//控制6位数码管显示函数,不显示的位用参数 dark
//段选数据清空并锁定
//////////////////////////
P0=0 //送位数据前关闭所有显示
//低电平输到数码管阳极,避免数码管吴亮
P0=table[oneWela]|((0x01&dot)?0x00:0x80);
//送段数据,使用小数点显示标志
delayms(2);
/////////////////////////
P0=table[twoWela]|((0x02&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[threeWela]|((0x04&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[fourWela]|((0x08&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[fiveWela]|((0x10&dot)?0x00:0x80);
delayms(2);
/////////////////////////
P0=table[sixWela]|((0x20&dot)?0x00:0x80);
delayms(2);
14 顶18 踩
xouou_53320
浏览: 412289 次
void T0_Work()
//T0定时器调用的工作函数
lastSeries 写道前辈,是不是在工作以后连System ...
前辈,是不是在工作以后连System.out.println( ...
chuanwang66 写道不过改了iconv.exe路径也不 ...
正在学习,多谢分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'4×4矩阵键盘,控制数码管显示
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!51单片机4*4矩阵键盘用C语言如何设置成密码开锁键?_百度知道
51单片机4*4矩阵键盘用C语言如何设置成密码开锁键?
我有更好的答案
#include&stdio.h&#include&reg51.h&#define uchar unsigned charint i=0;char b[4]={'0','0','0','0'};//输入的密码放这里和初始的比较来判断是否密码正确 void keyscan() //扫描按键是否按下{
//扫描第一行 temp=P3; temp=temp&0xf0; if(temp!=0xf0) //判断按键是否按下 {
delayms(10);//去抖动
temp=temp&0xf0;
if(temp!=0xf0)//确认按键按下
switch(temp)
case 0xee:key='0';
case 0xde:key='1';
case 0xbe:key='2';
case 0x7e:key='3';
while(temp!=0xf0) //判断按键是否松开
temp=temp&0xf0;
b[i]=i++;if(i==3)i=0;
//扫描第二行 temp=P3; temp=temp&0xf0; if(temp!=0xf0) {
delayms(10);
temp=temp&0xf0;
if(temp!=0xf0)
switch(temp)
case 0xed:key='4';
case 0xdd:key='5';
case 0xbd:key='6';
case 0x7d:key='7';
while(temp!=0xf0)
temp=temp&0xf0;
b[i]=i++;if(i==3)i=0;
//扫描第三行 temp=P3; temp=temp&0xf0; if(temp!=0xf0) {
delayms(10);
temp=temp&0xf0;
if(temp!=0xf0)
switch(temp)
case 0xeb:key='8' ;
case 0xdb:key='9' ;
case 0xbb:key='A';
case 0x7b:key='B';
while(temp!=0xf0)
temp=temp&0xf0;
b[i]=i++;if(i==3)i=0;
} } P3=0xf7;
//扫描第四行 temp=P3; temp=temp&0xf0; if(temp!=0xf0) {
delayms(10);
temp=temp&0xf0;
if(temp!=0xf0)
switch(temp)
case 0xe7:key='C';
case 0xd7:key='D';
case 0xb7:key='E';
case 0x77:key='F';
while(temp!=0xf0)
temp=temp&0xf0;
b[i]=i++;if(i==3)i=0;
} }}main(){ char a[4]={'3','5','A','C'};
//这个做初始密码
while(1)//无限循环,保证了b
四个数有值
keyscan(); if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3])
//这里写密码正确程序要怎么处理
}}代码应该可以。。 我没板子,只是想着写。你main里面加上你要的功能试试,顺便把结果告诉我下。。。
我只是给每个按键做标记,然后根据按键按下的顺序,和预定的标记相同则判断密码正确。 按键是低电平选通。
采纳率:40%
密码只要0--9,还有6个按键可以设置为功能键的啊,想用哪个就用哪个,和数字键用法一样的。
为您推荐:
其他类似问题
您可能关注的内容
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。通过单片机外接一个启动按钮,按下启动按钮,进行30秒倒计时显示,通过LCD1602实时显_百度知道
通过单片机外接一个启动按钮,按下启动按钮,进行30秒倒计时显示,通过LCD1602实时显
我有更好的答案
你是毕业设计吗?遇到什么问题了?
采纳率:59%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 单片机矩阵键盘程序 的文章

 

随机推荐