51单片机_矩阵按键检测

更新时间:2023-05-26 02:45:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《51系列单片机_矩阵按键检测》此程序使用 单片机89SC52// 1、 此程序实现矩阵按键的检测功能,按下按键时,数码管显示按键的相应键值

《51系列单片机_矩阵按键检测》

此程序使用 单片机89SC52

// 1、 此程序实现矩阵按键的检测功能,按下按键时,数码管显示按键的相应键值

#include<reg52.h>

void delay_ms(int n) //延时函数,延时n毫秒

{

int i, j;

for(i=0; i<n; i++)

for(j=0; j<110; j++);

}

void display(int num) //控制数码管按位输出显示数值num {

char BitSet[8] =

{

0x7f, 0xbf, 0xdf, 0xef,

0xf7, 0xfb, 0xfd, 0xfe

}; //用于设置(低电平位选)数码管的位选信号,从低到高对应8个数码管

char NumberCode[16] =

{

0x3f, 0x06, 0x5b, 0x4f,

0x66, 0x6d, 0x7d, 0x07,

0x7f, 0x6f, 0x77, 0x7c,

0x39, 0x5e, 0x79, 0x71,

}; //用于设置(共阴极)数码管的段选信号,从0~f共16个数值

int n = num, i = 0;

while(n>=0)

{

P0 = 0xff; //关闭数码管当前位的显示,共阳极关闭显示段选信号 P2 = BitSet[i]; //选中数码管对应的位

P0 = ~NumberCode[n%10]; //向数码管的对应位中送入该位数值对应的段选信号 delay_ms(2); //每一位延时显示2ms

P2 = 0xff; //关闭所有位选

i++; //位标记

n=n/10; //取数值n的商

if(n==0) break; //当取得的商为0时退出while循环

}

}

《51系列单片机_矩阵按键检测》此程序使用 单片机89SC52// 1、 此程序实现矩阵按键的检测功能,按下按键时,数码管显示按键的相应键值

int MatrixKeyscan() //4*4矩阵键盘键值扫描函数,返回按下的第一个按键对应的键值

{

char key[16] = //行扫描对应的键值数组

{

0xee, 0xde, 0xbe, 0x7e,

0xed, 0xdd, 0xbd, 0x7d,

0xeb, 0xdb, 0xbb, 0x7b,

0xe7, 0xd7, 0xb7, 0x77

};

char line[4] = {0xfe, 0xfd, 0xfb, 0xf7}; //行扫描值,将各行信号分别置0,列值全1

char tmp;

int i, j, k=-1;

for(i=0; i<4; i++)

{

P1 = line[i]; //将行扫描值逐个送至P1端口 tmp = P1; //再读取P1口的值

if(tmp != line[i]) //若读取的数值不等于送入的行扫描值,表示有按键被按下

{

delay_ms(10); //延时,重新读取判断,确认有键按下 tmp = P1;

if(tmp != line[i])

{

for(j=0; j<4; j++) //当有键按下时,根据变化后的P1端口值确定对应的行列值 i和j,并给k赋予键值

{

if(tmp == key[4*i+j])

{

k = 4*i+j;

return k;

}

}

}

while(tmp != line[i]) tmp = P1; //(等待按键释放)循环直到读取的P1端口值与行扫描值相同,此时按键释放

}

}

return k; //返回扫描到的键值

《51系列单片机_矩阵按键检测》此程序使用 单片机89SC52// 1、 此程序实现矩阵按键的检测功能,按下按键时,数码管显示按键的相应键值

void main()

{

int num=0, tmp;

while(1)

{

tmp = MatrixKeyscan();

if(tmp != -1) num = tmp; //扫描键盘判断是否有按键按下 //当有按键按下时,将键值赋给num(无键按下时扫描键盘返回值-1)

display(num);

}

}

//数码管显示按下按键对应的数值

本文来源:https://www.bwwdw.com/article/cmx4.html

Top