教程:用8051单片机实现矩阵式键盘控制

前言

在嵌入式系统设计中,键盘输入与LED显示是常见的交互方式,特别是在基于8051微控制器的项目中。本文将深入探讨一个具体的实现案例:如何使用8051微控制器配合8255并行接口芯片,实现一个4x4矩阵键盘的扫描与译码,并将扫描到的键值实时显示在LED显示器上。

正文

首先,明确我们的目标:

现在,让我们打开仿真软件和编程软件。再次明确我们的目标,然后就可以画出如下仿真图:

接下来就可以准备编程了。

首先,我们需要对8255芯片进行初始化,设置其控制寄存器(COM8255)以配置PA、PB为输出端口(用于LED显示和可能的控制信号),PC的高四位为输出(用于键盘行扫描),低四位为输入(用于读取键盘列状态)。这些配置通过向8255的控制寄存器写入特定的值来完成。

arduino 复制代码
#include <reg51.h>
#include <stdio.h>
xdata unsigned char COM8255   _at_  0x8006;
xdata unsigned char PA8255   _at_  0x8000;
xdata unsigned char PB8255   _at_  0x8002;
xdata unsigned char PC8255   _at_  0x8004;

unsigned char tab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char dat,col,rol;

在键盘扫描和LED显示过程中,需要用到延时函数来控制扫描速度和显示稳定性。我们定义了两个延时函数:delay20ms用于较长的延时(如LED显示),而delay用于较短的延时(如键盘扫描中的去抖动)。这些函数通过嵌套循环实现,具体的延时时间取决于循环次数和微控制器的时钟频率。

arduino 复制代码
void  delay20ms(unsigned char  t)
{
   unsigned char a,b;
   a=0xff;
   b=t;
   while(b)
   { while(a--);
      b--;
   }
}
void delay(unsigned char m)
{
   unsigned char n;
   while(m)
   {
      for(n=110;n>0;n--);
	 m--;
   }
}

keyscan函数是键盘扫描的核心。它通过逐行将PC端口的高四位设置为低电平(其余为高电平),模拟键盘的逐行扫描。然后,读取PC端口的低四位来检测哪一列有按键被按下(被按下的键会将对应列拉低)。根据读取到的列值和当前扫描的行号,可以计算出被按下键的索引值,并返回该值。

ini 复制代码
unsigned char  keyscan(void)
{
   unsigned char i,t,k,m;
   m=0xef;           //扫描初值。   PC4输出0,即扫描PC4线
   for(i=0;i<4;i++)
   {
   PC8255=m;     //输出行线(高四位) 
   delay(1);
   t=PC8255;     //读取列线(低四位)
   t|=0xf0;
   switch(t)
   {
      case 0xfe: k=4*i;
	         break;
      case 0xfd: k=4*i+1;
	         break;
      case 0xfb: k=4*i+2;
	         break;
      case 0xf7: k=4*i+3;
	         break;
    
   }
   m=m<<1;       //"0"向左移动,扫描下一行
   m|=0x01;
 }
 return(k);
}

display函数负责将扫描到的键值显示在LED显示器上。首先,它设置PB端口(或另一个控制信号端口,取决于电路设计)以启用LED显示。然后,根据键值从预设的LED编码表(tab数组)中查找对应的编码,并将该编码输出到PA端口。最后,通过延时保持显示稳定。

ini 复制代码
void  display(unsigned char ch)
{
   PB8255=0x1;
  
   PA8255=tab[ch];
   delay20ms(100);
  
}

main函数中,我们首先完成系统的初始化工作,包括设置8255的控制寄存器。然后,进入一个无限循环,不断调用keyscan函数扫描键盘,并将扫描到的键值通过display函数显示在LED显示器上。这样,就实现了键盘输入与LED显示的实时交互。

scss 复制代码
void main(void)
 { 
    COM8255=0x81;         //8255 PA、PB输出,PC7--PC4输出,PC3--PC0输入
   
   // Write your code here
   while (1)
   {     
      dat=keyscan();
      display(dat);
   }
}

结语

这样,通过精心设计的扫描算法和显示逻辑,我们最终实现了高效的键盘输入和直观的LED显示。希望这个讲解能帮到你,如果你有任何疑问,欢迎留言!

相关推荐
寻找码源44 分钟前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
带多刺的玫瑰2 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
美式小田2 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
兰_博3 小时前
51单片机-独立按键与数码管联动
单片机·嵌入式硬件·51单片机
陌小呆^O^3 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
时光の尘3 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-3 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己4 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan4 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
嵌入式大圣5 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv