给自己的实验板写的矩阵键盘程序,请前辈帮小弟找错!
程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar num,temp;
sbit dula=P3^6;
sbit wela=P3^7;
uchar code table[]={
0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 ,
0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 ,
0xc6 , 0xc0 , 0x86 , 0x8e , 0xff};
void delay(uint z);
void display(uchar aa);
uchar keyscan();
void main()
{
num=17;
dula=1;
P0=0xff;
dula=0;
wela=1;
P2=0xfe;
wela=0;
while(1)
{
display(keyscan());
}
}
void display(uchar aa)
{
dula=1;
P0=table[aa-1];
dula=0;
}
uchar keyscan()
{
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(1)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe0: num=1;
break;
case 0xd0: num=2;
break;
case 0xb0: num=3;
break;
case 0x70: num=4;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(1)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe0: num=5;
break;
case 0xd0: num=6;
break;
case 0xb0: num=7;
break;
case 0x70: num=8;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(1)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe0: num=9;
break;
case 0xd0: num=10;
break;
case 0xb0: num=11;
break;
case 0x70: num=12;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(1)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe0: num=13;
break;
case 0xd0: num=14;
break;
case 0xb0: num=15;
break;
case 0x70: num=16;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
return num;
}
void delay(uint z)
{
uint x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
我也看着郭天祥的视频在温习,感觉他这里写的太不简洁了。
可以精简一下的;
/*矩阵键盘扫描程序:线反转法(经典矩阵键盘检测程序)
动态扫描显示数码管、线反转法检测4×4矩阵键盘
P1口流水灯实时显示P3口电平(熄灭表示高电平、点亮表示低电平)
用程序状态寄存器PSW中的PSW^5,作为全局标志位
// Header:P3口低4位接矩阵键盘行、高4位接矩阵键盘列
// File Name:经典矩阵键盘检测程序(线反转法)
// Author:田
// Date:2012年12月7日 */
#include<reg52.h>//STC89C52RC 头文件
#include<intrins.h>//_crol_函数的头文件
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
uchar num;//定义全局变量
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阳极数码管字符表
void delay(uint xms) //延时函数
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);
}
void display(num) //显示函数
{
uchar numwe,xwei;
xwei=6;//用几位数码管显示?
numwe=0xfe;//初始化数码管位选控制
for(;xwei!=0;xwei--)
{
dula=1; //开段选锁存器
P0=table[num];//送显示数
dula=0; //关段选锁存器
P0=0xff;//消影
wela=1; //开位选锁存器
P0=numwe;//送数码管位选控制
wela=0; //关位选锁存器
numwe=_crol_(numwe,1); //对数码管位选控制 左移位
delay(1);//调用延时函数
}
}
void keyscan()//矩阵键盘扫描函数 开始
{
uchar x,y,key,temp;//定义:行坐标x、列坐标y、按键key
temp=0x0f;// 0000 1111
P3=temp;//P3口:4列送0000、4行送1111;
if (P3!=temp)//1判断是否有按键按下;
{
delay(10);//延时10毫秒消抖动;
P3=temp;//P3口:列送0000、行送1111;
if (P3!=temp)//2次判断是否有按键按下;
{
x=P3&temp;//取按下矩阵键盘的行坐标
temp=~temp;//按位取反,线反转使用;
P3=temp;//线反转P3口:4列送高电平、4行送低电平;
y=P3&temp;//取按下矩阵键盘的列坐标
key=x|y;//行坐标x、列坐标y 进行或运算组合在一起。
while(P3!=temp);//按键释放检测语句
P1=key;//用流水灯显示当前的P3口状态
switch (key) //进入开关多分支语句判断
{
case 0xee: num=0; F0=1;
break;
case 0xde: num=1; F0=1;
break;
case 0xbe: num=2; F0=1;
break;
case 0x7e: num=3; F0=1;
break;
case 0xed: num=4; F0=1;
break;
case 0xdd: num=5; F0=1;
break;
case 0xbd: num=6; F0=1;
break;
case 0x7d: num=7; F0=1;
break;
case 0xeb: num=8; F0=1;
break;
case 0xdb: num=9; F0=1;
break;
case 0xbb: num=10; F0=1;
break;
case 0x7b: num=11; F0=1;
break;
case 0xe7: num=12; F0=1;
break;
case 0xd7: num=13; F0=1;
break;
case 0xb7: num=14; F0=1;
break;
case 0x77: num=15; F0=1;
break;
default://出错处理!
F0=0;//程序状态字 置0
break;
}
}
}
}//矩阵键盘扫描函数 结束
void init()//初始化函数
{
F0=0;//程序状态字:上电数码管不显示、以及出错处理
num=0;
}
void main() //主函数 开始
{
init(); //调用 初始化函数
while(1)//大循环 开始
{
keyscan();//调用按键扫描函数
if (F0==1)//判断是否正确按下了矩阵按键
{
display(num);//调用 显示函数
}
else//错误按键处理(关闭数码管显示、关闭流水灯)
{
dula=1; //开U1锁存器
P0=0xff;//送关闭数据
dula=0; //关U1锁存器
wela=1; //开U2锁存器
P0=0xff; //送关闭数据
wela=0; //关U2锁存器
P1=0xff;//熄灭流水灯
delay(100);
P1=~P1;//流水灯闪烁
delay(100);
}
}//大循环 结束
}//主函数 结束
但是,我想知道我错在哪里了?
前辈,指点小弟一下吧。
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
首先你得确定你的矩阵硬件电路,和郭的一样,不然的话不做更改肯定还是不行!
有道理 我的板子就和郭天祥的不一样 就改了 可以运行来自: Android客户端
看看键盘是否接在P2口上来自: Android客户端
看看键盘是否接在P2口上来自: Android客户端
怎么那么多 while(1)
switch case语句中,case后面的判断数据是不一样的,你四个里面都一样,按下键盘后,当然不能实现功能
请加注释再放电路图,我给你弄到任务区去 速度