Advertisement
Guest User

AVR_OLED_Procs

a guest
Nov 19th, 2015
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. OLED_busy_wait:
  2.  
  3.                 ;Настраиваем биты управления OLED
  4.                 CBI PORTA,RS
  5.                 SBI PORTA,RW
  6.                 CBI PORTA,Enable
  7.  
  8.                
  9.                 LDI R16,0xf0
  10.                 OUT DDRA, R16;Настраиваем выводы, подключенные к шине данных OLED, на прием
  11. Busy_lp:
  12.                 ;начинаем строб
  13.                 SBI PORTA,Enable
  14.  
  15.                 LDI Counter,11
  16.                 RCALL Timer_us;выдерживаем строб 11мкс
  17.  
  18.                 IN R19,PINA
  19.  
  20.                 ;завершаем строб             
  21.                 CBI PORTA,Enable
  22.  
  23.                 OLED_STROBE_RD;выполняем дополнительный строб
  24.  
  25.                 ;SBIC PINA,DB7;если флаг занятости снят - проходим мимо зацикливания
  26.                 ANDI R19,0x08
  27.                 BRNE Busy_lp
  28.                 ;RJMP Busy_lp;иначе повторяем все с начала подачи строба
  29.  
  30.                 LDI R16,0xFE;Если busy flag прошел - просигнализируем 0-м диодом
  31.                 OUT PORTB,R16
  32.                 ;LDI Counter,20
  33.                 ;RCALL Timer_5ms
  34.                 ;LDI R16,0xFF
  35.                 ;OUT PORTB,R16
  36.                
  37.                
  38.                 ORI R16,1<<DB7|1<<DB6|1<<DB5|1<<DB4
  39.                 OUT DDRA, R16;Настраиваем выводы, подключенные к шине данных OLED, на передачу
  40.  
  41.                 RET
  42.  
  43.  
  44.  
  45. ;########процедура записи одного полубайта на индикатор
  46. OLED_wrnibble:
  47.                 LDI Counter,50
  48.                 RCALL Timer_us
  49.                 OLED_STROBE_WR
  50.  
  51.                 RET
  52.  
  53. ;########процедура записи байта на индикатор в виде двух полубайт
  54. OLED_wrbyte:
  55.  
  56.                 MOV R21,R20;используем промежуточный регистр
  57.                 SWAP R21
  58.                 ANDI R21,0x0f
  59.  
  60.                 ANDI R19,0xf0;маскируем нижний полубайт
  61.                 OR R19,R21;и грузим в него значение необходимого полубайта
  62.                
  63.                                
  64.                 LDI Counter,50
  65.                 RCALL Timer_us
  66.                 OLED_STROBE_WR;отправляем старший полубайт на загрузку
  67.                
  68.                                
  69.                 MOV R21,R20;вновь кидаем целевой байт в промежуточный регистр
  70.                 ANDI R21,0x0f;и маскируем его старшую часть
  71.                
  72.                 ANDI R19,0xf0;вновь маскируем нижний полубайт регистра передачи
  73.                 OR R19,R21; и грузим в него целевой полубайт из промежуточного регистра
  74.                
  75.                 LDI Counter,50
  76.                 RCALL Timer_us
  77.                 OLED_STROBE_WR;отправляем младший полубайт на загрузку
  78.                
  79.                 RCALL OLED_busy_wait;подождем, пока индикатор освободится              
  80.  
  81.  
  82.                 RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement