|
刚学单片机,C语言还可以。现在遇到两个问题:1、视频里矩阵键盘逐行扫描法说是高四位轮流输出低电平,判断第四位哪路输出低电平即为哪个按键按下。
我的问题是:为什么要高四位轮流输出低电平,而不是高四位轮流输出高电平?两种程序我都编了,只有第一种可行。
2、视频里采用静态数码管来显示数字0-F,我想结合动态数码管来显示0-15的数字,如图。最终效果是正确的。但是为什么我按下键盘时,会显示两个数字,松开键盘时,前面一位消失了,恢复正常状态?
附上我的程序:
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef double u32;
#define MatrixKey P0
#define BitChoose P3
#define DynamicLed P1
void delay(u16 i)
{
while(i--);
}
u8 Num[10] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
}; //0-9数字的16进制表示, 共阴
u8 RowKey[4] = {0x0E, 0x0D, 0x0B, 0x07}; //
u8 ColumnKey[4] = {0xE0, 0xD0, 0xB0, 0x70};
void ShowNum(u8 i, u8 j) //根据行列显示数码管数字
{
u8 k;
k = (i - 1) * 4 + j;
if(k < 10)
{
DynamicLed = Num[k];
BitChoose = 0x07; //0000 0111
}
else if(k >= 10 && k < 16)
{
DynamicLed = Num[1];
BitChoose = 0x06;
delay(100);
DynamicLed = Num[k - 10];
BitChoose = 0x07;
delay(100);
}
else
{
DynamicLed = Num[0];
BitChoose = 0x07;
}
}
u8 RowNum, ColumnNum; //定义全局变量
sbit Led = P3^0;
void main()
{
RowNum = 0; //初始化行列数
ColumnNum = 0;
while(1)
{
u8 MatchKey;
u8 a;
u8 i, j;
//MatrixKey = 0xFF; //初始化P0
for(i = 0; i < 4; i++) //从第一行循环往下找
{
MatrixKey = RowKey[i] + 0xF0;
MatchKey = RowKey[i];
for(j = 0; j < 4; j++)
{
if(MatrixKey == MatchKey + ColumnKey[j]) //MatrixKey为真实管脚输出值,MatchKey为行索引, ColumnKey为列索引
{
delay(1000); //消抖
Led = 0;
if(MatrixKey == MatchKey + ColumnKey[j])
{
RowNum = i + 1;
ColumnNum = j + 1;
while(a < 50 && MatrixKey == MatchKey + ColumnKey[j]) //判断是否松开,或500ms后自动松开
{
delay(1000);
a++;
}
break;
}
}
}
}
ShowNum(RowNum, ColumnNum);
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|