51单片机,利用P3端口,控制4×4矩阵按键前8个,来控制LED灯对应亮的代码
时间: 2023-09-20 09:04:31 浏览: 86
以下是基于51单片机的代码,利用P3口控制4x4矩阵按键前8个,来控制LED灯对应亮的代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
}; //数码管显示0~9的编码,共阴极数码管
uchar KeySta[4][4]={
{1,2,3,0xC},
{4,5,6,0xD},
{7,8,9,0xE},
{0xF,0,0xA,0xB}
}; //4x4矩阵按键编码
uchar KeyValue=0; //存放键值
uchar LedValue=0; //存放LED灯亮的值
void Display(uchar num,uchar dat);
void Delay(uint i);
void main()
{
uchar i,j;
P1=0xFF; //P1口初始为高电平
while(1)
{
for(i=0;i<4;i++)
{
P3=(0x80>>i); //扫描第i行
for(j=0;j<4;j++) //判断第j列是否有按键按下
{
if((P3&(0x08<<j))==0)
{
Delay(1000); //延时去抖动
if((P3&(0x08<<j))==0)
{
KeyValue=KeySta[i][j]; //记录按键值
LedValue^=(1<<KeyValue); //取反对应LED灯亮的值
}
}
}
}
for(i=0;i<8;i++) //控制前8个LED灯亮
{
if(LedValue&(1<<i)) P1&=~(1<<i); //低电平点亮LED
else P1|=(1<<i); //高电平熄灭LED
}
for(i=0;i<4;i++) //数码管显示按键值
{
Display(i,KeyValue%10);
KeyValue/=10;
Delay(1000); //延时刷新,避免闪烁
}
}
}
//数码管显示函数
void Display(uchar num,uchar dat)
{
LSA=LSB=LSC=1; //消隐
P0=table[dat]; //发送编码
switch(num) //选择位选
{
case 0:LSA=0;break; //第0位
case 1:LSB=0;break; //第1位
case 2:LSC=0;break; //第2位
case 3:LSA=LSB=0;break; //第3位
}
}
//延时函数
void Delay(uint i)
{
while(i--);
}
```
该代码实现了以下功能:
- 利用P3口控制4x4矩阵按键前8个;
- 按下按键时,对应LED灯亮的值取反;
- 控制前8个LED灯亮;
- 数码管显示按键值。
阅读全文