Для начала написал подпрограмму чтения:
1. выводы DIO, CLK в высоком состоянии (входы, активный уровень МК - лог.0).
2. опускаю сигнал CLK
3. Жду 5 мкс.
4. Поднимаю сигнал CLK
5. Копирую состояние DIO в бит переноса МК.
6. Сдвигаю вправо регистр-аккумулятор вместе с битом переноса.
9. делаю так 8 раз, возвращаясь к пункту 2.
10. сдвигаю аккумулятор еще раз вправо.
11. копирую аккумулятор в ячейку памяти, выхожу из подпрограммы.
В даташите указано, чтоб прочитать кнопки, надо опустить STB, отправить микрухе команду 0x42, после чего, не поднимая сигнал STB, 4 раза произвести чтение. Так и делаю:
1. Опускаю STB.
2. выдерживаю паузу
3. Передаю код 0x42.
4. Выдерживаю паузу
5. Вызываю подпрограмму чтения, описанную выше.
6. Возвращаемое значение ложу в первую ячейку памяти.
7. И так 4 раза, пока заполнятся 4 ячейки памяти.
8. Поднимаю сигнал STB
9. Вызываю подпрограмму отображения принятых данных. Так как я не знаю в какой из 4-х ячеек данные, то по очереди с секундной задержкой отображаю их все, а еще 4-мя светодиодами отображаю номер ячейки. Принятые данные отображаются 8-разрядной светодиодной полоской на порте 2.
10. возвращаюсь к п.1 и так циклически. Пробовал возвращатся к п.4, но разницы никакой.
И ничего не работает. Хотя некое шевеление присутствует, при нажатии кнопок загорается 5-й и 0-й разряд индикатора на P2. Хотя в даташите все достаточно просто.
Пробовал по всякому - менял фазу, менял полярность тактовых импульсов в подпрограмме чтения, пробовал менять момент фиксации состояния вывода DIO - по фронту, по полке, по спаду, сдвигал влево, сдвигал вправо, менял команду чтения - 0x41 вместо 0x42, пробовал стробировать отправку команды 0x42 (так отправляется инструкция 0x44 для индикации )- чего только не делал - не работает никак.
Исходный код программы:
Спойлер
Код: Выделить всё
stb_pin bit P1.0
clk_pin bit P1.1
dio_pin bit P1.2
rdata equ 0x20
ldata equ 0x21
reg0 equ 0x22
reg1 equ 0x23
reg2 equ 0x24
reg3 equ 0x25
org 0
main: clr stb_pin
mov rdata, #0x44
call tm1638send
call pause
setb stb_pin
call pause
clr stb_pin
mov rdata, #0x0C
call tm1638send
mov rdata, #0xFF
call tm1638send
call pause
setb stb_pin
call pause
clr stb_pin
mov rdata, #0x8D
call tm1638send
call pause
setb stb_pin
call pause
o_loop: clr stb_pin
call pause
mov rdata, #0x42
call tm1638send
call pause
;
call read1638
mov reg0, ldata
call pause
call read1638
mov reg1, ldata
call pause
call read1638
mov reg2, ldata
call pause
call read1638
mov reg3, ldata
call pause
setb stb_pin
call memread
jmp o_loop
memread: push ACC
push PSW
setb P3.7
mov A, reg0
cpl A
mov P2, A
clr P3.4
call delay1s
setb P3.4
mov A, reg1
cpl A
mov P2, A
clr P3.5
call delay1s
setb P3.5
mov A, reg2
cpl A
mov P2, A
clr P3.6
call delay1s
setb P3.6
mov A, reg3
cpl A
mov P2, A
clr P3.7
call delay1s
pop PSW
pop ACC
ret
tm1638send: push ACC
push PSW
mov A, rdata
rrc A
mov R7, #0x08
rdloop: clr clk_pin
mov dio_pin, C
setb clk_pin
rrc A
djnz R7, rdloop
pop PSW
pop ACC
ret
read1638: push ACC
push PSW
mov R6, #0x08
setb dio_pin
clr clk_pin
call pause
nextbit: setb clk_pin
mov C, dio_pin
clr clk_pin
rrc A
djnz R6, nextbit
mov ldata, A
pop PSW
pop ACC
ret
pause: push 0x30
mov 0x30, #0x11
next: djnz 0x30, next
pop 0x30
ret
delay1s: mov 0x30, #0x0A
mov 0x31, #0x1F
mov 0x32, #0x90
next1s: djnz 0x32, next1s
djnz 0x31, next1s
djnz 0x30, next1s
ret
end
