跑马灯
首先我们要知道规则:
规则(共阴极/高电平点亮):
某一位是 1–> 对应LED亮
某一位是 0–> 对应LED灭
跑马灯本质是什么?一个1在二进制中不断移动!
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
0010 0000
0100 0000
1000 0000
定义变量:
const int LED_COUNT=8;//定义常量,LED数量为8个
unsigned char led=0x01;//初始化LED状态,二进制0000 0001 最右边灯亮
int direction=1;//方向标志:1表示向左移动,-1表示向右移动
一个for循环打印一行,但注意,其实每一轮都只打印了一个@或O,并非直接全部打印了一行,然后一个for循环结束后才是打印一行
//从最高位到最低位
for (int i = LED_COUNT-1; i >=0; i--)
{
//(1<<i) 生成掩码,只有第i位为1
//led&(1<<i):按位与运算
if (led&(1<<i))
{
printf("@ ");//亮
}else
{
printf("O ");//不亮
}
}
printf("\n");
走马灯会变更方向,所以接下来我们就利用定义的方向变量direction来定义方向,
//控制跑马灯的方向
if (direction==1)
{
//向左移动 led<<1
led<<=1;
//检查是否达到最左边
if (led==0x80) //这个就是 1000 0000
{
direction=-1;//如果到了最左边,就改变方向,往右边
}
}else
{
//向右移
led>>=1;
if (led==0x01) //这个就是 0000 0001
{
direction=1;//如果到了最右边,就改变方向,往左边
}
}
最后再来个休眠函数,方便展示,但是注意这个休眠函数是在一个for循环结束之后,也就是一排打印完之后,再进行休眠
总体代码展示:
int main(int argc, char const *argv[])
{
const int LED_COUNT=8;//定义常量,LED数量为8个
unsigned char led=0x01;//初始化LED状态,二进制0000 0001 最右边灯亮
int direction=1;//方向标志:1表示向左移动,-1表示向右移动
//无限循环:让跑马灯一直运行
while (1)
{
//从最高位到最低位
for (int i = LED_COUNT-1; i >=0; i--)
{
//(1<<i) 生成掩码,只有第i位为1
//led&(1<<i):按位与运算
if (led&(1<<i))
{
printf("@ ");//亮
}else
{
printf("O ");//不亮
}
}
printf("\n");
//控制跑马灯的方向
if (direction==1)
{
//向左移动 led<<1
led<<=1;
//检查是否达到最左边
if (led==0x80)
{
direction=-1;
}
}else
{
//向右移
led>>=1;
if (led==0x01)
{
direction=1;
}
}
//延时执行
usleep(500000);//微秒 1000000微秒=1秒
}
return 0;
}
看看效果:
数码管
LED数码管是一种电子显示设备,由多个LED(发光二极管)组成,通常用于显示数字0-9,有时也显示字母A-F
具体如下图

编码方式:
通常用一个字节(8位)控制7段+小数点:
位号: 7 6 5 4 3 2 1 0
段名: dp g f e d c b a
共阴极编码(高电平点亮):
根据上图结合理解,为什么是这几段亮.
// 数字 0-9 的7段编码(不含小数点)
0: 0b00111111 // a,b,c,d,e,f亮
1: 0b00000110 // b,c亮
2: 0b01011011 // a,b,d,e,g亮
3: 0b01001111 // a,b,c,d,g亮
4: 0b01100110 // b,c,f,g亮
5: 0b01101101 // a,c,d,f,g亮
6: 0b01111101 // a,c,d,e,f,g亮
7: 0b00000111 // a,b,c亮
8: 0b01111111 // 所有段亮
9: 0b01101111 // a,b,c,d,f,g亮
279

被折叠的 条评论
为什么被折叠?



