Вообщем спаял схему подключения семисегментного индикатора через сдвиговый регистр к МК.
Индикация динамическая.
PORTB.1 - DATA
PORTB.4 - CLK.
Пишу на С в CVAVR
Нашел код на ASM, подогнал его для моего МК, но теперь не знаю как вызвать этот код в виде функции и передать ему значение для отображения.
Спойлер
.DEF TMP = R17.DEF SYM = R18
.DEF CNT = R19
; OUTP порт, значение
.MACRO OUTP
LDI R16,@1
OUT @0,R16
.ENDM
.CSEG
.ORG 0x0000
RJMP init
sym_table:
; Таблица символов 7SEG дисплея
; для платы ATtiny13 xBoard v2
; Q0 = C, Q1 = D, Q2 = dot, Q3 = E,
; Q4 = F, Q5 = A, Q6 = B, Q7 = G
; Для ОБЩЕГО АНОДА:
; 0 = сегмент горит, 1 = сегмент погашен
; (для ОБЩЕГО КАТОДА инвертировать значения)
; qqqqqqqq
; 01234567
.DB 0b00000011, 0b10011111 ; 0, 1
.DB 0b00100101, 0b00001101 ; 2, 3
.DB 0b10011001, 0b01001001 ; 4, 5
.DB 0b01000001, 0b00011111 ; 6, 7
.DB 0b00000001, 0b00001001 ; 8, 9
.DB 0b00010001, 0b11000001 ; A, B
.DB 0b01101001, 0b10000101 ; C, D
.DB 0b01100001, 0b11110001 ; E, F
.DB 0b11111111, 0b00000000 ; all_clr, all_set
; setdisplay рисует указанный символ
; SYM на 7-мисегментном дисплее
; NB! До вызова нужно указать SYM
setdisplay:
; Установить контрольные биты порта
OUTP DDRB, (1<<PB4) | (1<<PB1)
; Загрузить адрес таблицы символов
LDI ZL, LOW (2*sym_table)
LDI ZH, HIGH(2*sym_table)
; Найти нужный символ
ADD ZL, SYM
; Загрузить данные символа в R0
LPM
; Начало итерации
LDI TMP, 8
back1:
SBRC R0, 0
RJMP bitset
; Установить сегмент в 0 (горит)
OUTP PORTB,(0<<PB4)|(0<<PB1)
OUTP PORTB,(1<<PB4)|(0<<PB1)
RJMP bitunset
bitset:
; Установить сегмент в 1 (погашен)
OUTP PORTB,(0<<PB4)|(1<<PB1)
OUTP PORTB,(1<<PB4)|(1<<PB1)
bitunset:
LSR R0
DEC TMP
BRNE back1
; Выход из процедуры
RET
; Инициализация
init:
OUTP DDRB, 0x12
OUTP DDRA, 0x38
prog:
MOV CNT, R19
MOV SYM, CNT
RCALL setdisplay
RJMP prog
Спойлер
void writedigit(int x){
код на ассемблере
.
MOV CNT, x
MOV SYM, CNT
RCALL setdisplay
RJMP prog
}
Заранее спасибо.




