Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- OLED_busy_wait:
- ;Настраиваем биты управления OLED
- CBI PORTA,RS
- SBI PORTA,RW
- CBI PORTA,Enable
- LDI R16,0xf0
- OUT DDRA, R16;Настраиваем выводы, подключенные к шине данных OLED, на прием
- Busy_lp:
- ;начинаем строб
- SBI PORTA,Enable
- LDI Counter,11
- RCALL Timer_us;выдерживаем строб 11мкс
- IN R19,PINA
- ;завершаем строб
- CBI PORTA,Enable
- OLED_STROBE_RD;выполняем дополнительный строб
- ;SBIC PINA,DB7;если флаг занятости снят - проходим мимо зацикливания
- ANDI R19,0x08
- BRNE Busy_lp
- ;RJMP Busy_lp;иначе повторяем все с начала подачи строба
- LDI R16,0xFE;Если busy flag прошел - просигнализируем 0-м диодом
- OUT PORTB,R16
- ;LDI Counter,20
- ;RCALL Timer_5ms
- ;LDI R16,0xFF
- ;OUT PORTB,R16
- ORI R16,1<<DB7|1<<DB6|1<<DB5|1<<DB4
- OUT DDRA, R16;Настраиваем выводы, подключенные к шине данных OLED, на передачу
- RET
- ;########процедура записи одного полубайта на индикатор
- OLED_wrnibble:
- LDI Counter,50
- RCALL Timer_us
- OLED_STROBE_WR
- RET
- ;########процедура записи байта на индикатор в виде двух полубайт
- OLED_wrbyte:
- MOV R21,R20;используем промежуточный регистр
- SWAP R21
- ANDI R21,0x0f
- ANDI R19,0xf0;маскируем нижний полубайт
- OR R19,R21;и грузим в него значение необходимого полубайта
- LDI Counter,50
- RCALL Timer_us
- OLED_STROBE_WR;отправляем старший полубайт на загрузку
- MOV R21,R20;вновь кидаем целевой байт в промежуточный регистр
- ANDI R21,0x0f;и маскируем его старшую часть
- ANDI R19,0xf0;вновь маскируем нижний полубайт регистра передачи
- OR R19,R21; и грузим в него целевой полубайт из промежуточного регистра
- LDI Counter,50
- RCALL Timer_us
- OLED_STROBE_WR;отправляем младший полубайт на загрузку
- RCALL OLED_busy_wait;подождем, пока индикатор освободится
- RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement