Для переписывания шрифтов есть у меня такая программка:
Работать с ней так: создать в одной с ней папке файл <some_name>.txt (<some_name> - любое имя, какое хотите), в который скопировать массив symbol_code из программы часов, например, вот это:
Спойлер
Код: Выделить всё
//Segment order: A_GEBCFD ("_" - unused bit).
flash char symbol_code[]={0b10011111, //0
0b00001100, //1
0b10111001, //2
0b10101101, //3
0b00101110, //4
0b10100111, //5
0b10110111, //6
0b10001110, //7
0b10111111, //8
0b10101111, //9
0b00000000, //space 10
0b00000010, //digit 8 dot 11
0b00100000, //digit 8 minus 12
0b00010011, //L 13
0b00010101, //v 14
0b10011010, //M left 15
0b10110011, //E 16
0b00110011, //t 17
0b00000001, //low _ 18
0b10000000, //high ^ 19
0b00110111, //b 20
0b10111110, //A 21
0b00111101, //d 22
0b10010011, //C 23
0b00011111, //U 24
0b00110000, //r 25
0b00110100, //n 26
0b00000100, //i 27
0b10101110, //q 28
0b10110010, //F,f 29
0b10111010, //P 30
0b10101010, //degree_sign 31
0b00101111, //Y 32
0b00011101, //J 33
1<<SEG_B, //34
1<<SEG_E, //35
1<<SEG_F, //36
0b00110101, //o 37
(1<<SEG_B)|(1<<SEG_G), //38
(1<<SEG_C)|(1<<SEG_G), //39
(1<<SEG_F)|(1<<SEG_G), //40
0b00110110 //h 41
};
Дальше запустить программу, ввести имя файла, которое было задано (например, in.txt). Потом ввести старый порядок сегментов (например, A_GEBCFD) и новый порядок (например, B_GEACFD). Программа переставит биты и запишет всё в файл converted_<some_name>.txt. В приведённом примере поменяются местами сегменты A и B.
Теперь нужно вручную исправить #define над массивом символов:
Код: Выделить всё
//Segments bits numbers:
#define SEG_A 7
#define SEG_B 3
#define SEG_C 2
#define SEG_D 0
#define SEG_E 4
#define SEG_F 1
#define SEG_G 5
#define SEG_DP 6
Там написаны номера бит для каждого сегмента. Массив символов заменить тем, что выдала программа.
Вывод в порты МК здесь:
Код: Выделить всё
PORTB|=0b00111111;
PORTB&=0b11000000|(~tmp);
PORTD|=0b11000000;
PORTD&=0b00111111|(~tmp);
if((digit_counter==8)||(tmp!=0))
switch(digit_counter){
case 0: PORTD.5=0; break;
case 1: PORTB.7=0; break;
case 2: PORTB.6=0; break;
case 3: PORTD.4=0; break;
case 4: PORTD.3=0; break;
case 5: PORTD.2=0; break;
case 6: PORTC.5=0; break;
case 7: PORTD.0=0; break;
case 8: PORTD.1=0; break;
}
В первых четырёх строках выводится код символа, а в остальных - активируется текущий разряд. При изменении портов для индикатора нужно изменить битовые маски. Например, сейчас в PB3 выводится значение сегмента в 3-м бите, т.е. сегмента B. Первая и третья маски содержат единицы там, где подключены сегменты, а вторая и четвёртая инверсны им соответственно.
Также, при изменении подключения сегментов/сеток нужно изменить маски тут:
Код: Выделить всё
// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
PORTB|=0b11000000;
PORTC|=0b00100000;
PORTD|=0b00111111;
}
Здесь единицы стоят на тех местах, где подключены сеточные ключи.
И, наконец, нужно задать начальные значения 1 для всех сегментных/сеточных портов тут:
Код: Выделить всё
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=1 Bit6=1 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(1<<PORTB7) | (1<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=In Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=1 Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (1<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit7=0 Bit6=0 Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1
PORTD=(0<<PORTD7) | (0<<PORTD6) | (1<<PORTD5) | (1<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);
Если порты сегментов/сеток меняются между собой (сегмент-сегмент, сегмент-сетка, сетка-сетка), тут можно ничего не трогать.