c51 矩阵键盘

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char
unsigned char code num[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

sbit dula=P3^6;
sbit wela=P3^7;

uchar n=0;

void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<123;j++);
}

void display(uchar n)
{
uchar bai,shi,ge;
bai=n/100;
shi=n/10%10;
ge=n%10;

P2=0x7f;
wela=1;
wela=0;
P2=num[bai];
dula=1;
dula=0;
delay(10);

P2=0xbf;
wela=1;
wela=0;
P2=num[shi];
dula=1;
dula=0;
delay(10);

P2=0xdf;
wela=1;
wela=0;
P2=num[ge];
dula=1;
dula=0;
delay(10);
}

void scan()
{
uchar temp;
P0=0xfe;
temp=P0;
if(temp!=0xfe)
{
delay(10);
if(temp!=0xfe)
{
switch(temp)
{
case 0x7e:
n=1;
break;

case 0xbe:
n=4;
break;

case 0xde:
n=7;
break;
}
while(temp!=0xfe);
}
}

P0=0xfd;
temp=P0;
if(temp!=0xfd)
{
delay(10);
if(temp!=0xfd)
{
switch(temp)
{
case 0x7d:
n=2;
break;

case 0xbd:
n=5;
break;

case 0xdd:
n=8;
break;
}
while(temp!=0xfd);
}
}

P0=0xfb;
temp=P0;
if(temp!=0xfb)
{
delay(10);
if(temp!=0xfb)
{
switch(temp)
{
case 0x7b:
n=3;
break;

case 0xbb:
n=6;
break;

case 0xdb:
n=9;
break;
}
while(temp!=0xfb);
}
}

}

void main()
{
while(1)
{
scan();
display(n);
}
}

谁能找出所有错误啊(程序语法无错误,不能实现矩阵键盘功能)
求高手
1找出我的所有错误
2在我的错误之上进行修改
3结果必须经运行可用

我用的是共阴极数码管,矩阵键盘,纵向从左到右是8765,横向从上到下是1234,其他的程序里可以看出来

第1个回答  2011-07-25
1、第二处 if(temp!=0xf0); 最后的分号应该是笔误,去掉;。 2、此子函数的末尾,缺}一个。 3、该子程序,影响全局变量key。另外,键值并没有给出5追问

……都说了语法没错误……写到单片机里 数码管上去就显示个6少了上面一横。不知道怎么回事

第2个回答  2011-07-25
void display(uchar n)
{
uchar bai, shi, ge;
bai = n / 100;
shi = n / 10%10;
ge = n % 10;

P2=0xff; wela=1; wela=0; //消隐.
P2=num[bai]; dula=1; dula=0;
P2=0x7f; wela=1; wela=0; delay(10);

P2=0xff; wela=1; wela=0; //消隐.
P2=num[shi]; dula=1; dula=0;
P2=0xbf; wela=1; wela=0; delay(10);

P2=0xff; wela=1; wela=0; //消隐.
P2=num[ge]; dula=1; dula=0;
P2=0xdf; wela=1; wela=0; delay(10);
}

