微處理器 - Microchip PIC12F1822 - Assembly - 0.91" OLED 128x32 SSD1306



參考資訊:
https://github.com/adafruit/Adafruit_SSD1306
https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

main.s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
    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

完成