Провел тесты. Тут тестируется три способа сканирования кнопок. Сканирование переключением режимов порта - это две верхние полоски. Сканирование вертикалей. Сканирование горизонталей.
Как и ожидалось, последовательность команд
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 }







Ответить с цитированием