按键部分,应该修改:
void scan()
{
uchar temp;
P0 = 0xfe;
temp = P0;
if(temp != 0xfe) {
// delay(10); //延时.
display(n); //用显示来延时.
P0 = 0xfe; //延时之后.
temp = P0; //重新读入.
if(temp != 0xfe) {
switch(temp) {
case 0x7e: n=1; break;
case 0xbe: n=4; break;
case 0xde: n=7; break;
}
while(temp != 0xfe) {
temp = P0; //等待释放期间,也要重新读入.
display(n); //不要耽误显示.
}
}
}
……追问

你说的要重新读入temp很好,我明白了。但是这解决不了问题,还是不行。
另外你说的消隐。你没发现我的程序写法是不需要消隐的?你自己好好想想原理。我的写法赋值就消隐了,而且本人亲自实践过,肯定没问题。现在这个程序问题有
1 一上去就显示不对,我找不到原因啊,接通电源直接显示“6”少了最上面的一横

本回答被提问者采纳
第3个回答  2011-07-25
既然你都知道是显示错误了还不会改?另外你发个图上来好点

c51按矩阵键盘上的key0到k15外设怎么连接
按颜色。1、首先解开c51按矩阵键盘的链接线,一共有16根线,分别是key0到k15。2、它们的颜色都是有相同的,都是成双成对的,按照相同颜色的线进行链接即可。3、最后启动外设装置测试即可。

用c51单片机按下4*4矩阵按键,数码管显示0-F,能正常显示,只是0号和7...
if(H2==0){P2=0x6f;} \/\/按键盘S10,显示"9"if(H3==0){P2=0x77;} \/\/按键盘S11,显示"A"if(H4==0){P2=0x7c;} \/\/按键盘S12,显示"b"P0=0xf7;if(H1==0){P2=0x39;} \/\/按键盘S13,显示"c"if(H2==0){P2=0x5e;} \/\/按键盘S14,显示"d"if(H3==0){P2=0x79;} \/\/按键...

c51单片机 在矩阵键盘松手检测的原理是什么?为什么要加松手程序?不加又...
如果你不检测松开,你按下去的时间他整个程序扫描几遍了,会运行很快的,相当于只要是按着的,他就会检测 ,但是这按下去的这段时间他检测几遍了,就像你按了几次,如果加了,他就会检测按下去的键松开了没有,没有就会一直等待。

C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!
1、首先判断整个键盘有无按下键,只要行扫描线输入不为全1,(1111)即有键按下;P1 = 0xf0;if((P1&0xf0)!=0xf0) 如果无按键按下,全1,则返回return -1;如果有键按下则延时,再次判断有无按键按下,Delay();if((P1&0xf0)!=0xf0)如果无按键按下则返回return -1。有键按下则继续,...

求助,C51单片机用矩阵键盘按制两位数管显示的方案 内详!
回答:LED = 第1次输入 + 第2次输入 × 10

Keil C51。我想写个矩阵键盘密码器,密码对P0.0就输出低电平,可为什么不...
密码,不是边输入边鉴别的,是输入完毕后,再一次性鉴别。矩阵键盘的程序,用不着写这么长。只是输入而已,不用混进来其它操作。

C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示...
思路一首先通常想到的可能是下面这样的设计:上图形式的按键就是我们通常说的行列式按键,它的驱动思路是这样的:1. 对IO1、2、3配置为推挽输出,依次只让其中一个输出为0其他输出为1。2. 对IO4、5进行读操作,根据读出的结果判断哪个按键按下。例如:配置IO1、2、3为011,读IO4、5,若IO4为0...

郭天祥的新概念c51中,键盘检测原理那一章的程序是不是有问题,就是例4...
4.2.1这个一节是矩阵键盘,这个我最初学习单片机就是看了郭老师的视频教程和小宋老师的视频教程,4.2.1矩阵键盘没有问题把,你直接把他程序抄出来,可以直接使用的啊,肯定没有任何问题,我都测试过了,希望我的回答对你有帮助!

c51 矩阵键盘
1、第二处 if(temp!=0xf0); 最后的分号应该是笔误,去掉;。 2、此子函数的末尾,缺}一个。 3、该子程序,影响全局变量key。另外,键值并没有给出5

关于51单片机,c51编程,矩阵键盘翻转扫描的问题。请解释下图片中与,或...
是位运算,&位与运算,|位或运算。0x表示十六进制。0x0f转换成二进制是00001111。0xff转换成二进制是11111111。&运算,当相同位置都为1时才为1,否则为0。如00011010&00001111=00001010。|运算,当相同位置有一个为1则为1,否则都为0时则为0,如 00101010|00001100=00101110。

相似回答