void IND_OutputFormat(uint16_t value, uint8_t comma, uint8_t position, uint8_t amount) { uint8_t tmp; uint8_t i; if ((position <= IND_AMOUNT_NUM)&&(position != 0)){ for(i = 0; i < amount; i++){ tmp = value % 10; if ((i == 0)||(value > 0)||(position <= comma)){ ind_buf[position-1] = read_byte_flash(number[tmp]); } else{ ind_buf[position-1] = read_byte_flash(number[IND_EMPTY_NUM]); } value = value/10; position++; if (position > IND_AMOUNT_NUM){ break; } } } if ((comma <= IND_AMOUNT_NUM) && (comma != 0)) { ind_buf[comma-1] |= 1<<IND_COM; } }
void IND_OutSym(char *str, uint8_t pos) { uint8_t i, j; char s; /*проверяем корректность заданной позиции*/ if ((pos > IND_AMOUNT_NUM) || (!pos)){ return; } /*проходка по строке, пока она или индикатор не кончится*/ for (j = pos-1; j < IND_AMOUNT_NUM; j++){ s = *str++; if (!s){ break; } /*поиск символа по таблице*/ for (i = 0; read_byte_flash(sym[i]) != 0; i += 2){ if (s == read_byte_flash(sym[i])){ ind_buf[j] = read_byte_flash(sym[i+1]); } } } }
void IND_Time(uint16_t CurrentTime,uint8_t position){ uint8_t blk_dot; !(CurrentTime%2)?(blk_dot=1):(blk_dot=0); // мигает по четности ... ind_buf[3+position-1] = read_byte_flash(number[CurrentTime % 6000/600]); // здесь раскладываем число на разряды ind_buf[2+position-1] = read_byte_flash(number[CurrentTime % 600 /60 ])|(blk_dot<<IND_COM);//(!(CurrentTime%2)?(1<<IND_COM):tralala()); // +точка ind_buf[1+position-1] = read_byte_flash(number[CurrentTime % 60 /10]); // выделяем десятки секунд 5 максимальное значение ind_buf[0+position-1] = read_byte_flash(number[CurrentTime % 10]); }
void IND_Init(void) { uint8_t i; #ifndef IND_SPI_CONNECTION IND_PORT_SEG = (1<<IND_A)|(1<<IND_B)|(1<<IND_C)|(1<<IND_D)|(1<<IND_E)|(1<<IND_F)|(1<<IND_G)|(1<<IND_COM); IND_DDR_SEG = (1<<IND_A)|(1<<IND_B)|(1<<IND_C)|(1<<IND_D)|(1<<IND_E)|(1<<IND_F)|(1<<IND_G)|(1<<IND_COM); for(i = 0; i < IND_AMOUNT_NUM; i++){ IND_PORT_DIG |= (1<<read_byte_flash(digit[i])); IND_DDR_DIG |= (1<<read_byte_flash(digit[i])); } #else SPI_Init(); #endif for(i = 0; i < IND_AMOUNT_NUM; i++) { ind_buf[i] = 0; } }
void IND_Output(uint16_t value, uint8_t comma) { uint8_t tmp; uint8_t i; for(i = 0; i < IND_AMOUNT_NUM; i++){ tmp = value % 10; if ((i == 0)||(value > 0)||(i <= comma)){ ind_buf[i] = read_byte_flash(number[tmp]); } else{ ind_buf[i] = read_byte_flash(number[IND_EMPTY_NUM]); } value = value/10; } if ((comma <= IND_AMOUNT_NUM) && (comma != 0)) { ind_buf[comma-1] |= 1<<IND_COM; } }
void IND_OutputFormatChar(char char_string[], uint8_t comma, uint8_t position) // TODO: реализовать бегущую строку с использованием количества элементов, а также мигание символов { uint8_t i,j,amount; char tmp[strlen(char_string)]; amount=strlen(char_string); for (i=0,j=strlen(char_string);i<strlen(char_string);i++,j--){ //зеркалирование строки tmp[j-1]=char_string[i]; } for (j=0;j<amount;j++){ for (i=11;i<=((int)tmp[j]);++i){ //добавлено стартовое значение , перескакиваем цифры if (read_byte_flash(number[i][1])==(int)tmp[j]) break; // вся трабла была с чтением с пзу } ind_buf[j+position-1] = read_byte_flash(number[i][0]); //это конечно не оптимально искать в пзу // но не забивать же туда всю таблицу } if ((comma <= IND_AMOUNT_NUM) && (comma != 0)) { ind_buf[comma-1] |= 1<<IND_COM; } }
void IND_Update(void) { static uint8_t count = 0; uint8_t i; #ifdef IND_SPI_CONNECTION /*________________ подключение по SPI____________________________*/ #ifdef IND_SHIFT_REG_DIG2 uint16_t tmp; #else uint8_t tmp; #endif /*гасим индикатор*/ IND_LightOutSeg(spi_buf[IND_SHIFT_REG_SEG],IND_LIGHT_OUT); tmp = 0; for (i = 0; i < IND_AMOUNT_NUM; i++){ tmp |= (1<<read_byte_flash(digit[i])); } IND_LightOutDig(spi_buf[IND_SHIFT_REG_DIG1],((uint8_t)tmp)); #ifdef IND_SHIFT_REG_DIG2 IND_LightOutDig(spi_buf[IND_SHIFT_REG_DIG2],(tmp>>8)); #endif SPI_WriteArray(IND_AMOUNT_REG, spi_buf); #ifdef IND_SCAN_SEGMENT /*___________реализация посегментной развертки___________*/ tmp = 0; for (i = 0; i < IND_AMOUNT_NUM; i++){ if (ind_buf[i]&read_byte_flash(mask[count])) { tmp |= (1<<read_byte_flash(digit[i])); } } IND_OutDig(spi_buf[IND_SHIFT_REG_DIG1], ((uint8_t)tmp)); #ifdef IND_SHIFT_REG_DIG2 IND_OutDig(spi_buf[IND_SHIFT_REG_DIG2],(tmp>>8)); #endif IND_OutSeg(spi_buf[IND_SHIFT_REG_SEG], read_byte_flash(mask[count])); count++; count &= 0x07; #else /*___________реализация поразрядной развертки___________*/ tmp = 1<<read_byte_flash(digit[count]); IND_OutDig(spi_buf[IND_SHIFT_REG_DIG1], ((uint8_t)tmp)); #ifdef IND_SHIFT_REG_DIG2 IND_OutDig(spi_buf[IND_SHIFT_REG_DIG2],(tmp>>8)); #endif IND_OutSeg(spi_buf[IND_SHIFT_REG_SEG], ind_buf[count]); count++; if (count >= IND_AMOUNT_NUM){ count = 0; } #endif /*вывод на индикатор*/ SPI_WriteArray(IND_AMOUNT_REG, spi_buf); #else /*____________________обычное подключение____________________________*/ uint8_t tmp; /*гасим все индикаторы*/ IND_LightOutSeg(IND_PORT_SEG, IND_LIGHT_OUT); tmp = 0; for (i = 0; i < IND_AMOUNT_NUM; i++){ tmp |= (1<<read_byte_flash(digit[i])); } IND_LightOutDig(IND_PORT_DIG, tmp); #ifdef IND_SCAN_SEGMENT /*____________реализация посегментной развертки___________*/ tmp = 0; for (i = 0; i < IND_AMOUNT_NUM; i++){ if (ind_buf[i]&read_byte_flash(mask[count])) { tmp |= (1<<read_byte_flash(digit[i])); } } IND_OutDig(IND_PORT_DIG, tmp); IND_OutSeg(IND_PORT_SEG, read_byte_flash(mask[count])); count++; count &= 0x07; #else /*____________реализаци поразрядной развертки____________*/ IND_OutDig(IND_PORT_DIG, (1<<read_byte_flash(digit[count]))); IND_OutSeg(IND_PORT_SEG, ind_buf[count]); count++; if (count >= IND_AMOUNT_NUM){ count = 0; } #endif #endif AddTask(IND_Update,1); }