求个单片机矩阵键盘(4*4)中断(记得要中断)的C语言程序。。求高手自己写个啊

2025-02-25 16:03:24
推荐回答(2个)
回答1:

很简单的啊,不太清楚你的电路图,我把主要程序写一下:

#include
unsigned char flag=0;//设置flag作为标志位,初值为0,一旦产生中断,将其置1
void main()
{
EA=1;//开总中断
EX0=1;//开外部中断0 ,假设是由P3.2产生的中断
IT0=1;//设置产生中断的方式,这是表示下降沿触发
P0=0X0F;//假设矩阵键盘接P0口,给所有列线低电平,所有行线高电平
while(1)
{
if(flag==1) //这个是表示,如果中断不产生,下面的程序不会运行,只有中断了,才会键盘扫描
{
按键扫描程序,这个我就不写了,写法有很多啦
}
数码管显示程序,这个我也不写了,不晓得你是什么电路图
}
}

void scan() interrupt 0
{
flag=1;//表示,一旦中断产生了,将flag置1
}

希望对你有用,呵呵

回答2:

#include
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0xb0,0xf8,0x83,0x8e,0xa4,0xf8,0x88,0x86,0xf9,0x92,0x90,0xa1,0xc0,0x99,0x80,0xc6};
uchar keyscan(void);
void delay(uint i);
void main()
{
uchar key;
while(1)
{
key=keyscan();
switch(key)
{
case 0x7e:P3=dofly[0];break;
case 0x7d:P3=dofly[1];break;
case 0x7b:P3=dofly[2];break;
case 0x77:P3=dofly[3];break;
case 0xbe:P3=dofly[4];break;
case 0xbd:P3=dofly[5];break;
case 0xbb:P3=dofly[6];break;
case 0xb7:P3=dofly[7];break;
case 0xde:P3=dofly[8];break;
case 0xdd:P3=dofly[9];break;
case 0xdb:P3=dofly[10];break;
case 0xd7:P3=dofly[11];break;
case 0xee:P3=dofly[12];break;
case 0xed:P3=dofly[13];break;
case 0xeb:P3=dofly[14];break;
case 0xe7:P3=dofly[15];break;
}
}
}
uchar keyscan(void)
{
uchar cord_h,cord_l;
P2=0x0f;
cord_h=P2&0x0f;
if(cord_h!=0x0f)
{
delay(1000);
if((P2&0x0f)!=0x0f)
{
cord_h=P2&0x0f;
P2=cord_h|0xf0;
cord_l=P2&0xf0;
return(cord_h+cord_l);
}
}return(0xff);
}
void delay(uint i)
{
while(i--);
}