找回密码
 立即注册
查看: 99|回复: 9

51单片机识别按键

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-03 09:46:32
已绑定手机

24

主题

183

回帖

929

积分

高级会员

积分
929
发表于 2025-5-30 08:05:42 | 显示全部楼层 |阅读模式
问大家个问题,电路如下图所示,当按下K1时,数码管显示1,按下K2时数码管显示2,按下K3时数码管显示3,按下K4时数码管显示4。配合程序是怎么实现的呢?LM393是电压比较器,同相输入端的电压始终是大于反向输入端电压




1.jpg
回复

使用道具 举报 送花

3

主题

860

回帖

431

积分

等待验证会员

积分
431
发表于 2025-5-30 08:08:00 | 显示全部楼层
根据电路图,数码管(7-segment display)的显示逻辑如下:

数码管显示逻辑

数码管的每个区域(A-G)对应特定的数字,例如:
A区域显示数字0
B区域显示数字1
C区域显示数字2
D区域显示数字3
E区域显示数字4
F区域显示数字5
G区域显示数字6

因此,根据按钮的按下情况,可以确定显示的数字如:
K1按下:A区域
K2按下:B区域
K3按下:C区域
K4按下:E区域

编程逻辑

数码管的显示逻辑可以基于以下步骤实现:
1. 读取按钮信号:通过传感器(如按压按键)读取按钮的按下信号(如电平变化)。
2. 分配区域:根据按钮的按下时间顺序,确定每个区域的触发信号。
3. 驱动逻辑:根据区域的触发信号,调整数码管的驱动位(如74LS280)使其显示相应的数字。
4. 校正逻辑:确保显示的数字在黑暗中正常显示,避免因暗光干扰导致的数字偏移。
5. 控制灯亮:在按下不同的按钮时,通过关灯信号(如电平变化)来确保按钮只在特定时间显示数字,而灯亮后保持不变。

程序示例

假设使用74LS280数码管作为驱动电路,编程逻辑如下:

1. 阴极型驱动电路
驱动逻辑如下:
  1. A = (K1 timely)
  2. B = (K2 timely)
  3. C = (K3 timely)
  4. D = (K4 timely)
  5. E = (K1 timely)
  6. F = (K2 timely)
  7. G = (K3 timely)
复制代码

2. 正极型驱动电路
驱动逻辑如下:
  1. A = !K1
  2. B = !K2
  3. C = !K3
  4. D = !K4
  5. E = !K1
  6. F = !K2
  7. G = !K3
复制代码

注意事项

1. 电源管理:确保电源稳定,避免因电源波动导致的跳变。
2. 校正电路:使用校正电路(如74HC51)确保显示的数字在黑暗中正常。
3. 关灯控制:在按下按钮后,通过关灯信号确保按钮在特定时间显示数字,灯亮后保持不变。

总结

通过以上逻辑,数码管可以实现K1-K4按下时显示不同数字的功能。相应的编程需要根据具体需求调整驱动电路和校正电路。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

860

回帖

431

积分

等待验证会员

积分
431
发表于 2025-5-30 08:08:00 | 显示全部楼层
在完成码管的显示控制中,我们可以设计一个基于二进制编码的逻辑,通过按键的按位操作来控制数码管的显示。以下是详细的逻辑设计和相应的程序实现:

逻辑设计

1. 二进制编码:
数码管的显示范围通常为0-9,共10个不同的数字。
为实现这一目标,我们可以使用一个3位二进制编码系统(即8421编码),其中:
第1位( MSB)对应数码管的最高位,用于完成码管的显示。
第2位和第3位分别控制数码管的次高位和最低位。

2. 按键的按位控制:
每个按键(K1-K4)按下时,会改变相应的二进制位,从而控制数码管的显示。
假设:
K1控制最高位(第1位)。
K2控制次高位(第2位)。
K3控制最低位(第3位)。
K4控制完成码管的显示(即第1位)。

3. 初始状态:
当程序开始运行时,数码管的显示为0(即所有二进制位均为0)。
K4按下时,第1位变为1,完成码管显示为1。

程序实现

以下是基于上述逻辑设计的程序实现:
  1. c
  2. include
  3. include
  4. int main() {
  5.     int display = 0;  // 表示数码管的当前显示数字
  6.     int k1 = 0, k2 = 0, k3 = 0, k4 = 0;  // 表示按键的按位状态
  7.     while (true) {
  8.         // 按下K1,改变第1位
  9.         k1 = 1 ^ k1;
  10.         if (k1) {
  11.             display |= 0b100;  // 令完成码管显示为1
  12.             k4 ^= 1;  // 令完成码管显示为1
  13.         }
  14.         // 按下K2,改变第2位
  15.         k2 = 1 ^ k2;
  16.         if (k2) {
  17.             display |= 0b0100;  // 令完成码管显示为2
  18.             k4 ^= 1;
  19.         }
  20.         // 按下K3,改变第3位
  21.         k3 = 1 ^ k3;
  22.         if (k3) {
  23.             display |= 0b00100;  // 令完成码管显示为3
  24.             k4 ^= 1;
  25.         }
  26.         // 按下K4,完成码管显示
  27.         k4 ^= 1;
  28.         if (k4) {
  29.             display |= 0b10000;  // 令完成码管显示为4
  30.         }
  31.         // 输出显示数字
  32.         printf("当前显示数字: %d\n", display);
  33.         // 判断是否完成码管显示
  34.         if (display == 0b10000) {
  35.             printf("完成码管显示完成!\n");
  36.             break;
  37.         }
  38.     }
  39.     return 0;
  40. }
