目录
1案例视频效果展示
1.1例子1:LED灯表示按键状态(两种方式)
1.2例子2:按键控制两排LED小灯闪烁移位
1.3例子3:按键控制LED灯逐个点亮/分组点亮/全部熄灭
1.4例子4:4*4矩阵按键实现带状LED灯控制
2例子1:LED灯表示按键状态(两种方式)
2.1电路原理图
2.1.1电路组成及接线
2.2控制程序
2.2.1控制程序步骤
2.2.2源代码
3例子2:按键控制两排LED小灯闪烁移位
3.1电路原理图
3.1.1电路组成及接线
3.2控制程序
3.2.1控制程序步骤
3.2.2源代码
4例子3:按键控制LED灯逐个点亮/分组点亮/全部熄灭
4.1电路原理图
4.1.1电路组成及接线
4.2控制程序
4.2.1控制程序步骤
4.2.2源代码
5例子4:4*4矩阵按键实现带状LED灯控制
5.1电路原理图
5.1.1电路组成及接线
5.2控制程序
5.2.1控制程序步骤
5.2.2源代码
7 硬件工程师笔试面试相关文章链接(部分链接)
摘要:本文介绍了基于AT89C51单片机的4种LED控制案例:1)按键状态显示(即时/触发两种模式);2)两排LED灯移位控制(上下左右四个方向);3)LED分组控制(逐个点亮、上下半区控制、全灭);4)4×4矩阵按键控制LED灯带(按键值决定亮灯数量)。所有案例均采用I/O口电平检测控制LED电路,包含完整的电路原理图(含晶振、复位、按键和LED模块)和C语言源代码实现,通过延时函数、位操作和键盘扫描等技术实现交互控制功能。
1案例视频效果展示
1.1例子1:LED灯表示按键状态(两种方式)
例子6:LED灯表示按键状态(两种方式)
1.2例子2:按键控制两排LED小灯闪烁移位
例子7:按键控制两排LED小灯闪烁移位
1.3例子3:按键控制LED灯逐个点亮/分组点亮/全部熄灭
例子8:按键控制LED灯逐个点亮/分组点亮/全部熄灭
1.4例子4:4*4矩阵按键实现带状LED灯控制
例子9:4*4矩阵按键实现带状LED灯控制
2例子1:LED灯表示按键状态(两种方式)
实现功能:K1、K2按下时LED点亮,松开时熄灭, K3、K4按下并释放时LED点亮,再次按下并释放时熄灭。
本质:单片机的某些I/O 口输入高/低电平作为判断条件控制其他I/O 口输出高/低电平,去驱动一个LED。
2.1电路原理图
2.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.3—>连接共阳极LED小灯电路 P1.4-P1.7—>连接按键电路 |
复位电路 | |
晶振电路 | |
按键电路 | |
共阳极LED小灯电路 |
2.2控制程序
2.2.1控制程序步骤
库文件与引脚定义
延时函数
主程序(按键状态作为输入(判断条件),LED状态作为输出)
2.2.2源代码
//功能:K1、K2按下时LED点亮,松开时熄灭, K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);} //主程序void main(){P0=0xff;P1=0xff;while(1){LED1=K1;LED2=K2;if(K3==0){while(K3==0);LED3=~LED3;}if(K4==0){while(K4==0);LED4=~LED4;}DelayMS(10);}}
3例子2:按键控制两排LED小灯闪烁移位
实现功能:按下K1时,P0口LED上移一位;按下K2时,P0口LED下移一位;按下K3时,P2口LED上移一位;按下K4时,P2口LED下移一位;
本质:单片机的某些I/O 口输入高/低电平作为判断条件控制其他I/O 口输出高/低电平,去驱动一个LED。
3.1电路原理图
3.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>连接共阳极左侧LED小灯电路 P2.0-P2.7—>连接共阳极右侧LED小灯电路 P1.4-P1.7—>连接按键电路 |
复位电路 | |
晶振电路 | |
按键电路 | |
共阳极LED小灯电路 |
3.2控制程序
3.2.1控制程序步骤
库文件
延时函数
按键控制LED灯闪烁移动函数
主程序
3.2.2源代码
//功能:按下K1时,P0口LED上移一位;按下K2时,P0口LED下移一位;按下K3时,P2口LED上移一位;按下K4时,P2口LED下移一位;#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);} //根据P1口的按键移动LEDvoid Move_LED(){if ((P1&0x10)==0) P0=_cror_(P0,1); //K1else if((P1&0x20)==0) P0=_crol_(P0,1); //K2else if((P1&0x40)==0) P2=_cror_(P2,1); //K3else if((P1&0x80)==0) P2=_crol_(P2,1); //K4}//主程序void main(){uchar Recent_Key; //最近按键P0=0xfe;P2=0xfe;P1=0xff;Recent_Key=0xff;while(1){if(Recent_Key!=P1){Recent_Key=P1; //保存最近按键Move_LED();DelayMS(10);}}}
4例子3:按键控制LED灯逐个点亮/分组点亮/全部熄灭
实现功能:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始,K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED
本质:单片机的某些I/O 口输入高/低电平作为判断条件控制其他I/O 口输出高/低电平,去驱动一个LED。
4.1电路原理图
4.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>连接共阳极LED小灯电路 P1.4-P1.7—>连接按键电路 |
复位电路 | |
晶振电路 | |
按键电路 | |
共阳极LED小灯电路 |
4.2控制程序
4.2.1控制程序步骤
库文件
延时函数
主程序(获取按键状态——>switch case函数选择执行命令)
4.2.2源代码
//功能:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始,K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED#include<reg51.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);} //主程序void main(){uchar k,t,Key_State;P0=0xff;P1=0xff;while(1){t=P1;if(t!=0xff){DelayMS(10);if(t!=P1) continue;//取得4位按键值,由模式XXXX1111(X中有一位为0,其他均为1)//变为模式0000XXXX(X中有一位为1,其他均为0)Key_State=~t>>4;k=0;//检查1所在位置,累加获取按键号kwhile(Key_State!=0){k++;Key_State>>=1;}//根据按键号k进行4种处理switch(k){case 1: if(P0==0x00) P0=0xff;P0<<=1;DelayMS(200);break;case 2: P0=0xf0;break;case 3: P0=0x0f;break;case 4: P0=0xff;}}}}
5例子4:4*4矩阵按键实现带状LED灯控制
实现功能:亮起和按键上数字相同数量的LED灯
本质:单片机的某些I/O 口输入高/低电平作为判断条件控制其他I/O 口输出高/低电平,去驱动一个LED。
5.1电路原理图
5.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P2.0-P0.7/ P2.0-P0.7—>连接共阳极LED灯带电路 P1.0-P1.7—>连接4*4矩阵按键电路 |
复位电路 | |
晶振电路 | |
4*4矩阵按键电路 | |
共阳极LED灯带电路 |
5.2控制程序
5.2.1控制程序步骤
库文件
和按键数字一一对应的16进制数字
延时函数
键盘扫描函数
主函数(按键数字和LED灯亮起相同数量)
5.2.2源代码
//功能:运行本例时,按下的按键值越大点亮的LED越多。#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//矩阵键盘按键特征码表uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);} //键盘扫描uchar Keys_Scan(){uchar sCode,kCode,i,k;//低4位置0,放入4行P1=0xf0;//若高4位出现0,则有键按下if((P1&0xf0)!=0xf0){DelayMS(2);if((P1&0xf0)!=0xf0){ sCode=0xfe; //行扫描码初值for(k=0;k<4;k++) //对4行分别进行扫描{P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++) //查表得到按键序号并返回if(kCode==KeyCodeTable[i]) return(i);}elsesCode=_crol_(sCode,1);}} }return(-1);}//主程序void main(){uchar i,P2_LED,P3_LED;uchar KeyNo=-1; //按键序号,-1表示无按键while(1){KeyNo=Keys_Scan(); //扫描键盘获取按键序号KeyNoif(KeyNo!=-1){P2_LED=0xff;P3_LED=0xff;for(i=0;i<=KeyNo;i++) //键值越大,点亮的LED越多{if(i<8)P3_LED>>=1;elseP2_LED>>=1;}P3=P3_LED; //点亮条形LEDP2=P2_LED;}}}
7 硬件工程师笔试面试相关文章链接(部分链接)
更多文章可前往主页观看
1、硬件工程师笔面试真题汇总(2025版本)_硬件工程师面试题-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程师笔试面试高频考点汇总——(2025版)_电容或者电感对锁存器的影响-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程师笔试面试汇总(2025版本)_硬件工程师面试题-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程师笔试面试学习汇总——器件篇目录(2025版本)_【【硬件工程师炼成之路】器件篇(更新中。。。)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/142316204
硬件工程师笔记——电子器件汇总大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程详尽版--(2025最新版)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331