Пт ноя 24, 2017 22:48:29
typedef struct{
uint8_t error1;
uint8_t error2;
uint8_t error3;
uint8_t error4;
};
void err_copy_123 (Type_error *dst, Type_error *src)
{
dst->error1 = src->error1;
dst->error2 = src->error2;
dst->error3 = src->error3;
}
Пн ноя 27, 2017 20:58:28
#if COMMAPOS == LEFT
#warning Left
#else
#warning Not LEFT
#endif
#if COMMAPOS == RIGHT
#warning Right
#else
#warning Not right
#endif
main.c:498: warning: (162) #warning: Left
main.c:505: warning: (162) #warning: Right
Пн ноя 27, 2017 21:19:52
Пн ноя 27, 2017 22:08:59
Например, следующий фрагмент использует значение ACTIVE_COUNTRY для определения денежного знака:
- Код:
#define US 0
#define ENGLAND 1
#define FRANCE 2
#define ACTIVE_COUNTRY US
#if ACTIVE_COUNTRY==US
char currency[] = "dollar";
#elif ACTIVE_COUNTRY==ENGLAND
char currency[] = "pound";
#else
char currency[] = "franc";
#endif
Пн ноя 27, 2017 23:21:06
#define COMMAPOS LEFT
Вт ноя 28, 2017 00:41:29
expression is a C expression of integer type, subject to stringent restrictions. It may contain:
...
- Identifiers that are not macros, which are all considered to be the number zero. This allows you to write #if MACRO instead of #ifdef MACRO, if you know that MACRO, when defined, will always have a nonzero value. Function-like macros used without their function call parentheses are also treated as zero.
Вт ноя 28, 2017 02:56:08
typedef struct{
uint8_t error1;
uint8_t error2;
uint8_t error3;
uint8_t error4;
}Type_error;
Type_error Err1;
Type_error Err2;
Err1.error1=Err2.error1; // Вот это как сделать по феншую ?
Err1.error2=Err2.error2;
Err1.error3=Err2.error3;
uint8_t Err1[4] ={0};
uint8_t Err1[4] ={0};
Err1[0]=Err2[0];
Err1[1]=Err2[1];
Err1[2]=Err2[2];
//сравниваем
if (Err1[0] < 2) return false;
else if (Err1[0] == 4) return false;
else if (Err1[0] > 8) return true;
//Или как показывали раньше, через switch
Вт ноя 28, 2017 07:34:08
#define LEFT 1
#define RIGHT 2
Вт ноя 28, 2017 07:47:08
#if !defined( COMMAPOS ) // или #ifndef
.... // Тут действия, при неопределённом "COMMAPOS"
#else
.... // Тут действия, при определённом "COMMAPOS"
#endif
Вт ноя 28, 2017 14:00:28
#define LEFT 1
#define RIGHT 2
Пн дек 11, 2017 13:37:46
#define SEG_A_ON GPIOD->ODR |= GPIO_PIN_5
#define SEG_B_ON GPIOA->ODR |= GPIO_PIN_2
#define SEG_C_ON GPIOC->ODR |= GPIO_PIN_7
#define SEG_D_ON GPIOD->ODR |= GPIO_PIN_3
#define SEG_E_ON GPIOD->ODR |= GPIO_PIN_1
#define SEG_F_ON GPIOA->ODR |= GPIO_PIN_1
#define SEG_G_ON GPIOC->ODR |= GPIO_PIN_6
#define SEG_DP_ON GPIOD->ODR |= GPIO_PIN_2
uint8_t _SYM[][3] =
{
{1 << 2 | 1 << 1, 1 << 5 | 1 << 1 | 1 << 3, 1 << 7}, // 0
{1 << 2, 0, 1 << 7}, // 1
{1 << 2, 1 << 5 | 1 << 1 | 1 << 3, 1 << 6}, // 2
{1 << 2, 1 << 3 | 1 << 5, 1<<6 | 1 << 7}, // 3
{1 << 2 | 1 << 1, 0, 1 << 6 | 1 << 7}, // 4
{1 << 1, 1 << 5 | 1 << 3, 1 << 6 | 1 << 7}, // 5
{1 << 1, 1 << 1 | 1 << 5 | 1 << 3, 1 << 6 | 1 << 7}, // 6
{1 << 2, 1 << 5, 1 << 7}, // 7
{1 << 1 | 1 << 2, 1 << 5 | 1 << 1 | 1 << 3, 1 << 6 | 1 << 7},// 8
{1 << 1 | 1 << 2, 1 << 5 | 1 << 3, 1 << 6 | 1 << 7}, // 9
{0x00, 0x00, 0x00}, //
};
Пн дек 11, 2017 13:57:09
{1 << 1 | 1 << 5, 1 << 6 | 1 << 7}, // F
{1 << A | 1 << E, 1 << F | 1 << G}, // F
Пн дек 11, 2017 14:12:02
uint8_t _SYM_MASK[3] = {0xF9, 0xD1, 0x3F}; // A, D, C маски чтобы не затронуть остальные биты портов
uint8_t LED[3] = {0x00, 0x00, 0x00};
uint8_t LED_CURR = 0;
// занесем новые данные по сегментам
GPIOA->ODR = GPIOA->ODR & _SYM_MASK[0];
GPIOD->ODR = GPIOD->ODR & _SYM_MASK[1];
GPIOC->ODR = GPIOC->ODR & _SYM_MASK[2];
GPIOA->ODR = GPIOA->ODR | _SYM[LED[LED_CURR]][0];
GPIOD->ODR = GPIOD->ODR | _SYM[LED[LED_CURR]][1];
GPIOC->ODR = GPIOC->ODR | _SYM[LED[LED_CURR]][2];
// включаем нужный разряд
if (LED_OFF[LED_CURR] == 0)
{
GPIOB->DDR = GPIOB->DDR | _DIG_MASK[LED_CURR][0];
GPIOD->ODR = GPIOD->ODR & _DIG_MASK[LED_CURR][1];
}
if (LED_DP[LED_CURR] & 0x01) // точку включаем отдельно
SEG_DP_ON;
LED_CURR++;
if (LED_CURR > 2)
LED_CURR = 0;
Пн дек 11, 2017 14:30:24
Пн дек 11, 2017 14:34:10
Что-то у Вас какая-то путаница в коде.dm211 писал(а):вот остаток кода,связанный с этим-
Пн дек 11, 2017 14:36:43
массив-то можно одномерный, а вот на счет записи в порт - не выйдет: у него сегменты по разным портам разбросаны:Аlex писал(а):Создали одномерный массив для символов и выбираем из него нужный символ, записывая в порт. Всё.
dm211 писал(а):#define SEG_B_ON GPIOA->ODR |= GPIO_PIN_2
#define SEG_C_ON GPIOC->ODR |= GPIO_PIN_7
#define SEG_D_ON GPIOD->ODR |= GPIO_PIN_3
Пн дек 11, 2017 15:23:06
case 'F':
GPIOD->ODR|= (1<<1); // PD1 (A)
GPIOA->ODR&= ~(1<<3); // PA3 (B)
GPIOC->ODR&= ~(1<<3); // PC3 (C)
GPIOC->ODR&= ~(1<<6); // PC6 (D)
GPIOC->ODR|= (1<<7); // PC7 (E)
GPIOC->ODR|= (1<<4); // PC4 (F)
GPIOA->ODR|= (1<<2); // PA2 (G)
Пн дек 11, 2017 15:47:33
Ну значит запись в несколько портовARV писал(а):а вот на счет записи в порт - не выйдет:
Пн дек 11, 2017 20:09:39
Пн дек 11, 2017 20:51:11
....
typedef struct {
GPIO_TypeDef* port;
GPIO_Pin_TypeDef pin;
}segment_t;
...
segment_t seg[8]={
{GPIOD, GPIO_PIN_1}, // A
{GPIOD, GPIO_PIN_2}, // B
{GPIOD, GPIO_PIN_3}, // C
{GPIOD, GPIO_PIN_4}, // D
{GPIOC, GPIO_PIN_4}, // E
{GPIOC, GPIO_PIN_5}, // F
{GPIOC, GPIO_PIN_7}, // G
{GPIOC, GPIO_PIN_6} // DP
};
#define SEG_DP_MASK 0b10000000
// set bit represents live segments: DP G F E D C B A
// 0b 0 0 0 0 0 1 1 0
uint8_t digit_mask[10]={
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
...
#define writeHigh(port,pins) port->ODR |= (pins)
#define writeLow(port,pins) port->ODR &= ~(pins)
#define ValBit(VAR,Place) ((uint8_t)(VAR) & (uint8_t)((uint8_t)1<<(uint8_t)(Place)))
...
void led_setbuf(uint16_t newval){
buf[0]=digit_mask[newval%10];
newval/=10;
buf[1]=digit_mask[newval%10];
newval/=10;
buf[2]=digit_mask[newval%10]|SEG_DP_MASK;
}
...
void led_display_digit(uint8_t seg_mask) {
uint8_t i;
for (i = 0; i < 8; i++) {
if (ValBit(seg_mask,i) == 0) {
writeLow(seg[i].port, seg[i].pin);
} else {
writeHigh(seg[i].port, seg[i].pin);
}
}
}
...