复制代码

说明

1. 变量定义:
display:表示数码管的当前显示数字,初始值为0。
k1, k2, k3, k4:分别表示按键K1到K4的按位状态(0或1)。

2. 按位控制:
每个按键按下时,会改变相应的二进制位。
按下K1时,改变第1位(MSB),并设置完成码管显示为1。
按下K2时,改变第2位,设置完成码管显示为2。
按下K3时,改变第3位,设置完成码管显示为3。
按下K4时,改变完成码管显示为4。

3. 显示输出:
每次按动按键后,打印当前显示的数字。
当完成码管显示(即显示为4)时,打印完成提示并退出循环。

注意事项
二进制编码的调整:根据具体的数码管显示方式,可能需要调整二进制编码的位数或编码方式。
显示范围扩展:如果需要显示更多的数字(如0-99),则需要扩展二进制编码的位数。
功能扩展:可以通过修改程序逻辑,实现功能扩展,如增加显示区域、减少显示区域等。

通过上述逻辑设计和程序实现,可以实现通过按键控制数码管显示数字的功能。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:333
  • 最近打卡:2025-06-06 07:50:31
已绑定手机

4

主题

391

回帖

1841

积分

金牌会员

积分
1841
发表于 2025-5-30 08:09:57 | 显示全部楼层
串联的电阻值不一样,每个按键按下的分压值不一样,对比检测电压确定每个按键是否动作,剩下的就是显示问题了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-03 09:46:32
已绑定手机

24

主题

183

回帖

929

积分

高级会员

积分
929
发表于 2025-5-30 08:14:55 | 显示全部楼层
haiya*** 发表于 2025-5-30 08:09
串联的电阻值不一样,每个按键按下的分压值不一样,对比检测电压确定每个按键是否动作,剩下的就是显示问题 ...

LM393是个电压比较器,怎么判断呢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:333
  • 最近打卡:2025-06-06 07:50:31
已绑定手机

4

主题

391

回帖

1841

积分

金牌会员

积分
1841
发表于 2025-5-30 08:52:38 | 显示全部楼层
欢迎哈*** 发表于 2025-5-30 08:14
LM393是个电压比较器,怎么判断呢

直接检测不好么,为什么搞这么复杂呢?P2.0-P2.2分别为高电平时,去检测P3.2电平,低电平没有按键按下,p2.0高电平时P3.2为高就是K4按下,依次检测
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-03 09:46:32
已绑定手机

24

主题

183

回帖

929

积分

高级会员

积分
929
发表于 2025-5-30 09:02:57 | 显示全部楼层
haiya*** 发表于 2025-5-30 08:52
直接检测不好么,为什么搞这么复杂呢?P2.0-P2.2分别为高电平时,去检测P3.2电平,低电平没有按键按下,p ...

能不能说详细点儿呢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-03 09:46:32
已绑定手机

24

主题

183

回帖

929

积分

高级会员

积分
929
发表于 2025-5-30 09:04:10 | 显示全部楼层
haiya*** 发表于 2025-5-30 08:52
直接检测不好么,为什么搞这么复杂呢?P2.0-P2.2分别为高电平时,去检测P3.2电平,低电平没有按键按下,p ...

按键K1---K4按下时,P2.0--P2.2都是高电平
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:333
  • 最近打卡:2025-06-06 07:50:31
已绑定手机

4

主题

391

回帖

1841

积分

金牌会员

积分
1841
发表于 2025-5-30 09:22:39 | 显示全部楼层
欢迎哈*** 发表于 2025-5-30 09:04
按键K1---K4按下时,P2.0--P2.2都是高电平

给P20一个高电平,比较器同相端电压是2.5v,此时检测p32,高电平说明反相端电压低于2.5v,此时K4按下,低电平说明反相端电压大于2.5v,此时P21给高电平P20低电平,同相端电压为3.33v,在检测P32,高电平说明反向端电压在2.5-3.333之间,k3按下,如果p32是低电平,在将P22给高电平,同相端压为4V,P32高电平反相端电压为3.33-4之间,K2按下...........
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-03 09:46:32
已绑定手机

24

主题

183

回帖

929

积分

高级会员

积分
929
发表于 2025-5-30 10:16:13 | 显示全部楼层
haiya*** 发表于 2025-5-30 09:22
给P20一个高电平,比较器同相端电压是2.5v,此时检测p32,高电平说明反相端电压低于2.5v,此时K4按下,低 ...

谢谢了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-7 00:48 , Processed in 0.129304 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表