用8255的C口做键盘扫描,怎么写程序

用8255的C口做键盘扫描,怎么写程序,第1张

下面是一个我机子上调试好的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口做键盘扫描,怎么写程序、给单片机编程为什么要编写一个按键扫描的程序啊、键盘扫描的工作原理 要程序的 哪位高人给个答案啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9764686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存