标题:
4*4矩阵键盘问题,我是新手求大神解答,谢了
[打印本页]
作者:
qq550376723
时间:
2014-10-2 18:49
标题:
4*4矩阵键盘问题,我是新手求大神解答,谢了
4*4矩阵键盘写了个程序,仿真后发现按下矩阵按键不显示,后来查资料改了一个地方成功了,却又不知道原来没改的那个程序为什么不行。。
原来的程序如下
#include<reg52.h>
#define p P3
sbit DU=P2^6;
sbit WEI=P2^7;
unsigned char a,b[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
void main()
{ int key;
void display(unsigned char num);
void delay(int ms);
unsigned char temp;
P0=0X00;
WEI=1;
WEI=0;
while(1)
{ p=0xfe;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(0);break;
case 0xdf: display(1);break;
case 0xbf: display(2);break;
case 0x7f: display(3);break;
}}
}
p=0xfd;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(4);break;
case 0xdf: display(5);break;
case 0xbf: display(6);break;
case 0x7f: display(7);break;
}}
}
p=0xfb;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(4);break;
case 0xdf: display(5);break;
case 0xbf: display(6);break;
case 0x7f: display(7);break;
}}
}
p=0xf7;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(12);break;
case 0xdf: display(13);break;
case 0xbf: display(14);break;
case 0x7f: display(15);break;
}}
}
} }
void display(unsigned char num)
{
P0=b[num];
DU=1;
DU=0;
}
void delay(int ms)
{
int i,k;
for(i=112;i>0;i--)
for(k=ms;k>0;k--);
}
这个仿真不行,我把每一个switch前加了个temp,把switch里面的十六进制都改成相应的数;
改过后如下
#include<reg52.h>
#define p P3
sbit DU=P2^6;
sbit WEI=P2^7;
unsigned char a,b[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
void main()
{ int key;
void display(unsigned char num);
void delay(int ms);
unsigned char temp;
P0=0X00;
WEI=1;
WEI=0;
while(1)
{ p=0xfe;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xee: display(0);break;
case 0xde: display(1);break;
case 0xbe: display(2);break;
case 0x7e: display(3);break;
}}
}
p=0xfd;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xed: display(4);break;
case 0xdd: display(5);break;
case 0xbd: display(6);break;
case 0x7d: display(7);break;
}}
}
p=0xfb;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xeb: display(4);break;
case 0xdb: display(5);break;
case 0xbb: display(6);break;
case 0x7b: display(7);break;
}}
}
p=0xf7;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xe7: display(12);break;
case 0xd7: display(13);break;
case 0xb7: display(14);break;
case 0x77: display(15);break;
}}
}
} }
void display(unsigned char num)
{
P0=b[num];
DU=1;
DU=0;
}
void delay(int ms)
{
int i,k;
for(i=112;i>0;i--)
for(k=ms;k>0;k--);
}
然后仿真通过了。。。。不知道原来的为什么不行。。temp为什么一定=p,直接用temp=p|0x0x去switch不行吗???求指教
作者:
T29
时间:
2014-10-3 23:48
因为赋值后没有读入,没有读入检测什么呀,temp=P是读入
作者:
mqwu
时间:
2014-10-4 14:37
错误太多,还是给PIC16F877的例子你参考一下吧
#include<pic.h>
__CONFIG(0x3b31);
#define uchar unsigned char
#define uint unsigned int
//#define beep RE0
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar key, dis_buf;
uchar temp;
/*void port_init()
{
TRISB=0x0f;
TRISD=0;
TRISA=0;
TRISE0=0;
RE0=0;
PORTD=0;
PORTA=0xff;
}*/
void port_init(void)
{
OPTION=0x00;
ADCON1=0x06;
TRISA=0x00;
TRISB=0x0f;
TRISC=0x00;
TRISD=0x00;
PORTD=0x00;
PORTA=0xff;
TRISE0=0;
RE0=0;
}
void delay(uint ms)
{
uint m,n;
for(m=0;m<ms;m++)
for(n=0;n<100;n++);
}
void beep_sound(uchar num)
{
uchar i;
for (i=num; i>0;i--)
{
RE0=1;
delay(20);
RE0=0;
delay(20);
}
}
void matrixkey(void)
{
uchar temp;
PORTB=0xef;
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f);
{
delay(10);
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f)
{
temp=PORTB;
switch(temp)
{
case 0xee: key=0; break;
case 0xed: key=1; break;
case 0xeb: key=2; break;
case 0xe7: key=3; break;
default: break;
}
beep_sound(2);
dis_buf=table[key];
while(temp!=0x0f)
{
temp=PORTB;
temp=temp&0x0f;
}
}
}
PORTB=0xdf;
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f);
{
delay(10);
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f)
{
temp=PORTB;
switch(temp)
{
case 0xde: key=4; break;
case 0xdd: key=5; break;
case 0xdb: key=6; break;
case 0xd7: key=7; break;
default:break;
}
beep_sound(2);
dis_buf=table[key];
while(temp!=0x0f)
{
temp=PORTB;
temp=temp&0x0f;
}
}
}
PORTB=0xbf;
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f);
{
delay(10);
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f)
{
temp=PORTB;
switch(temp)
{
case 0xbe: key=8; break;
case 0xbd: key=9; break;
case 0xbb: key=10; break;
case 0xb7: key=11; break;
}
beep_sound(2);
dis_buf=table[key];
while(temp!=0x0f)
{
temp=PORTB;
temp=temp&0x0f;
}
}
}
PORTB=0x7f;
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f);
{
delay(10);
temp=PORTB;
temp=temp&0x0f;
if (temp!=0x0f)
{
temp=PORTB;
switch(temp)
{
case 0x7e: key=12; break;
case 0x7d: key=13; break;
case 0x7b: key=14; break;
case 0x77: key=15; break;
}
beep_sound(2);
dis_buf=table[key];
while(temp!=0x0f)
{
temp=PORTB;
temp=temp&0x0f;
}
}
}
}
void main()
{
port_init();
dis_buf=0xbf;
PORTD=dis_buf;
while(1)
{
matrixkey();
PORTD=dis_buf;
delay(2);
}
}
作者:
804534944
时间:
2014-10-5 13:23
4*4矩阵键盘 那里用写得这么复杂!!! 程序里面也有很多错误!!建议楼主参考一下网上的一些特例吧
作者:
mqwu
时间:
2014-10-5 20:41
我这是在板子上运行过的,一点问题都没有, 你说说什么问题?
作者:
qq550376723
时间:
2014-10-8 16:20
mqwu 发表于 2014-10-4 14:37
错误太多,还是给PIC16F877的例子你参考一下吧
#include
没问题,编的挺好的、、就是有个地方一直想不通,就是switch检测前为什么必须有temp=PORTB;直接switch检测temp&0x0f为什么不行呢,一直不明白。。
作者:
mqwu
时间:
2014-10-8 16:56
也可以,你看这个你就会明白, if ((temp&0x0f)!=0x0f)这样写起来只是多个括号,不是很通俗的格式。
作者:
mqwu
时间:
2014-10-8 17:17
如果没有中间变量temp, 那么每次运算和算法都要涉及IO口的运算, 会有一些你不希望看到的中间过程的值会对IO口进行读-修改-写的操作, 引入中间变量temp,让中间变量参与运算将消除这些问题。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1