このファイル: /home/web6047/www/cgi-bin/prj/photos of index/20200809-/softwarei2c_2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "pic.h"
23
#include "stdio.h";
24
25
26
27
28
#pragma config WDTE = OFF
29
30
31
32
#pragma config LVP = OFF
33
34
35
36
37
38
39
40
41
42
43
#define I2C_SCL RB4
44
#define I2C_SDA RB1
45
#define I2C_SDA_TRIS TRISB1
46
47
48
#define LCD_ADDR 0x7C
49
50
51
static void I2C_start(void);
52
static void I2C_send(unsigned char);
53
static unsigned char I2C_ackchk(void);
54
static void I2C_acksnd(void);
55
static void I2C_nacksnd(void);
56
static unsigned char I2C_rcv(void);
57
static unsigned char I2C_rcv_char(unsigned char EE_P0 ,unsigned char addr1 ,unsigned char addr2);
58
static void I2C_stop();
59
60
static void wait_50us(void);
61
static void wait_1ms(void);
62
static void wait_ms(unsigned int);
63
64
65
66
67
68
static void I2C_snd_char2( unsigned char databyte) {
69
I2C_start();
70
71
I2C_send(LCD_ADDR);
72
if (I2C_ackchk()) {
73
}
74
75
76
I2C_send( 0b00000000 );
77
if (I2C_ackchk()) {
78
}
79
80
81
I2C_send(databyte);
82
if (I2C_ackchk()) {
83
}
84
85
I2C_stop();
86
87
wait_ms(5);
88
return;
89
}
90
91
92
93
94
void lcdClr() {
95
I2C_snd_char2( 0x01 );
96
}
97
98
99
100
101
void lcdStr( char *str ) {
102
I2C_start();
103
I2C_send(LCD_ADDR);
104
if (I2C_ackchk()) {
105
}
106
107
while( *str != '\0' ) {
108
109
if( *( str + 1 ) == '\0' ) {
110
I2C_send( 0b01000000 );
111
} else {
112
I2C_send( 0b11000000 );
113
}
114
115
if (I2C_ackchk()) {
116
}
117
118
119
I2C_send( *str );
120
121
122
if (I2C_ackchk()) {
123
}
124
125
126
str++;
127
}
128
I2C_stop();
129
}
130
131
132
133
134
135
136
137
138
139
140
141
volatile persistent unsigned char kekka;
142
143
int main() {
144
OSCCON = 0x70;
145
ANSEL = 0x00;
146
TRISA = 0xF0;
147
TRISB = 0xE3;
148
PORTA = 0x00;
149
PORTB = 0x12;
150
151
152
153
154
wait_ms( 500 );
155
156
157
I2C_snd_char2( 0x38 );
158
I2C_snd_char2( 0x3d );
159
I2C_snd_char2( 0x1d );
160
I2C_snd_char2( 0x52 );
161
I2C_snd_char2( 0x6b );
162
I2C_snd_char2( 0x70 );
163
I2C_snd_char2( 0x39 );
164
I2C_snd_char2( 0x0f );
165
lcdClr();
166
167
168
169
lcdStr( "Asm P63" );
170
I2C_snd_char2( 0xc0 );
171
172
173
174
175
176
177
178
179
180
181
182
#asm
183
GR0 EQU 0 ;
184
GR1 EQU 0 ;
185
DATA1 EQU 100 ;5
186
MOVF DATA1 ;1
187
MOVWF GR0 ;1
188
MOVF GR0 ;2
189
MOVWF GR1 ;2
190
MOVF GR1 ;3
191
SUBWF GR0,1 ;3
192
193
;------結果表示用------
194
MOVF GR0
195
MOVWF _kekka
196
#endasm
197
198
199
char buf[15];
200
sprintf( buf, "%d", kekka );
201
lcdStr( buf );
202
203
204
205
206
while(1) {
207
}
208
}
209
210
211
212
213
214
static void I2C_start() {
215
216
I2C_SDA = 1;
217
I2C_SDA_TRIS = 0;
218
I2C_SCL = 1;
219
NOP();
220
NOP();
221
NOP();
222
NOP();
223
I2C_SDA = 0;
224
NOP();
225
NOP();
226
NOP();
227
NOP();
228
I2C_SCL = 0;
229
230
return;
231
}
232
233
234
235
236
237
static void I2C_stop() {
238
239
I2C_SDA = 0;
240
I2C_SDA_TRIS = 0;
241
I2C_SCL = 1;
242
NOP();
243
NOP();
244
NOP();
245
NOP();
246
I2C_SDA = 1;
247
248
return;
249
}
250
251
252
253
254
255
static void I2C_send(unsigned char send_data) {
256
unsigned char i2c_data,i;
257
258
I2C_SDA_TRIS = 0;
259
260
i2c_data = send_data;
261
for (i=8 ; i>0 ; i--) {
262
263
if (i2c_data & 0x80) {
264
I2C_SDA = 1;
265
} else {
266
I2C_SDA = 0;
267
}
268
i2c_data = i2c_data << 1;
269
270
I2C_SCL = 1;
271
NOP();
272
NOP();
273
NOP();
274
NOP();
275
I2C_SCL = 0;
276
}
277
I2C_SDA_TRIS = 1;
278
279
return;
280
}
281
282
283
284
285
286
static unsigned char I2C_ackchk() {
287
288
unsigned char i2c_data;
289
290
I2C_SCL = 1;
291
NOP();
292
NOP();
293
I2C_SCL = 0;
294
NOP();
295
NOP();
296
i2c_data = PORTB & 0x02;
297
298
return(i2c_data);
299
300
301
302
303
304
305
306
307
308
}
309
310
311
312
313
314
static void wait_ms(unsigned int ms) {
315
unsigned int c;
316
for (c=ms ; c>0 ; c--) {
317
wait_1ms();
318
}
319
return;
320
}
321
322
323
324
325
326
static unsigned char I2C_rcv() {
327
unsigned char i2c_data,i;
328
329
I2C_SDA_TRIS = 1;
330
for (i=8 ; i>0 ; i--) {
331
NOP();
332
I2C_SCL = 1;
333
i2c_data = i2c_data <<1;
334
if (PORTB & 0x02) {
335
i2c_data = i2c_data | 0x01;
336
} else {
337
i2c_data = i2c_data & 0xFE;
338
}
339
I2C_SCL = 0;
340
}
341
342
return(i2c_data);
343
}
344
345
346
347
static unsigned char I2C_rcv_char(unsigned char ee_p0 ,unsigned char addr1 ,unsigned char addr2) {
348
unsigned char c;
349
350
I2C_start();
351
I2C_send(LCD_ADDR | ee_p0);
352
if (I2C_ackchk()) {
353
354
}
355
I2C_send(addr1);
356
if (I2C_ackchk()) {
357
358
}
359
I2C_send(addr2);
360
if (I2C_ackchk()) {
361
362
}
363
364
I2C_start();
365
I2C_send(LCD_ADDR | ee_p0 | 0x01);
366
if (I2C_ackchk()) {
367
368
}
369
c = I2C_rcv();
370
I2C_nacksnd();
371
372
I2C_stop();
373
374
return(c);
375
}
376
377
378
379
static void I2C_acksnd() {
380
I2C_SDA = 0;
381
I2C_SDA_TRIS = 0;
382
NOP();
383
I2C_SCL = 1;
384
NOP();
385
NOP();
386
NOP();
387
NOP();
388
I2C_SCL = 0;
389
I2C_SDA_TRIS = 1;
390
391
return;
392
}
393
394
395
static void I2C_nacksnd() {
396
I2C_SDA = 1;
397
I2C_SDA_TRIS = 0;
398
I2C_SCL = 1;
399
NOP();
400
I2C_SCL = 0;
401
NOP();
402
I2C_SDA_TRIS = 1;
403
404
return;
405
}
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
static void wait_50us() {
424
unsigned char i;
425
426
for (i=32 ; i>0 ; i--) {}
427
return;
428
}
429
430
431
static void wait_1ms() {
432
unsigned char i;
433
434
for (i=179 ; i>0 ; i--) {
435
NOP();
436
NOP();
437
NOP();
438
}
439
return;
440
}
441
442