独立键盘接口设计(Keil+Proteus)

前言

软件的操作参考这篇博客。

LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501实验:用4个独立按键控制8个LED指示灯。

按下k1键,P3口8个LED正向(由上至下)流水点亮;

按下k2键,P3口8个LED反向(由下而上)流水点亮;

按下k3键,高、低4个LED交替点亮;

按下k4键,P3口8个LED闪烁点亮。

Keil

这个程序就很好理解了,通过检查P1口的引脚来判断是否有按键被按下(每次只允许一个键被按下),然后调用相对应的函数即可。

由于采用的是共阳极,所以端口为0的时候表示LED亮,所以LED流水灯、交替这种就是通过控制端口是1还是0来实现的。

cpp 复制代码
#include<reg51.h>
sbit S1=P1^0;//将S1位定义为P1.0引脚
sbit S2=P1^1;//将S2位定义为P1.1引脚
sbit S3=P1^2;//将S3位定义为P1.2引脚
sbit S4=P1^3;//将S4位定义为P1.3引脚

unsigned char keyval;//定义键值储存变量单元

void key_scan(void);//扫描键盘
void forward(void);//正向流水点亮
void backward(void);//反向流水点亮
void alter(void);//高、低位交替点亮
void blink(void);//闪烁点亮
void led_delay(void);//LED显示延时
void delay10ms(void);//软件消除抖动,延时

void main(void){
	keyval=0;//键值初始化为0
	while(1){
		key_scan();//键盘扫描
		switch(keyval){
			case 1:forward();break;//键值为1,调用正向流水点亮函数
			case 2:backward();break;//键值为2,调用反向流水点亮函数
			case 3:alter();break;//键值为3,调用高、低位交替点亮函数
			case 4:blink();break;//键值为4,调用闪烁点亮函数
		}
	}
}

//键盘扫描
void key_scan(void){
	P1=0xFF;
	if((P1&0x0F)!=0x0F){
		delay10ms();
		if(S1==0)keyval=1;//按键K1被按下
		if(S2==0)keyval=2;//按键K1被按下
		if(S3==0)keyval=3;//按键K1被按下
		if(S4==0)keyval=4;//按键K1被按下
	}
}

//正向流水点亮LED
void forward(void){
	P3=0xFE;//LED0亮1111 1110
	led_delay();
	P3=0xFD;//LED1亮1111 1101
	led_delay();
	P3=0xFB;//LED2亮1111 1011
	led_delay();
	P3=0xF7;//LED3亮1111 0111
	led_delay();
	P3=0xEF;//LED4亮1110 1111
	led_delay();
	P3=0xDF;//LED5亮1101 1111
	led_delay();
	P3=0xBF;//LED6亮1011 1111
	led_delay();
	P3=0x7F;//LED7亮0111 1111
	led_delay();
}

//反向流水点亮LED
void backward(void){
	P3=0x7F;//LED7亮0111 1111
	led_delay();
	P3=0xBF;//LED6亮1011 1111
	led_delay();
	P3=0xDF;//LED5亮1101 1111
	led_delay();
	P3=0xEF;//LED4亮1110 1111
	led_delay();
	P3=0xF7;//LED3亮1111 0111
	led_delay();
	P3=0xFB;//LED2亮1111 1011
	led_delay();
	P3=0xFD;//LED1亮1111 1101
	led_delay();
	P3=0xFE;//LED0亮1111 1110
	led_delay();
}

//交替点亮高4位与低4位LED
void alter(void){
	P3=0x0F;//高4位亮0000 1111
	led_delay();
	P3=0xF0;//低4位亮1111 0000
	led_delay();
}

//闪烁点亮LED
void blink(void){
	P3=0xFF;//全灭1111 1111
	led_delay();
	P3=0x00;//全亮0000 0000
	led_delay();
}

//LED显示延时
void led_delay(void){
	unsigned char i,j;
	for(i=0;i<220;i++){
		for(j=0;j<220;j++);
	}
}
	
//软件消除抖动,延时
void delay10ms(void){
	unsigned char i,j;
	for(i=0;i<100;i++){
		for(j=0;j<100;j++);
	}
}

Proteus

这里需要用到的器件前面基本上都出现过了。

|-----------|----------------|
| 元件名称 | Proteus关键字 |
| 51单片机 | AT89C51 |
| 复位按钮 | BUTTON |
| 电阻 | RES |
| LED灯 | LED |
| | LED-BIBY |
| | LED-BIGY |
| | LED-BIRG |
| | LED-BIRY |
| | LED-BLUE |
| | LED-GREEN |
| | LED-RED |
| | LED-YELLOW |

这种LED灯蓝色表示灯亮,红色表示灯灭,所以不是很明显。

可以换成这种LED灯(如果这里还是没有亮的话需要调整右边一列电阻的阻值,调至220

K1被按下

K2被按下

K3被按下

K4被按下

总结

继续努力。

相关推荐
桃杬5 小时前
lvgl修改输入设备驱动使其支持鼠标右键、双击、滑轮...
计算机外设
sheepwjl5 小时前
《嵌入式硬件(十二):基于IMX6ULL的时钟操作》
汇编·arm开发·单片机·嵌入式硬件·时钟·.s编译
田甲7 小时前
【STM32】串口的阻塞、中断、DMA收发
stm32·单片机·嵌入式硬件
酷~9 小时前
单片机启动文件——数据段重定位,BSS段清零
单片机·嵌入式硬件
wotaifuzao9 小时前
单片机的RAM与ROM概念
单片机·嵌入式硬件
jz-炸芯片的zero9 小时前
【Zephyr电源与功耗专题】14_BMS电池管理算法(三重验证机制实现高精度电量估算)
单片机·物联网·算法·zephyr·bms电源管理算法
三佛科技-134163842129 小时前
蒸面器/蒸脸仪方案开发,蒸面器/蒸脸仪MCU控制方案分析
单片机·嵌入式硬件
WD1372980155713 小时前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车
文火冰糖的硅基工坊14 小时前
[硬件电路-194]:NPN三极管、MOS-N, IGBT比较
单片机·嵌入式硬件·系统架构·电路
三佛科技-1341638421218 小时前
卷发棒/卷发梳MCU方案分析
单片机·嵌入式硬件