參考資訊:
https://github.com/adafruit/Adafruit_SSD1306
https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
main.s
list p=12f1822, r=hex
#include <p12f1822.inc>
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _MCLRE_OFF
__config _CONFIG2, _LVP_OFF
#define i2c_cnt 0x70
#define i2c_dat 0x71
#define i2c_var 0x72
#define lcd_var1 0x73
#define lcd_var2 0x74
#define delay_var1 0x75
#define delay_var2 0x76
#define led 0x00
#define i2c_scl 0x01
#define i2c_sda 0x02
#define i2c_addr 0x78
#define lcd_width 0x80
#define lcd_height 0x20
#define cmd_contrast 0x81
#define cmd_disp_resume 0xa4
#define cmd_normal_disp 0xa6
#define cmd_invert_disp 0xa7
#define cmd_disp_off 0xae
#define cmd_disp_on 0xaf
#define cmd_disp_offset 0xd3
#define cmd_com_pins 0xda
#define cmd_vcom_detect 0xdb
#define cmd_clock_div 0xd5
#define cmd_pre_charge 0xd9
#define cmd_multiplex 0xa8
#define cmd_start_line 0x40
#define cmd_memory_mode 0x20
#define cmd_column_addr 0x21
#define cmd_page_addr 0x22
#define cmd_scan_dec 0xc8
#define cmd_seg_remap 0xa1
#define cmd_charge_pump 0x8d
org 0x0000
goto start
org 0x0100
start:
banksel OSCCON
movlw b'11110010'
movwf OSCCON
banksel ANSELA
clrf ANSELA
banksel LATA
movlw 0xff
movwf LATA
banksel TRISA
bcf TRISA, led
bcf TRISA, i2c_scl
bcf TRISA, i2c_sda
banksel LATA
movlw 0xff
movwf LATA
loop:
call ssd1306_init
call ssd1306_set_col_addr
call ssd1306_set_page_addr
lcd:
call i2c_start
movlw i2c_addr
call i2c_write
movlw 0x40
call i2c_write
banksel lcd_var1
movlw 0x08
movwf lcd_var1
m0:
movlw 0x40
movwf lcd_var2
m1:
movlw 0x55
call i2c_write
banksel lcd_var2
decfsz lcd_var2, f
goto m1
decfsz lcd_var1, f
goto m0
call i2c_stop
idle:
banksel LATA
bcf LATA, led
call delay1s
banksel LATA
bsf LATA, led
call delay1s
goto idle
delay1s:
banksel delay_var1
movlw 0xff
movwf delay_var2
movwf delay_var1
decfsz delay_var1, f
goto $-1
decfsz delay_var2, f
goto $-3
return
delay:
banksel delay_var1
movlw 0x40
movwf delay_var1
decfsz delay_var1, f
goto $-1
return
i2c_start:
banksel LATA
bsf LATA, i2c_sda
bsf LATA, i2c_scl
call delay
banksel LATA
bcf LATA, i2c_sda
call delay
banksel LATA
bcf LATA, i2c_scl
return
i2c_stop:
call delay
banksel LATA
bcf LATA, i2c_sda
call delay
banksel LATA
bsf LATA, i2c_scl
call delay
banksel LATA
bsf LATA, i2c_sda
return
i2c_write:
banksel i2c_dat
movwf i2c_dat
movlw 0x08
movwf i2c_cnt
i0:
banksel i2c_dat
rlf i2c_dat, f
banksel LATA
btfss STATUS, C
bcf LATA, i2c_sda
btfsc STATUS, C
bsf LATA, i2c_sda
call delay
banksel LATA
bsf LATA, i2c_scl
call delay
banksel LATA
bcf LATA, i2c_scl
decfsz i2c_cnt, f
goto i0
call delay
banksel LATA
bsf LATA, i2c_sda
call delay
banksel LATA
bsf LATA, i2c_scl
call delay
banksel LATA
bcf LATA, i2c_scl
return
send_cmd:
banksel i2c_var
movwf i2c_var
call i2c_start
movlw i2c_addr
call i2c_write
movlw 0x00
call i2c_write
banksel i2c_var
movf i2c_var, w
call i2c_write
call i2c_stop
return
send_dat:
banksel i2c_var
movwf i2c_var
call i2c_start
movlw i2c_addr
call i2c_write
movlw 0x40
call i2c_write
banksel i2c_var
movf i2c_var, w
call i2c_write
call i2c_stop
return
ssd1306_init:
movlw cmd_disp_off
call send_cmd
movlw cmd_clock_div
call send_cmd
movlw 0x80
call send_cmd
movlw cmd_multiplex
call send_cmd
movlw 0x1f
call send_cmd
movlw cmd_disp_offset
call send_cmd
movlw 0x00
call send_cmd
movlw cmd_start_line
call send_cmd
movlw cmd_charge_pump
call send_cmd
movlw 0x14
call send_cmd
movlw cmd_memory_mode
call send_cmd
movlw 0x00
call send_cmd
movlw cmd_seg_remap
call send_cmd
movlw cmd_scan_dec
call send_cmd
movlw cmd_com_pins
call send_cmd
movlw 0x02
call send_cmd
movlw cmd_contrast
call send_cmd
movlw 0x8f
call send_cmd
movlw cmd_pre_charge
call send_cmd
movlw 0xf1
call send_cmd
movlw cmd_vcom_detect
call send_cmd
movlw 0x40
call send_cmd
movlw cmd_disp_resume
call send_cmd
movlw cmd_normal_disp
call send_cmd
movlw cmd_disp_on
call send_cmd
return
ssd1306_set_col_addr:
movlw cmd_column_addr
call send_cmd
movlw 0x00
call send_cmd
movlw (lcd_width-1)
call send_cmd
return
ssd1306_set_page_addr:
movlw cmd_page_addr
call send_cmd
movlw 0x00
call send_cmd
movlw ((lcd_height/8)-1)
call send_cmd
return
end
編譯
$ gpasm main.s
完成