下面是一个我机子上调试好的8255程序、希望对你有所帮助。、 祝你好运~~~ 8255扫描键盘、显示程序 利用8255可编程并行口做一个扫描键盘实验, 把按键输入的键码,显示在由8279控制的七段数码管上。 8255PA口做键盘输入线,PB口作扫描线
其实按键可以有好几种工作方式,比如用中断,这个是不用扫描的,还有就是扫描方式,其实扫描就是不时的检查按键所对应的寄存器的值有没有改变,如果改变,说明按键有动作,没变说明按键没动作,为了做到及时反应按键的状态,就得不停地对按键进行扫描。。。
P2口是4X4矩阵键盘
P0口是8个发光二极管,用来显示按键
/
#include<reg52h>
unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{
unsigned char ReadData;
P2=0x0f;
ReadData=P2;
P2=0xf0;
ReadData=(ReadData | P2)^0xff;
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;
}
void KeyProc(void)
{
if (Trg ) // 如果有按下
{
P0=Trg^0xff;// 执行的代码
}
if (Cont) // 如果按键被按着不放
{
}
if (Trg ==0 & Cont==0) //按键放开
{
P0=0xff;
}
}
void main()
{
Trg=0;
Cont=0;
while(1)
{
KeyRead();
KeyProc();
}
}
2个IO检测6个按键的方法
单片机IO口如果识别更多的按键,简单的方法就是通过控制按键按下,识别电流的流向。这说可能不是很理解,下面就来介绍下,如下图按键识别电路:
按键S1按下,电流是从R1流向GND的,S2按下是从R2流向GND,S3按下是从R1和R2共同流向GND。
S4按下是从IO1流向IO2,也可以从IO2流向IO1,S5按下是从IO1流向IO2,S6按下是从IO2流向IO1。按键按下和电流流向关系如下:
那么这6个按键单片机要怎么识别呢,下面就说下识别思路流程:
1 先配置IO1和IO2都为1,然后读IO1和IO2,若读到IO1为0,那么S1按下,若读到IO2为0,那么S2按下,若读到IO1和IO2都为0,那么S3按下,若IO1和IO2都没读到0,那么进行下一步;
2 配置IO1为0,IO2为1,读IO2,若读IO2为1,进入下一步,若IO2读为0,那么可以判断是S4或S6按下,然后再配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S4按下,若IO1读为1就是S6按下了。
3 配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S5按下了。
将上面的电路图再精简下就是下面的图形了,是不是很有美感,下图还比上图省2个二极管哦。
欢迎评论交流,也欢迎大家关注我:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!
淘bao 旺铺: 广州华电 单片机学习板 单片机外围学习模块/传感器模块
//44键盘检测程序,按下键后相应的代码显示在数码管上
#include<reg51h>
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
display(unsigned char num)
{
P0=table[num];
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
}
void main()
{
dula=0;
wela=0;
while(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfe;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
}
}
给你一个经典的,自己研究研究:#define Key_Port P1unsigned char code tab[]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};
unsigned char Key_Scan(void)
{
unsigned char key_temp=0xff,i=0xff;
Key_Port=0xf0;
if(Key_Port!=0xf0)
{
key_temp=Key_Port;
Key_Port=0x0f; //线反转
key_temp=(Key_Port&0x0f)|(key_temp&0xf0); //这里已经得到键码
while(Kep_Port!=0x0f); //等待按键释放,可在while里加入显示防止显示中断
for(i=0;i<16;i++) //键码比较,找到则退出循环
if(tab[i]==key_temp)break;
}
return i; //返回查找到的是第几个键,一般都需要数字键,这样做很有用,如无按键按下则返回0XFF,
}如只需返回键码,则只要如下写即可,比楼主的经典得多也有效得多unsigned char Key_Scan(void)
{
unsigned char key_temp=0xff;
Key_Port=0xf0;
if(Key_Port!=0xf0)
{
key_temp=Key_Port;
Key_Port=0x0f; //线反转
key_temp=(Key_Port&0x0f)|(key_temp&0xf0); //这里已经得到键码
while(Kep_Port!=0x0f); //等待按键释放,可在while里加入显示防止显示中断
}
return key_temp; //返回键码,如无按键按下则返回0XFF,
}
以上就是关于用8255的C口做键盘扫描,怎么写程序全部的内容,包括:用8255的C口做键盘扫描,怎么写程序、给单片机编程为什么要编写一个按键扫描的程序啊、键盘扫描的工作原理 要程序的 哪位高人给个答案啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)