51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能?
作者&投稿:线音 (若有异议请与网页底部的电邮联系)
if(key_l!=0xf0)
{
delay_nms(5);
key_l=P1;
……
在第4行加 while( key_l!=0xf0 );
等待按键释放,按键不放开就一直在此处等待,知道按键释放,此语句执行完。再往下执行
一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按键码就有效,也就是单击。何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击。那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零。这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测到有效按键。
1、在程序检测到按键后,加个延时去抖,不要加松手检测。然后执行第一个按键相对应的程序。然后继续按键扫描。注意这里说的是继续,也就是继续往下检测。否则的程序就只能执行第一个按键所对应的程序了。这样,就能检测到第二次按键的键值了。
2、例程:
uchar shaomiao()
{
uchar l,h;
P1=0xf0;//获取高四位信息。在此低四位接到行。行低电平
l=P1|0x0f;
P1=l;//只把被按下键所在列置低
h=P1|0xf0;
switch(h)
{
case 0xfe:h=0;break;//1111 1110
case 0xfd:h=1;break;
case 0xfb:h=2;break;
case 0xf7:h=3;break;
}
switch(l)
{
case 0xef:l=0;break;//1110 1111
case 0xdf:l=1;break;
case 0xbf:l=2;break;
case 0x7f:l=3;break;
}
P1=0xf0;
/******关键问题解决如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放开按键
delayms(50);//防止抖动
}
return(h*4+l);
}
uchar shaomiao()
{
uchar l,h;
P1=0xf0;//获取高四位信息。在此低四位接到行。行低电平
l=P1|0x0f;
P1=l;//只把被按下键所在列置低
h=P1|0xf0;
switch(h)
{
case 0xfe:h=0;break;//1111 1110
case 0xfd:h=1;break;
case 0xfb:h=2;break;
case 0xf7:h=3;break;
}
switch(l)
{
case 0xef:l=0;break;//1110 1111
case 0xdf:l=1;break;
case 0xbf:l=2;break;
case 0x7f:l=3;break;
}
P1=0xf0;
/******你说的关键问题解决如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放开按键
delayms(50);//防止抖动
}
return(h*4+l);
}
用定时器监测相应端口电平。
.......
集婵博抗: 这个是键盘函数,你参考一下,网上也有很多资料的 uchar keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:num=1; break; case 0...
仓山区19364008038: (80C51单片机)设计4*4键盘及8位数码管显示构成的电子密码锁.的C语言程序. - ?
集婵博抗: 4*4矩阵键盘检测程序(新手用),本程序用于检测4*4矩阵按键,先检测是否有按 键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给8位数码管,P2^0位选,P2^1段选,P1接4*4矩阵按键#include #include //头文...
仓山区19364008038: 用c语言编程:定义一个4*4二维矩阵数组,要求行列转换,并且分别求出主对脚线和次对角线上元素值的和. - ?
集婵博抗: #include<stdio.h> int main() {int i,j,sum1=0,sum2=0;int d;int a[4][4],b[4][4];for(i=0;i<4;i++)for(j=0;j<4;j++)scanf("%d",&a[i][j]); //转换前for(i=0;i<4;i++)for(j=0;j<4;j++)b[j][i]=a[i][j]; //转换后for(i=0;i<4;i++){for(j=0;j<4;j++){printf("%d ...
仓山区19364008038: c语言编程:编程:计算一个4*4矩形两个对角线之和. - ?
集婵博抗: 你应该说的是4*4矩阵吧 int a[4][4] ={.....}; int sum = 0; for (int i= 0; i < 4; ++i) { sum += a[i][i] + a[i][[3-i]; } 代码就是上面给的了
仓山区19364008038: 输入一个4*4的矩阵 编写程序 求其中的最小值及其所在的行号和列号 同时求出对角线元素之和 - ?
集婵博抗: A = rand(4,4); % 4*4随机数矩阵 t = min(A(:)) % 最小值 [x, y] = find(A==t) %最小值坐标 d = sum(diag(A)) % 对角线元素之和
仓山区19364008038: 用c语言编程输出4*4阶矩阵的最大值、最小值及其下标 - ?
集婵博抗: #include int a[4][4],max,min;int i,j; /*全局变量*/void dx() /*调用函数*/{ max=min=a[0][0]; for...
仓山区19364008038: C语言编程实现,将4*4阶矩阵转置 - ?
集婵博抗: b[j] [i]=a[i] [j]这就是实现矩阵转置了.i行j列与j行i列进行交换,使用中间变量来实现交换值.
仓山区19364008038: 求51单片机矩阵4*4键盘程序,P0口接一个数码管,P3口接矩阵键盘,C语言的 - ?
集婵博抗: #include<reg51.h> unsigned char keyval,keynum=0; unsigned char distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; void t1isr() interrupt 3 {unsigned char sccode,recode;TH0=(65536-10000)/...
仓山区19364008038: 编写程序生成4*4矩阵A,并将行和列元素互换后生成矩阵B,并将矩阵A和B输出显示 - ?
集婵博抗: #include <stdio.h> #include <stdlib.h> #include <time.h> void print( int a[][4] ) { int i, j; for ( i = 0; i < 4; ++i ) { for ( j = 0; j < 4; ++j ) { printf( "%d ", a[i][j] ); } putchar( '\n' ); } putchar( '\n' ); } int main() { int a[4][4], i, j, t; srand( time( 0 ) ); for ( i = 0; i < 16; ++i...
仓山区19364008038: 用51单片机矩阵如何写程序 - ?
集婵博抗: 矩阵键盘吗?,这是4*4矩阵键盘扫描程序,10毫秒扫描一次,用定时器1控制: void t1isr() interrupt 3 {unsigned char sccode,recode;TH0=(65536-10000)/256;TL0=(65536-10000)%256;P3=0x0f; //发0扫描,列线输入if ((P3 & 0x0f) != 0x0f)...