做矩阵键盘实验的时候发现,如果矩阵键盘I0口选用P3口,任意按键按下时,相应IO端口电平变为高电平1。。当选用P1口的时候,任意按键按下,相应的IO端口电平变为低电平0。。。
这种情况是怎么回事??
求高手解答。。。好加分。。。
乱喷和胡乱推测的,请绕道。。。
51单片机,在做矩阵键盘(行列式键盘)的时候,IO口选择不同,按键按下时,相应IO口读入电平也不同,为什么
答案:2 悬赏:80 手机版
解决时间 2021-03-12 00:00
- 提问者网友:末路
- 2021-03-11 01:00
最佳答案
- 五星知识达人网友:佘樂
- 2021-03-11 01:19
矩阵键盘常用开发方法是行列反转法,不知道你是怎么开发的
全部回答
- 1楼网友:第四晚心情
- 2021-03-11 02:45
#include
#include
unsigned char code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管显示0~f
void delay() //延时子程序
{
unsigned char n, m;
for (n = 100; n > 0; n--)
for (m = 300; m > 0; m--);
}
void display(unsigned char s) //显示子程序
{
p0 = table[s]; //数码管是p0口驱动的
delay();
p2 = 0x7f; //数码管选通开关(p2.7选通 也就是数码管的第八位 (从左到右顺序))
}
unsigned char keycan(void) //按键扫描程序 p1.0--p1.3为行线 p1.4--p1.7为列线
{
unsigned char rcode, ccode;
p1 = 0xf0; // 发全0行扫描码,列线输入
if((p1&0xf0) != 0xf0) // 若有键按下
{
delay();// 延时去抖动
if((p1&0xf0) != 0xf0)
{ rcode = 0xfe; // 逐行扫描初值
while((rcode&0x10) != 0)
{
p1 = rcode; // 输出行扫描码
if((p1&0xf0) != 0xf0) // 本行有键按下
{
ccode = (p1&0xf0)|0x0f;
do{;}while((p1&0xf0) != 0xf0); //等待键释放
return ((~rcode) + (~ccode)); // 返回键编码
}
else
rcode = (rcode<<1)|0x01; // 行扫描码左移一位
}
}
}
return 0; // 无键按下,返回值为0
}
void keydispaly(unsigned char key)
{
switch(key)
{
case 0x11: display(0); break;
case 0x21: display(1); break;
case 0x41: display(2); break;
case 0x81: display(3); break;
case 0x12: display(4); break;
case 0x22: display(5); break;
case 0x42: display(6); break;
case 0x82: display(7); break;
case 0x14: display(8); break;
case 0x24: display(9); break;
case 0x44: display(10); break;
case 0x84: display(11); break;
case 0x18: display(12); break;
case 0x28: display(13); break;
case 0x48: display(14); break;
case 0x88: display(15); break;
default: break;
}
}
int main(void)
{
unsigned char key;
while(1)
{
key = keycan();
keydispaly(key);
}
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