}
unsigned char zhi()
{
switch(m){
case (0x08+0x80): k=0;break;
case (0x08+0x40): k=1;break;
case (0x08+0x20): k=2;break;
case (0x08+0x10): k=3;break;
case (0x04+0x80): k=4;break;
case (0x04+0x40): k=5;break;
case (0x04+0x20): k=6;break;
case (0x04+0x10): k=7;break;
case (0x02+0x80): k=8;break;
case (0x02+0x40): k=9;break;
case (0x02+0x20): k=10;break;
case (0x02+0x10): k=11;break;
case (0x01+0x80): k=12;break;
case (0x01+0x40): k=13;break;
case (0x01+0x20): k=14;break;
case (0x01+0x10): k=15;break;
}
return(k);
}
void main(void)
{
最新回复
ybzjllj (2008-7-14 22:27:03)
CODE:
#include <REGX51.H>
void delay(unsigned int i){
while(--i);
}
unsigned char getKeyNmu1(void){
unsigned char a;
P3=0x0f;
if(P3!=0x0f){
delay(200);
if(P3!=0x0f){
a=P3;
P3=0xf0;
a=~(P3^a);
while(P3!=0xf0);
P3=0xFF;
return a;
}
}
return 0xFF;
}
void displayKeyNum(unsigned char k){
//P1=(P1&0xF0)|(k&0x0F);
P1= k;
}
main(){
unsigned char a;
while(1){
a=getKeyNmu1();
if(a!=0xFF)displayKeyNum(a);
delay(5000);
}
}
两种键盘不一样.JPG
tssing (2008-7-14 23:51:58)
ybzjllj (2008-7-15 06:38:50)
我上面的问题,原因是什么?是代码不合理?
yubo2007 (2008-7-15 11:49:28)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int;
unsigned char i,j,k,l,n;
unsigned int e;
unsigned char lie,hang,m;
unsigned char code a[]={0xF7,0xFB,0xFD,0xFE};
unsigned char code table[16]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
sbit p37=P3^7;
sbit p36=P3^6;
void delay(uchar n)
{
while(n--){
for(i=125;i>0;i--);}//1ms
}
unsigned char scan(void)
{
P1=0xF0;
if((P1&0xF0)!=0xF0)
{
delay(1);
if((P1&0xF0)!=0xF0)
lie=~(P1|0x0F);
j=0;
P1=a[j];
while(j<=3)
{
if((P1&0xF0)!=0xF0){
hang=~a[j];break;}
else {j++
}
m=hang+lie;
return(m);
}
else return(0);
}
unsigned char zhi()
{
switch(m){
case (0x08+0x80): k=0;break;
case (0x08+0x40): k=1;break;
case (0x08+0x20): k=2;break;
case (0x08+0x10): k=3;break;
case (0x04+0x80): k=4;break;
case (0x04+0x40): k=5;break;
case (0x04+0x20): k=6;break;
case (0x04+0x10): k=7;break;
case (0x02+0x80): k=8;break;
case (0x02+0x40): k=9;break;
case (0x02+0x20): k=10;break;
case (0x02+0x10): k=11;break;
case (0x01+0x80): k=12;break;
case (0x01+0x40): k=13;break;
case (0x01+0x20): k=14;break;
case (0x01+0x10): k=15;break;
}
return(k);
}
void main(void)
{
while(1)
{
scan();
zhi();
l=2;
if(k>9)
{while(l--)
{P3=0x7F;
P2=table[k%10];
delay(15);
P3=0xBF;
P2=table[k/10];
delay(15);
}
}
else
{
P3=0x7F;
P2=table[k];
}
}
//for(e=60000;e>0;e--);
}
yubo2007 (2008-7-15 11:50:58)
未命名.JPG
yubo2007 (2008-7-15 11:51:33)
ybzjllj (2008-7-15 15:23:54)
QUOTE:
我的程序只是没有把 "扫描码" 转成 "键值" ,当按 "分离元件" 的按键时,扫描码显示是正确的,
按"组件键盘"时,扫描码就不正正确.
ybzjllj (2008-7-15 16:07:57)
QUOTE:
首先感谢你提供的程序,我用你的程序修改成我的试验目标.成功!CODE:
你用的是"键扫描"方式,我用的是"键反转"方式.而且我的代码用分离键是成功的,怪事....................#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int;
uchar code a[]={0xF7,0xFB,0xFD,0xFE};
void delay(uint n){
while(n--);
}
unsigned char scan(void){
uchar m,j,lie,hang;
P3=0xF0;
if((P3&0xF0)!=0xF0){
delay(200);
if((P3&0xF0)!=0xF0) lie=~(P3|0x0F);
j=0;
P3=a[j];
while(j<=3){
if((P3&0xF0)!=0xF0){
hang=~a[j];break;
}else{
j++;P3=a[j];
}
}
m=hang+lie;
return(m);
}else return(0xFF);
}
void main(void){
unsigned char a;
while(1){
a=scan(); //我只想显示键码,没转换成键值.
if(a!=0xFF)P1=a;
//delay(5000);
}
}
既然用你的代码能成功,也说明我的代码有瑕疵!!!!!!!
努力找一找............