Contents ...
udn網路城邦
74hc138 led副程式
2024/09/06 23:12
瀏覽23
迴響0
推薦0
引用0
// 控制LED亮灭,led_index为LED的序号(0-7)

void control_led(unsigned char led_index) {

    A = led_index & 0x01;  // A为最低位

    B = (led_index >> 1) & 0x01;  // B为次低位

    C = (led_index >> 2) & 0x01;  // C为最高位

}



 = led_index & 0x01;

这个操作是取led_index的最低位(也就是二进制数的最右边一位)。


0x01是一个十六进制数,表示二进制的00000001。

& 是按位与运算符,它会将led_index的每一位与0x01的对应位进行按位比较,结果就是保留最低位的值,而其他位都会被清零。

例子:

如果led_index = 5(二进制:101),A = 5 & 0x01 结果是 1。

如果led_index = 2(二进制:010),A = 2 & 0x01 结果是 0。


B = (led_index >> 1) & 0x01;

这个操作首先将led_index右移一位,然后取该结果的最低位:

>> 1 是右移运算符,它将led_index的所有二进制位向右移动一位,相当于将数值除以2。


如果led_index = 5(二进制:101),5 >> 1 结果是 10,再与0x01按位与,B = 1。

如果led_index = 2(二进制:010),2 >> 1 结果是 1,再与0x01按位与,B = 1。


C = (led_index >> 2) & 0x01;

这个操作是将led_index右移两位,然后取该结果的最低位:


>> 2 将led_index向右移两位,相当于将数值除以4。这个操作是将led_index右移两位,然后取该结果的最低位:


>> 2 将led_index向右移两位,相当于将数值除以4。

如果led_index = 5(二进制:101),5 >> 2 结果是 1,再与0x01按位与,C = 1。

如果led_index = 2(二进制:010),2 >> 2 结果是 0,再与0x01按位与,C = 0


通过这三步操作,led_index的二进制表示的三个位(从低到高分别是A、B、C)被提取出来,分配给74HC138的地址输入A、B、C。根据这些输入,74HC138将选择一个对应的输出Y0到Y7,用来驱动相应的LED或设备。


例子:

如果led_index = 5,其二进制表示为101,则:


A = 1(最低位)

B = 0(次低位)

C = 1(最高位)

这种情况下,74HC138将激活输出Y5,从而控制第5个LED或设备。


右移运算符 >> 1 会将一个二进制数的每一位向右移动1位,最右边的位被丢弃,而最左边的位补零。右移1位相当于将数值除以2,丢掉余数并保留整数部分。例如:


5 >> 1 结果为 2

6 >> 1 结果为 3

1 >> 1 结果为 0
全站分類:興趣嗜好 其他
自訂分類:8051
上一則: 51 LCD副程式
下一則: 51使用timer延時100us

限會員,要發表迴響,請先登入