pic16f877a利用I/O直接扩展键盘,利用PORTB连接普通键盘和矩阵式键盘,使用查询工作方式检测按键动作,自定义按键的键号并将结果通过七段数码显示器显示出来。要求使用查询方式和中断方式两种方法实现按键动作的检测。使用端口D连接实验箱底板的简单键盘,第一排按键序号设定为1~4,第二排按键序号设定为5~8。使用中断方式或查询方式检测按键动作,并将对应按键的序号显示在七段数码显示器上,无按键动作时显示0。使用PORTD连接矩阵键盘,第一排按键序号1~4,第二排按键序号5~8,第三排按键序号9~12,第四排按键序号13~16。使用中断方式检测按键动作,把检测到的按键键号显示在单个七段数码显示器上,没有按键按下显示0。代码
时间: 2024-03-26 17:34:21 浏览: 41
以下是利用PIC16F877A进行I/O直接扩展键盘的代码,其中使用PORTB连接普通键盘和矩阵式键盘,使用查询工作方式检测按键动作,自定义按键的键号并将结果通过七段数码显示器显示出来,同时使用查询方式和中断方式两种方法实现按键动作的检测。
```
#include <xc.h>
#include <stdio.h>
#define _XTAL_FREQ 20000000
unsigned char key[4][4]={{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
unsigned char col,row;
char keypress;
void main(void)
{
TRISB=0xF0;
TRISD=0x00;
PORTB=0x0F;
PORTD=0x00;
INTCON=0xA0;
OPTION_REG=0x00;
while(1)
{
PORTB=0x0E;
asm("NOP");
col=(PORTB & 0xF0)>>4;
if(col!=0x0F)
{
row=0;
while(1)
{
row++;
PORTB<<=1;
asm("NOP");
col=(PORTB & 0xF0)>>4;
if(col!=0x0F)
break;
}
if(col==0x0E) keypress=key[row-1][0];
if(col==0x0D) keypress=key[row-1][1];
if(col==0x0B) keypress=key[row-1][2];
if(col==0x07) keypress=key[row-1][3];
while((PORTB & 0xF0)!=0xF0);
{
PORTD=keypress;
}
}
if((PORTD & 0x0F)!=0x0F)
{
switch(PORTD & 0x0F)
{
case 0x0E: PORTD=0x01; break;
case 0x0D: PORTD=0x02; break;
case 0x0B: PORTD=0x03; break;
case 0x07: PORTD=0x04; break;
case 0x0E: PORTD=0x05; break;
case 0x0D: PORTD=0x06; break;
case 0x0B: PORTD=0x07; break;
case 0x07: PORTD=0x08; break;
case 0x0E: PORTD=0x09; break;
case 0x0D: PORTD=0x0A; break;
case 0x0B: PORTD=0x0B; break;
case 0x07: PORTD=0x0C; break;
case 0x0E: PORTD=0x0D; break;
case 0x0D: PORTD=0x0E; break;
case 0x0B: PORTD=0x0F; break;
case 0x07: PORTD=0x10; break;
}
}
else
{
PORTD=0x00;
}
}
}
void interrupt ISR()
{
if(INTF)
{
INTF=0;
asm("NOP");
col=(PORTB & 0xF0)>>4;
if(col!=0x0F)
{
row=0;
while(1)
{
row++;
PORTB<<=1;
asm("NOP");
col=(PORTB & 0xF0)>>4;
if(col!=0x0F)
break;
}
if(col==0x0E) keypress=key[row-1][0];
if(col==0x0D) keypress=key[row-1][1];
if(col==0x0B) keypress=key[row-1][2];
if(col==0x07) keypress=key[row-1][3];
while((PORTB & 0xF0)!=0xF0);
{
PORTD=keypress;
}
}
}
}
```
注:由于本代码没有提供七段数码显示器的具体连接方式,因此需要根据具体的硬件连接方式进行修改。
阅读全文