本帖最后由 leaoking 于 2009-8-13 12:25 编辑
这是一个简单的单片机程序,希望能够用4*4矩阵键盘来控制在数码管上显示出所按键的平方,比如,按第1个键,数码管显示1,按第6个键数码管显示36。
程序没有语法错误,但是程序功能实现不了,个人感觉好像逻辑上有问题。
主要是函数返回值,和函数参数调用这块儿,总感觉有点儿不对劲,但是不知道怎么改过来才对。
#include<reg52.h>
#define uchar unsigned char
uchar shu,temp,num;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
sbit dx=P2^6;
sbit wx=P2^7;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}//延时函数
void display(uchar);
uchar keyscan();
void main()
{
wx=1;
P0=0xf8;
wx=0;
dx=1;
P0=0;
dx=0;//完成初始化
while(1)
{
display(keyscan());//感觉这里好像有问题,但是不知道是不是出在这里,也不知道改怎么改。。。。。
}
}
void display(uchar a)//数码管动态扫描显示函数
{
uchar bai,shi,ge;
bai=a/100;
shi=a%100/10;
ge=a%10;//分离百十个
wx=1;
P0=0xfe;
wx=0;
dx=1;
P0=table[bai];
dx=0;
delay(5);//打开第一个数码管并送百位数
wx=1;
P0=0xfd;
wx=0;
dx=1;
P0=table[shi];
dx=0;
delay(5);//打开第一个数码管并送十位数
wx=1;
P0=0xfb;
wx=0;
dx=1;
P0=table[ge];
dx=0;
delay(5);//打开第一个数码管并送个位数
}
uchar keyscan()//键盘扫描函数,判断那个键被按下,并返回一个数值到显示函数中
{
P3=0xfe;//第一行键盘给低电平
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//判断有没有键被按下
{
delay(5);
if(temp!=0xf0)//延时消抖
{
temp=P3;//重新读取P3值
switch(temp)
{
case 0xee:shu=1;break;
case 0xde:shu=4;break;
case 0xbe:shu=9;break;
case 0x7e:shu=16;break;//判断是第一行哪一个键被按下
}
while(temp!=0);
delay(5);
while(temp!=0);//延时消抖,等待松手
}
}
P3=0xfd;//以下分别先给第二行第三行第四行给低电平,依此判断16个键盘,哪个被按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:shu=25;break;
case 0xdd:shu=36;break;
case 0xbd:shu=49;break;
case 0x7d:shu=64;break;
}
while(temp!=0);
delay(5);
while(temp!=0);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:shu=81;break;
case 0xdb:shu=100;break;
case 0xbb:shu=121;break;
case 0x7b:shu=144;break;
}
while(temp!=0);
delay(5);
while(temp!=0);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:shu=169;break;
case 0xd7:shu=196; break;
case 0xb7:shu=225;break;
case 0x77:shu=256;break;
}
while(temp!=0);
delay(5);
while(temp!=0);
}
}
return shu;
}
程序复制过来之后有点儿乱,朋友们将就着看吧!
还有之前我定义的数是uchar型变量,16的平方256不超出它的范围吧,不过程序主要问题应该不是出在这儿。
哪位大侠帮忙看一下,不胜感激!!
另注:数码管八位共阴的,接两个573锁存器,然后接单片机P0口。键盘接法不用发了吧,第一行串联之后接P3^0,第二行串联之后接P3^1,第三行串联之后接P3^2,第四行串联之后接P3^3,第一列串联之后接P3^4,第二列串联之后接P3^5,第三列串联之后接P3^6,第四列串联之后接P3^7。 |