我对嵌入式编程是完全陌生的,正在检查下面的代码并试图了解其工作原理,但我确实陷入了困境。
该程序用于计数和打印从0到9的数字。
那么有人可以解释一下这句话const uint8_t
吗?为什么我在这里需要一个十六进制数的数组?
#include <avr/io.h>
#include <util/delay.h>
#include "debug.h"
const uint8_t segments[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE4,0xFE,0xF6};
int main(void) {
uint8_t i=0; //s
int g;
init_debug_uart0();
/* set PORT A pins as outputs */
DDRA = 0xFF;
for (;;) {
PORTA = segments[i];
printf("%d\n\r",i);
_delay_ms(1000);
if (i >=9) {
fprintf(stderr , "Count Overflow\n\r"); i = 0;
scanf("%d", &g);
}else
i++;
}
}
最后一个问题,是否有人知道有关嵌入式编程的好资料?目前,我正在学习8位IIMatto处理器,它具有32个寄存器,采用哈佛架构设计,具有1级流水线。
的const uint8_t segments[10] = {0xFC,0x60,0xDA, ...
简单定义字节的恒定的10字节的数组。
代码并不需要十六进制的数组,它可能是小数。
但是考虑一下的好处
0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE4,0xFE,0xF6
// versus
252,96,218,...
偶然检查发现,每个字节中设置的位数为
6,2,5,5,...
这恰好与数字0、1、2、3的7段显示中设置的段数相匹配...
对位的更详细检查将详细说明哪个位激活了哪个段。
可以采用其他方法来获得7段到数字的映射,但是以十六进制显示数据比十进制小一个步骤。
也许代码可能像(正确的段映射是TBD)。
typedef enum {
LED7_a = 1 << 0,
LED7_b = 1 << 1,
LED7_c = 1 << 2,
LED7_d = 1 << 3,
LED7_e = 1 << 4,
LED7_f = 1 << 5,
LED7_g = 1 << 6,
LED7_dp = 1 << 7
} LED7_Segment_t;
/* ****************************************************************************
7 Segment Pattern
Layout
aaa
f b
f b
ggg
e c
e c
ddd dp
**************************************************************************** */
const uint8_t segments[] = {
/*'0*/ LED7_a | LED7_b | LED7_c | LED7_d | LED7_e | LED7_f ,
/*'1*/ LED7_b | LED7_c ,
/*'2*/ LED7_a | LED7_b | LED7_d | LED7_e | LED7_g,
/*'3*/ LED7_a | LED7_b | LED7_c | LED7_d | LED7_g,
/*'4*/ LED7_b | LED7_c | LED7_f | LED7_g,
/*'5*/ LED7_a | LED7_c | LED7_d | LED7_f | LED7_g,
/*'6*/ LED7_a | LED7_c | LED7_d | LED7_e | LED7_f | LED7_g,
/*'7*/ LED7_a | LED7_b | LED7_c ,
/*'8*/ LED7_a | LED7_b | LED7_c | LED7_d | LED7_e | LED7_f | LED7_g,
/*'9*/ LED7_a | LED7_b | LED7_c | LED7_d | LED7_f | LED7_g};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句