标题:
各位大佬,我想通过8255的A口接键盘控制B,C口的高低电平,该怎么改程序?
[打印本页]
作者:
qwerwcnm
时间:
2021-1-15 10:27
标题:
各位大佬,我想通过8255的A口接键盘控制B,C口的高低电平,该怎么改程序?
各位大佬,我想通过8255的A口接键盘控制B,C口的高低电平(例如,第一个按键按下后,PB0变为低电平,再按一下,PB0变为高电平),我应该怎么该程序
1.JPG
(172.36 KB, 下载次数: 45)
下载附件
2021-1-15 10:25 上传
#include<reg52.h>
#include<absacc.h>
#define PA XBYTE[0x7cff] //A口地址定义
#define PB XBYTE[0x7dff] //B口地址定义
#define PC XBYTE[0x7eff] //C口地址定义
#define COM XBYTE[0x7fff] //控制地址定义
void DelayM(unsigned int x) //延时子程序
{
unsigned char t;
while(x--)
{
for(t=0;t<120;t++);
}
}
unsigned char keyscan(void) //键盘扫描
{
unsigned temp,keynum;
PA=0xfe;
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayM(20);
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=PA;
switch(temp)
{
case 0xee:keynum=0;PB=0xfe;break;
case 0xde:keynum=1;PB=0xfd;break;
case 0xbe:keynum=2;PB=0xfb;break;
case 0x7e:keynum=3;PB=0xf7;break;
}
while((temp&0xf0)!=0xf0)
{
temp=PA;
}
}
}
PA=0xfd;
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayM(20);
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=PA;
switch(temp)
{
case 0xed:keynum=4;PB=0xef;break;
case 0xdd:keynum=5;PB=0xdf;break;
case 0xbd:keynum=6;PB=0xbf;break;
case 0x7d:keynum=7;PB=0x7f;break;
}
while((temp&0xf0)!=0xf0)
{
temp=PA;
}
}
}
PA=0xfb;
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayM(20);
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=PA;
switch(temp)
{
case 0xeb:keynum=8;PC=0xfe;break;
case 0xdb:keynum=9;PC=0xfd;break;
case 0xbb:keynum=10;PC=0xfb;break;
case 0x7b:keynum=11;PC=0xf7;break;
}
while((temp&0xf0)!=0xf0)
{
temp=PA;
}
}
}
PA=0xf7;
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
DelayM(20);
temp=PA;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=PA;
switch(temp)
{
case 0xe7:keynum=12;PC=0xef;break;
case 0xd7:keynum=13;PC=0xdf;break;
case 0xb7:keynum=14;PC=0xbf;break;
case 0x77:keynum=15;PC=0x7f;break;
}
while((temp&0xf0)!=0xf0)
{
temp=PA;
}
}
}
}
void main()
{
COM=0x90; //方式0,A口为输入,B,C口为输出
PA=0xff;
PB=0xff;
PC=0xff;
while(1)
{
keyscan();
}
}
复制代码
作者:
munuc_w
时间:
2021-1-16 16:11
在此提供一点思路,供参考。
u8 temp;
if(k1)//k1按下
temp++;
if(temp >1)
temp = 0;
if(temp==1)
PB &= 0xfe;//PB0输出低电平,LED亮
else
PB |= 0x01;//PB0输出高电平,LED灭
作者:
suncat0504
时间:
2021-1-16 19:00
我查了8255的资料,感觉你使用好像有问题。如果想作为扫描键盘用,你应该使用PC口作为键盘矩阵使用。扫描矩阵要求一部分输出,一部分输入。
对8255,在设置好控制字后,是没法让PA口的一部分成为输出,而另一部分成为输出。PB也是一样的。只有PC口是允许一部分成为输入、而另一部分成为输出的。
你的程序中,在设置控制字时,应使
1、PA口作为输出口,PB口作为输出口。
2、PC7-PC4作为输出、PC3-PC0作为输入;或者PC7-PC4作为输入、PC3-PC0作为输出;
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1