中断的线反与行扫描
仿真
代码
keythink是行扫描,keyread是线反,需要用哪个把另外一个注释掉即可
flag是无按键标志位
检查P32发现电平为高,即无按键按下时,对P2输出复位用的标志位
注意crol要用intrins头文件
#include "reg51.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit checkpoint=P3^2;
u8 flag =0;
u8 code key_code[]=
{
0xee,0xde,0xbe,0x7e, //s0~s3特征码
0xed,0xdd,0xbd,0x7d, //s4~s7
0xeb,0xdb,0xbb,0x7b, //s8~sB
0xe7,0xd7,0xb7,0x77, //sc~sf
0xff//空格
};
u8 key_p;
u8 read,read_h,read_l;//read
void delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void keytran()
{
int i;
for(i=0;i<16;i++)//转为数字码
{
if(read == key_code[i])
{
key_p = i;
P2 = key_p;
}
}
}
void keythink()//行扫描
{
u8 temp;
u8 rowscan=0xfe;
u8 i =0;
for(i=0;i<4;i++){
P1 = rowscan;//1111 1110第一行
temp = P1;//读取
temp = temp&0xf0;//1111 0000 观察行、、
if(temp!=0xf0)//有行低电平
{
delay(5) ;
temp = P1;//读取
temp = temp&0xf0;//1111 0000 观察列
if(temp!=0xf0)
{rowscan = 0x0f&rowscan;read = rowscan|temp; flag = 1;return;}
}
rowscan = _crol_(rowscan,1); }
}
void keyread()//线反
{
P1 = 0xf0;//read high
read_h = P1;//read col
P1 = 0x0f;
read_l = P1;//read row 检测按键
read = read_h|read_l;
}
void main (void)
{
//InitIT0();//初始化
IT0 = 1;//下降沿触发
EX0 = 1;//外部中断允许
EA = 1;//总中断允许
while(1)
{
//P2 = 0xff;
P1 = 0x0f;
//P0 = 0X01;
if(checkpoint)//清零
{
flag = 0;
P2 = 0xff;
}
}
}
void KeyCheck() interrupt 0//中断0执行:键扫描
{
P0 = 0x02;
delay(5);
if(!checkpoint)
{
//P0 = 0x02;
keythink();
//keyread();
keytran();
P0 = 0x03;
}
// IT0 = 1;//下降沿触发
// EX0 = 1;//外部中断允许
// EA = 1;//总中断允许
}
线反
仿真
代码
#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 code key_code[] =
{
0xee,0xde,0xbe,0x7e, //s0~s3特征码
0xed,0xdd,0xbd,0x7d, //s4~s7
0xeb,0xdb,0xbb,0x7b, //s8~sB
0xe7,0xd7,0xb7,0x77, //sc~sf
0xff//空格
};
u8 code led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
u8 key_p;
u8 read,read_h,read_l;//read
u8 i,j;
void delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main(void)
{
while(1)
{
P1 = 0xf0;//read high
read_h = P1;//read col
delay(5);
if(read_h!=0xf0||read_l!=0x0f)//没有这行有按键抖动
{
delay(10);//按键消抖
P1 = 0xf0;//read high
read_h = P1;//read col
P1 = 0x0f;
read_l = P1;//read row 检测按键
read = read_h|read_l;
for(i=0;i<16;i++)
{
if(read == key_code[i])
{
key_p = i;
P2 = key_p;
}
}
// P2 = read;
}
else
{
P2 = 0xff;
}
}
}
行扫描开始是基于b站的一个佬做的,但是忘记是哪个了,后面补上