矩阵键盘与六位数码管_单片机学习--矩阵键盘的使用
时间: 2024-04-28 15:20:22 浏览: 8
矩阵键盘是一种常用的输入设备,它可以通过少量的IO口实现多个按键的输入。与传统的直接连接按键不同,矩阵键盘采用矩阵排列的方式,将多个按键通过行和列的交叉连接,形成一个按键矩阵。
使用矩阵键盘需要先对其进行初始化,包括设置行列IO口的输入输出状态以及使能电路的设置。然后在程序中通过扫描行列的方式检测按键的输入状态,从而实现按键输入的功能。
六位数码管是一种用于显示数字和字母的输出设备,它由七段数码管和一个小数点组成。使用六位数码管需要先对其进行初始化,包括设置IO口的输入输出状态以及数码管的亮度和显示模式等设置。然后在程序中通过循环显示数字和字母的方式实现数码管的显示功能。
在单片机中,矩阵键盘和六位数码管可以通过IO口连接到单片机上,通过程序控制其输入输出状态,实现按键输入和数字字母的显示。
相关问题
c521单片机矩阵键盘4x4数码管显示0-f
以下是一个简单的C51程序,可以实现矩阵键盘的输入和数码管的显示功能。注意,这里使用的是普通的共阳数码管,如果使用共阴数码管需要修改代码:
```c
#include <reg52.h> // 51单片机头文件
sbit LSA = P2^2; // 数码管LSA引脚连接的IO口
sbit LSB = P2^3; // 数码管LSB引脚连接的IO口
sbit LSC = P2^4; // 数码管LSC引脚连接的IO口
sbit D1 = P0^0; // 数码管第1位的IO口
sbit D2 = P0^1; // 数码管第2位的IO口
sbit D3 = P0^2; // 数码管第3位的IO口
sbit D4 = P0^3; // 数码管第4位的IO口
unsigned char code Nums[] = { // 数码管显示0~F的值
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
unsigned char KeySta[4][4] = { // 矩阵键盘按键状态
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
void InitLcd() // 初始化数码管
{
P0 = 0xff; // 数码管全部关闭
LSA = 0; LSB = 0; LSC = 0; // 数码管显示第一位
TMOD &= 0xf0; // 设置定时器为模式0
TH0 = 0x3c; TL0 = 0xb0; // 定时器初值,定时1ms
ET0 = 1; // 开启定时器中断
TR0 = 1; // 开启定时器
}
void Display(unsigned char num, unsigned char pos) // 在数码管的指定位置显示一个数字
{
unsigned char tmp = Nums[num];
switch(pos) {
case 1: D1 = 0; P0 = tmp; D1 = 1; break;
case 2: D2 = 0; P0 = tmp; D2 = 1; break;
case 3: D3 = 0; P0 = tmp; D3 = 1; break;
case 4: D4 = 0; P0 = tmp; D4 = 1; break;
default: break;
}
}
void KeyDriver() // 矩阵键盘驱动程序
{
unsigned char i, j;
static unsigned char backup[4][4] = { // 矩阵键盘状态备份
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
for(i = 0; i < 4; i++) {
for(j = 0; j < 4; j++) {
if(KeySta[i][j] != backup[i][j]) { // 检测到按键状态改变
if(KeySta[i][j] == 0) { // 按键按下
Display(i * 4 + j, 1); // 在数码管第一位显示按键编号
}
}
backup[i][j] = KeySta[i][j]; // 备份按键状态
}
}
}
void main()
{
InitLcd(); // 初始化数码管
while(1) {
KeyDriver(); // 矩阵键盘驱动程序
}
}
void Timer0() interrupt 1 // 定时器0中断服务程序
{
static unsigned char cnt = 0;
static unsigned char pos = 1;
TH0 = 0x3c; TL0 = 0xb0; // 定时器重新赋初值,定时1ms
cnt++;
if(cnt >= 100) { // 每100ms更新数码管显示位置
cnt = 0;
pos++;
if(pos > 4) pos = 1;
}
switch(pos) { // 控制数码管显示位置的选择
case 1: LSA = 0; LSB = 0; LSC = 0; break;
case 2: LSA = 1; LSB = 0; LSC = 0; break;
case 3: LSA = 0; LSB = 1; LSC = 0; break;
case 4: LSA = 1; LSB = 1; LSC = 0; break;
default: break;
}
}
```
这段程序中,使用P2口的LSA、LSB、LSC三个引脚控制数码管的显示位置,使用P0口的D1~D4四个引脚控制数码管的亮灭。矩阵键盘的状态通过二维数组KeySta存储,在定时器中断服务程序Timer0中调用KeyDriver函数进行检测和处理。在按键按下时,将按键编号显示在数码管的第一位。
51单片机六位数码管矩阵键盘调整时间代码
以下是基于51单片机的六位数码管矩阵键盘调整时间的代码示例:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 数码管显示码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar second = 0; // 秒计数
uchar minute = 0; // 分钟计数
uchar hour = 0; // 小时计数
sbit KEY1 = P3 ^ 3; // 矩阵键盘的4个按键
sbit KEY2 = P3 ^ 2;
sbit KEY3 = P3 ^ 1;
sbit KEY4 = P3 ^ 0;
void delay(uint xms) { // 延时函数
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display() { // 数码管显示函数
uchar i;
uchar dis[] = { // 数码管显示缓存
table[hour / 10], table[hour % 10],
0x40, // 冒号
table[minute / 10], table[minute % 10],
0x40, // 冒号
table[second / 10], table[second % 10]
};
for (i = 0; i < 8; i++) { // 循环扫描
P0 = 0xff; // 消影
switch (i) {
case 0: P2 = 0xfe; break;
case 1: P2 = 0xfd; break;
case 2: P2 = 0xfb; break;
case 3: P2 = 0xf7; break;
case 4: P2 = 0xef; break;
case 5: P2 = 0xdf; break;
case 6: P2 = 0xbf; break;
case 7: P2 = 0x7f; break;
}
P0 = dis[i]; // 显示数码管
delay(2); // 延时2ms
}
}
void keyscan() { // 矩阵键盘扫描函数
if (KEY1 == 0) { // 按键1被按下
delay(10); // 延时去抖
if (KEY1 == 0) { // 再次判断按键1是否被按下
hour++; // 小时加1
if (hour > 23) hour = 0; // 判断是否达到最大值
}
}
if (KEY2 == 0) { // 按键2被按下
delay(10);
if (KEY2 == 0) {
minute++; // 分钟加1
if (minute > 59) minute = 0;
}
}
if (KEY3 == 0) { // 按键3被按下
delay(10);
if (KEY3 == 0) {
second++; // 秒钟加1
if (second > 59) second = 0;
}
}
if (KEY4 == 0) { // 按键4被按下
delay(10);
if (KEY4 == 0) {
second = 0; // 置零
minute = 0;
hour = 0;
}
}
}
void main() {
while (1) {
display(); // 数码管显示
keyscan(); // 矩阵键盘扫描
delay(10); // 延时10ms
second++; // 秒钟加1
if (second > 59) { // 到达上限,进位
second = 0;
minute++;
if (minute > 59) {
minute = 0;
hour++;
if (hour > 23) hour = 0;
}
}
}
}
```
代码中使用了延时函数、数码管显示函数和矩阵键盘扫描函数,以及一个主循环。其中,数码管显示函数使用了循环扫描的方式来显示六位数码管,矩阵键盘扫描函数使用了简单的按键去抖和判断逻辑来实现对按键的响应。主循环中不断调用数码管显示、矩阵键盘扫描和延时函数,并且在一定时间间隔内累加秒钟、分钟和小时计数,同时判断是否达到最大值并进行进位。