📄 key_matrix.c
字号:
/*******************************************
*文件名: Key_Matrix.C
*Copyright: www.zlgmcu.com
*日期: 13:44 04-3-8
*功能: 可中断型键盘矩阵的示例代码
*******************************************/
#include "reg932.h"
#define uchar unsigned char
uchar Result;
uchar Row[3];
uchar Column[3];
uchar Matrix[0x10]={ 0xEE,0xED,0xEB,0xE7, //11101110,11101101,11101011,11100111,
0xDE,0xDD,0xDB,0xD7, //11011110,11011101,11011011,11010111,
0xBE,0xBD,0xBB,0xB7, //10111110,10111101,10111011,10110111,
0x7E,0x7D,0x7B,0x77}; //01111110,01111101,01111011,01110111,
void Power_Down();
void KeyISR_Init();
void ReadKey();
void Delay();
void Delayus();
//-------------------------------------------
//功能:键盘中断处理程序
//-------------------------------------------
void KEY_ISR() interrupt 7{
EA=0;
PCONA=0x00; //外部功能模块上电
ReadKey(); //读键盘
switch(Result){ //判断读取的值
case 0xEE: //如果读取的值为0xEE,则表示KEY1键按下
//这里可添加你的处理程序
break;
case 0xEB: //如果读取的值为0xEB则表示KEY3键按下
//这里可添加你的处理程序
break;
default:
break;
}
KBCON=0;
EA=1;
}
//-------------------------------------------
//功能:主函数
//-------------------------------------------
main()
{
P0M1=0x00; //设置P0口
P0M2=0x00;
KeyISR_Init(); //键盘中断初始化
while(1);
{
Power_Down(); //完全掉电
}
}
//-------------------------------------------
//功能:掉电
//-------------------------------------------
void Power_Down()
{
PCONA=0xFF; //外部功能模块掉电
PCON=0x03; //完全掉电
}
//-------------------------------------------
//功能:键盘中断初始化程序
//-------------------------------------------
void KeyISR_Init()
{
KBMASK=0x0F; //设置P03->P00为中断源
KBCON=0x00; //清除键盘中断标志
P0=P0&0x0F; //P07->P04作输出,先使其输出0000xxxxB;
Delayus(); //延时3us左右,使程序对P0端口的操作更稳定
EKBI=1;
EA=1;
}
//-------------------------------------------
//功能:键盘扫描程序
//-------------------------------------------
void ReadKey()
{
uchar Temp;
uchar i,j;
uchar flag;
P0=P0&0x0F; //P07->P04作输出,先使其输出0000xxxxB;
Delayus(); //延时3us左右,使程序对P0端口的操作更稳定
Temp=P0; //读P0口
Delayus(); //延时3us左右,使程序对P0端口的操作更稳定
Temp&=0x0F; //取P03->P00到Temp
if(Temp!=0x0F) //假如Temp==0x0f,则表示无键按下,则结束函数
{
Delay(); //延时15ms去抖动
Temp=0xEF;
for(i=0;i<4;i++)
{
Temp|=0x0F;
P0=Temp; //输出口P07->P04轮流输出1110,1101,1011,0111
Delayus(); //延时3us左右,使程序对P0端口的操作更稳定
Column[i]=Temp; //取P07->P04的值存入到Column[i]
Row[i]=P0; //读出P0
Delayus(); //延时3us左右,使程序对P0端口的操作更稳定
Row[i]&=0x0F; //取P03->P00到Row[i]
Temp=Temp<<1; //Temp左移一位
Result=Row[i]+Column[i]; //可利用result判断出键值
for(j=0;j<16;j++) //将Matrix中的值逐一与Result值进行对比,
{
if(Matrix[j]==Result) //如有相同的值,则表示有键按下
{
flag=1; //设置标志位
break;
}
}
if(flag==1) //如果标志位被设置退出此层循环
{
break;
}
}
}
}
//-------------------------------------------
//功能:延时15ms
//-------------------------------------------
void Delay()
{
int i;
for(i=0;i<10000;i++);
}
//-------------------------------------------
//功能:延时3us
//-------------------------------------------
void Delayus()
{
uchar i;
for(i=0;i<5;i++);
}
/**************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -