需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来

需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来,第1张

这个是单独的键盘扫描子程序,你可以借鉴一下

我使用的P3口接的矩阵键盘,你可以根据需要适当改变 还要注意我的键值可能和你不一样,这就要看你的硬件电路是怎么设计的了

uint keyscan(void)//键盘扫描函数,使用行列反转扫描法

{

uint cord_h,cord_l,cord;//行列值

P3=0x0f; //行线输出全为0

cord_h=P3&0x0f; //读入列线值

if(cord_h!=0x0f) //先检测有无按键按下

{

delay(); //去抖

if(cord_h!=0x0f)

{

cord_h=P3&0x0f; //读入列线值

P3=cord_h|0xf0; //输出当前列线值

cord_l=P3&0xf0; //读入行线值

for(;;)

{

P3=0x0f;

if(P3==0x0f)

break;

}

P10=0;

delayring();

P10=1;

switch(cord_h+cord_l)

{

case 0x7e:P0=led[1];cord=1;break;

case 0x7d:P0=led[2];cord=2;break;

case 0x7b:P0=led[3];cord=3;break;

case 0x77:P0=led[4];cord=4;break;

case 0xbe:P0=led[5];cord=5;break;

case 0xbd:P0=led[6];cord=6;break;

case 0xbb:P0=led[7];cord=7;break;

case 0xb7:P0=led[8];cord=8;break;

case 0xde:P0=led[9];cord=9;break;

case 0xdd:P0=led[0];cord=0;break;

case 0xee:cord=13;break;

case 0xed:cord=14;break;

case 0xeb:cord=15;break;

case 0xe7:cord=16;break;

}

P2=h;

return(cord);//键盘最后组合码值

}

}return(0xff); //返回该值

}

如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你用的是共阴的还是共阳的数码管了~~

祝您的问题早日得到解决 谢谢

下列程序已经调好,按键显示电路可见:

>

修改后的代码和运行结果如下:

可见已显示为3×4的二维数组,望采纳~

附修改后的代码:

#include <stdioh>

int main() {

  int array[3][4]={{1,3,5,7},{2,4,6,8},{10,23,27,12}};

  int i, j, m = 0, n = 0,  p= 0, q = 0;

  int max = array[0][0], min = array[0][0];

  for (i = 0; i < 3; i++) {

      for (j = 0; j < 4; j++) {

          if (array[i][j] > max) {

              max = array[i][j];

              m = i; n= j;

          }

          if (array[i][j] < min) {

              min = array[i][j];

              p = i; q = j;

          }

          printf("%2d ", array[i][j]); // 这里不要换行,以空格分隔即可

      }

      printf("\n"); // 每行结尾输出换行即可

  }

  printf("最大值:%2d, 下标为%d %d\n", max, m, n);

  printf("最小值:%2d, 下标为%d %d\n", min, p, q);

  return 0; 

}

单片机行列式键盘扫描原理如下:

1、行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。

2、延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。

3、单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平。

4、此时再来读取列线数据,发现列线读到的数据有低电平,数值为1011(0x0B),如果我们的键盘布局已经确定,那么0x0B就代表S5的值了。转到S5键功能处理子程序就可以达到目的。

扩展资料

单片机学习方法

1、基础理论知识学习

基础理论知识包括模拟电路、数字电路和C语言知识。。在学习单片机之前,觉得模拟电路和数字电路基础不好的话,不要急着学习单片机,应该先回顾所学过的模拟电路和数字电路知识,为学习单片机加强基础。

2、单片机实践

准备一台电脑、一块单片机开发板、一套视频教程、一本单片机教材和一本C语言教材。电脑是用来编写和编译程序,并将程序代码下载到单片机上;开发板来运行单片机程序,验证实际效果。

22矩阵键盘是不是接P10~P13,程序如下:

KEYS:

MOV P1,#0FH

KEYS1:

CLR P10

SETB P11

JB P12,KEYS11

MOV A,#1

RET

KEYS11:

JB P13,KEYS2

MOV A,#2

RET

KEYS2:

SETB P10

CLR P11

JB P12,KEY21

MOV A,#3

RET

KEY21:

JB P13,KEYN

MOV A,#4

RET

KEYN:

MOV A,#0

RET

按键扫描,把I/0口的高低位相加

void Keyscan(void)

{

uchar r, c,key_value;

KEY_DATA = 0xf0; // 发全0行列扫描码,列线输入

key_value=KEY_DATA;

if( key_value!= 0xf0) // 若有键按下

{

delay_ms(4);

if(key_value!=0xf0)

{

r=key_value; //保存行输入码

KEY_DATA=0x0f; // 发全0行列扫描码,列线输入

key_value=KEY_DATA;

if(key_value!=0x0f) // 若有键按下

{

c=key_value; //保存列输入码

}

//键盘编码

}

key=(r+c);

}

}

利用上面所加的结果,生成键码表,S=0到S=15,

在主函数中,依据S的值做你想完成的 *** 作

uchar KeyDeal(uchar Key)

{

if(Key!=0)

{

switch(Key)

{

case 0xe7: S=0; break;

case 0xeb: S=1; break;

case 0xed: S=2; break;

case 0xee: S=3; break;

case 0xd7: S=4; break;

case 0xdb: S=5; break;

case 0xdd: S=6; break;

case 0xde: S=7; break;

case 0xb7: S=8; break;

case 0xbb: S=9; break;

case 0xbd: S=10; break;

case 0xbe: S=11; break;

case 0x77: S=12; break;

case 0x7B: S=13; break;

case 0x7D: S=14; break;

case 0x7E: S=15; break;

}

}

return (S); // 返回键编码

}

以上就是关于需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来全部的内容,包括:需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来、单片机编程问题(C语言),很入门的问题,明天比赛,急急急!多少分都可以、c语言如何让数列输出按行列显示,急!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10114027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存