为什么单片机上第一个发光二极管是0xfe,而关闭却是0xff?

发光二极管:正向导通,但当正负极同时至高电平(低电平)时,二极管中电流将不再流动,也就不再发光。

在实际应用时和二极管的接法有关,二极管阴极端连单片机,输出低电平0就会点亮。

基于此:

我们现在0xfe是十六进制数,转换成二进制就为1111 1110,单片机一般阅读由右向左阅读,即第一位为代表第一个灯——0(低电平),可以发生正向导通。而0xff转换成二进制为1111 1111,即第一位为1,代表高电平,此时二极管两端都为高电平,没有电流通过(灯灭)。

同理

0xfe=1111 1110 表示一个灯亮。
0xfc=1111 1100 表示最后2个灯亮。
0xfd = 1111 1101 //第2个灯亮
0xfb = 1111 1011 // 第三个灯亮
0xf7 = 1111 0111 // 第4个灯亮
0xef = 1110 1111 // 第五个灯亮
0xdf = 1101 1111 // 第六个灯亮
0xbf = 1011 1111 // 第七个灯亮
0x7f = 0111 1111 // 第八个灯亮

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的4路抢答器系统的设计代码,基于Keil C51开发环境。 ```c #include <reg51.h> // 51单片机头文件 sbit LED1 = P1^0; // 发光二极管1 sbit LED2 = P1^1; // 发光二极管2 sbit LED3 = P1^2; // 发光二极管3 sbit LED4 = P1^3; // 发光二极管4 sbit DIO = P2^0; // 数码管DIO口 sbit CLK = P2^1; // 数码管CLK口 sbit LATCH = P2^2; // 数码管LATCH口 unsigned char code SegCode[] = { // 数码管显示字符编码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; unsigned char code BtnCode[] = { // 每个抢答器对应的按键编码 0xfe, 0xfd, 0xfb, 0xf7 }; unsigned char cnt = 0; // 计数器,记录哪个抢答器先按下 void delay(unsigned int t) { // 延时函数 unsigned int i, j; for (i = t; i > 0; i--) { for (j = 110; j > 0; j--); } } void display(unsigned char num) { // 显示函数 unsigned char i; for (i = 0; i < 8; i++) { DIO = (SegCode[num] >> i) & 0x01; CLK = 1; CLK = 0; } LATCH = 1; LATCH = 0; } void main() { unsigned char i; while (1) { for (i = 0; i < 4; i++) { if ((P3 & BtnCode[i]) == 0) { // 检测按键状态 cnt = i; break; } } switch (cnt) { // 根据计数器的值控制发光二极管和七段数码管的状态 case 0: LED1 = 1; LED2 = LED3 = LED4 = 0; display(cnt); break; case 1: LED2 = 1; LED1 = LED3 = LED4 = 0; display(cnt); break; case 2: LED3 = 1; LED1 = LED2 = LED4 = 0; display(cnt); break; case 3: LED4 = 1; LED1 = LED2 = LED3 = 0; display(cnt); break; default: LED1 = LED2 = LED3 = LED4 = 0; display(0xff); // 数码管显示空白 break; } delay(10); // 延时10ms } } ``` 这个程序使用了4个按键来模拟4个抢答器,按下任意一个按键后,相应的发光二极管会被点亮,七段数码管会显示相应编号。请注意,程序中的延时函数需要根据实际情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值