Провел тесты. Тут тестируется три способа сканирования кнопок. Сканирование переключением режимов порта - это две верхние полоски. Сканирование вертикалей. Сканирование горизонталей.
Как и ожидалось, последовательность команд
STA imm
LDA imm
работает отлично
А вот последовательность
STA
MOV A, M
не работает.
Точнее работает только для сканирования горизонталей (PB2-PB7) и только для столбцов с кнопками 4...0 (PA0-PA7).
---------- Post added 24.01.2013 at 00:26 ---------- Previous post was 23.01.2013 at 23:50 ----------
С внешними резисторами я наверное смогу заставить работать ATMega8.
---------- Post added at 00:30 ---------- Previous post was at 00:26 ----------
Как практически, так и теоретически у нас есть 25 тактов, за которые мы должны дать ответ.
(7.5*4-5) = 25
---------- Post added at 00:32 ---------- Previous post was at 00:30 ----------
Код:
interrupt [EXT_INT0] void ext_int0() {
#asm
.EQU PIND=0x10
.EQU PINC=0x13
.EQU PINB=0x16
.EQU DDRC=0x14
.EQU DDRB=0x17
.EQU DDRD=0x11
.EQU PORTB=0x18
.EQU PORTC=0x15
.EQU PORTD=0x12
IN R8, SREG ; 1 1
; Переводим PORTC в режим ввода
CLR R9 ; 1 2
OUT DDRC, R9 ; 1 3
; DDRB = c2b[PINC];
IN R28, PINC ; 1 4
ANDI R28, 0x3F ; +1
CPI R28, 0x3F ; 1 5
BREQ _v12 ; 2 7
LD R9, Y ; 2 9 Адрес 0x200+R28
OUT DDRB, R9 ; 1 10
; DDRD = (DDRD & 0x33) | c2d[PINC];
SUBI R28, -64 ; 1 11
LD R9, Y ; 2 13 Адрес 0x200+R28+64
IN R28, DDRD ; 1 14
ANDI R28, 0x33 ; 1 15
OR R28, R9 ; 1 16
OUT DDRD, R28 ; 1 17
; Выход
OUT SREG, R8
RETI
_v12: ; Переводим порты B,D в режим ввода. PORTС в режим вывода
OUT DDRB, R9 ; 1 8 R9=0
IN R28, DDRD ; 1 9
ANDI R28, ~0x33 ; 1 10
OUT DDRD, R28 ; 1 11
; DDRC = b2c[PINB] | d2c[PIND & 0x33];
IN R28, PIND ; 1 12
ORI R28, 0xCC ; 1 13
LD R9, Y ; 2 15 Адрес 0x200+R28+192
IN R28, PINB ; 1 16
LDI R29, 1 ; 1 17
LD R28, Y ; 2 19 Адрес 0x100+R28
OR R9, R28 ; 1 20
OUT DDRC, R9 ; 1 21
; Выход
OUT SREG, R8
LDI R29, 2
#endasm
}
Пробовать буду завтра.