Skin:
[NORMAL]
[BLUE] [DOS] [LIGHT]  / コピーするための表示 / 実行
このファイル: /home/web6047/www/cgi-bin/prj/20190901-DRAMを理解してプログラミングに強くなろう/20200411-adr2bit8_pic.X/newmain - snapshot 20200412.c
1 //D:\home\dk\www\cgi-bin\prj\20190901-DRAMを理解してプログラミングに強くなろう\
2 //20200411-adr2bit8_pic.X\newmain.c
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <libpic30.h>
7 #include <p24HJ32GP202.h>
8
9
10 //PIC24特有の設定
11 _FBS( BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF )
12 _FGS( GSS_OFF & GWRP_OFF )
13 _FOSCSEL( IESO_ON & FNOSC_FRC )
14 //_FOSC( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_ON & POSCMD_EC )
15 _FOSC( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_ON & POSCMD_NONE )
16 _FWDT( FWDTEN_OFF & WINDIS_OFF & WDTPRE_PR32 & WDTPOST_PS1 )
17 _FPOR( ALTI2C_ON & FPWRT_PWR32 )
18 _FICD( JTAGEN_OFF & ICS_PGD1 )
19 //FOSCSELで内部FRCを → 選んでいる(動作周波数 7.37 MHz)
20
21
22 //ALTI2C_ON (bit=0) is I2C mapped to ASDA1/ASCL1 pins
23 //ALTI2C_OFF (bit=1) is I2C mapped to SDA1/SCL1 pins
24
25 //---LCD
26 void blankloop( unsigned long num ) {//
27 for( ; num > 0; num-- ) {}
28 }
29 void tell( int num ) {//
30 unsigned long i;
31 int j;
32 for( i = 0; i < 300000; i++ );
33 for( j = 0; j < num; j++ ) {
34 LATBbits.LATB1 = 1;
35 for( i = 0; i < 100000; i++ );
36 LATBbits.LATB1 = 0;
37 for( i = 0; i < 100000; i++ );
38 }
39 }
40 void setI2C( unsigned char databyte ) {
41 //PDF セクション19. I2C(Inter-Integrated Circuit)
42 //19.5 シングルマスタ環境でマスタとして通信する
43
44 //1. SDAx と SCLx で START 条件を生成する
45 I2C1CONbits.SEN = 1;
46 while( I2C1CONbits.SEN ) {};
47
48 //2. 書き込み指示を含むI2C デバイスアドレスバイトをスレーブへ送信する
49 I2C1TRN = 0x7c; //(液晶仕様:スレーブアドレスは、0x7Cです)
50
51 //3. スレーブからの肯定応答を待機/ 確認する
52 while( I2C1STATbits.TBF ) {}
53 while( I2C1STATbits.TRSTAT ) {}
54 if( I2C1STATbits.ACKSTAT ) {
55 //1 = スレーブからNACK を受信した
56 }
57
58 //4. (液晶仕様:コントロール部)をスレーブへ送信する
59
60 I2C1TRN = 0b00000000; //液晶仕様:コマンド送信時 RS=0
61
62 //5. スレーブからの肯定応答を待機/ 確認する
63 while( I2C1STATbits.TBF ) {}
64 while( I2C1STATbits.TRSTAT ) {}
65 if( I2C1STATbits.ACKSTAT ) {
66 //1 = スレーブからNACK を受信した
67 }
68
69 //6. (液晶仕様:データ部)をスレーブへ送信する
70 I2C1TRN = databyte;
71
72 //7. スレーブからの肯定応答を待機/ 確認する
73 while( I2C1STATbits.TBF ) {}
74 while( I2C1STATbits.TRSTAT ) {}
75 if( I2C1STATbits.ACKSTAT ) {
76 //1 = スレーブからNACK を受信した
77 }
78
79 //13. SDAx とSCLx でSTOP 条件を生成する
80 while( I2C1CON & 0b0000000000011111 != 0 ) {}
81 I2C1CONbits.PEN = 1;
82 while( I2C1CONbits.PEN ) {};
83 }
84 void startI2C() {
85 I2C1CONbits.SEN = 1; //SDAxおよびSCLxピンでSTART条件を開始する
86 while( I2C1CONbits.SEN ) {};
87
88 blankloop( 60000 );
89 I2C1TRN = 0x7c;
90 while( I2C1STATbits.TBF ) {}
91 if( I2C1STATbits.ACKSTAT ) {
92 //1 = スレーブからNACK を受信した
93 }
94 }
95 void sendI2C( d ) {
96 // f2();
97 I2C1TRN = 0b11000000;
98 while( I2C1STATbits.TBF ) {}
99 while( I2C1STATbits.TRSTAT ) {}
100 if( I2C1STATbits.ACKSTAT ) {
101 //1 = スレーブからNACK を受信した
102 }
103
104 I2C1TRN = d;
105 while( I2C1STATbits.TBF ) {}
106 while( I2C1STATbits.TRSTAT ) {}
107 if( I2C1STATbits.ACKSTAT ) {
108 //1 = スレーブからNACK を受信した
109 }
110 }
111 void stopI2C() {
112 while( I2C1CON & 0b0000000000011111 != 0 ) {}
113 I2C1CONbits.PEN = 1;
114 while( I2C1CONbits.PEN ) {};
115 }
116 void lcdStr( char *str ) {
117 startI2C();
118 while( *str != '\0' ) {
119 sendI2C( *str );
120 str++;
121 }
122 stopI2C();
123 }
124 void lcdNum( int num ) {
125 char str[ 8 ];
126 snprintf( str, 8, "%d", num ); //数値を文字列に変換
127 lcdStr( str );
128 }
129 void lcdLocate( unsigned char x, unsigned char y ) {
130 setI2C( 0b10000000 + y * 0x40 + x );
131 }
132 void lcdClr() {
133 setI2C( 0x01 );//clear disp
134 }
135 //---/LCD
136
137 //一定時間待つ
138 void delay( unsigned long int num ) {
139 unsigned long int i;
140 for( i = 0; i < num; i++ );
141 }
142
143 /*
144 //指定回数LEDを点滅する。
145 void tell( int num ) {
146 int i;
147 delay( 50000 ); //間を置いて
148 for( i = 0; i < num; i++ ) {
149 LATBbits.LATB6 = 1;
150 delay( 100000 );
151 LATBbits.LATB6 = 0;
152 delay( 100000 );
153 }
154 delay( 50000 ); //間を置いて
155 }
156 */
157
158 //一定時間LEDを点灯する。(チカーッ)
159 void space() {
160 delay( 50000 ); //間を置いて
161 LATBbits.LATB6 = 1;
162 delay( 400000 );
163 LATBbits.LATB6 = 0;
164 delay( 50000 ); //間を置いて
165 }
166
167 int main(int argc, char** argv) {
168 int r1b1=0, r1b2=0, r1b3=0, r1b4=0, r1b5=0, r1b6=0, r1b7=0, r1b8=0; //アドレス1の各ビットの読み込み結果を収める変数
169 int r2b1=0, r2b2=0, r2b3=0, r2b4=0, r2b5=0, r2b6=0, r2b7=0, r2b8=0; //アドレス2の各ビットの読み込み結果を収める変数
170 int r1, r2; //各アドレスの値(10進)を収める変数
171
172
173
174 //100 CLO :' ピン ショキカ
175
176 //PIC24特有の設定 ------------------------------
177 //___CBA9___543210
178 AD1PCFGL = 0b0001111000111111; //アナログ:0、デジタル:1
179 //ピン入出力設定 --------------------------------
180 //43210
181 TRISA = 0b11111; //出力:0、入力:1
182 //FEDCBA9876543210
183 TRISB = 0b0000000000000000; //出力:0、入力:1
184
185 //---I2C setting.
186 I2C1BRG = 8;//1156;
187 I2C1CONbits.I2CEN = 1; //I2Cx モジュールを有効にし、SDAx および SCLx ピンをシリアルポート ピンとして設定する
188
189 //液晶初期設定
190 setI2C( 0x38 );//norm func---------------
191 setI2C( 0x3d );//ext. func---------------
192 setI2C( 0x1d );//osc freq
193 setI2C( 0x56 );//power/icon/contrast
194 setI2C( 0x6b );//follower ctr***
195 setI2C( 0x70 );//contrast
196 setI2C( 0x39 );//norm func---------------
197 setI2C( 0x0f );//disp on/off
198 lcdClr();
199
200 lcdStr( %%dquote1%% );
201 lcdLocate( 0, 1 );
202 lcdStr( %%dquote2%% );
203 delay( 500000 );
204 delay( 500000 );
205 //---/I2C setting.
206
207 //コンデンサ1uF時、コンデンサ10uF時 両対応の時間設定 (※未検証)
208 unsigned int writetime = 5000; //これくらい時間をかければ過去の情報を上書きできる。
209 unsigned int readtime = 0; //delay関数を呼んで帰ってくる程度の待ち時間が必要という意味。
210
211 //20 'ニシン10ヲ アドレス1ニ カキコミ
212 TRISBbits.TRISB8 = 0; //(ピンを「出力」に設定)
213 TRISBbits.TRISB9 = 0; //(ピンを「出力」に設定)
214 TRISBbits.TRISB10 = 0; //(ピンを「出力」に設定)
215 TRISBbits.TRISB11 = 0; //(ピンを「出力」に設定)
216 TRISAbits.TRISA0 = 0; //(ピンを「出力」に設定)
217 TRISAbits.TRISA1 = 0; //(ピンを「出力」に設定)
218 TRISAbits.TRISA2 = 0; //(ピンを「出力」に設定)
219 TRISAbits.TRISA3 = 0; //(ピンを「出力」に設定)
220 LATBbits.LATB8 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
221 LATBbits.LATB9 = 1; //40 OUT 2,1 :'シュツリョクセッテイ (ピンに3Vを出力)
222 LATBbits.LATB10 = 0; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
223 LATBbits.LATB11 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
224 LATAbits.LATA0 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
225 LATAbits.LATA1 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
226 LATAbits.LATA2 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
227 LATAbits.LATA3 = 0; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
228 //"123"
229
230 LATBbits.LATB2 = 1; //50 OUT 7,1 :'トランジスタ オン
231 delay( writetime ); //60 WAIT 10 :'カキコミ
232 LATBbits.LATB2 = 0; //70 OUT 7,0 :'トランジスタ オフ
233
234 //80 'ニシン01ヲ アドレス2ニ カキコミ
235 TRISBbits.TRISB8 = 0; //(ピンを「出力」に設定)
236 TRISBbits.TRISB9 = 0; //(ピンを「出力」に設定)
237 TRISBbits.TRISB10 = 0; //(ピンを「出力」に設定)
238 TRISBbits.TRISB11 = 0; //(ピンを「出力」に設定)
239 TRISAbits.TRISA0 = 0; //(ピンを「出力」に設定)
240 TRISAbits.TRISA1 = 0; //(ピンを「出力」に設定)
241 TRISAbits.TRISA2 = 0; //(ピンを「出力」に設定)
242 TRISAbits.TRISA3 = 0; //(ピンを「出力」に設定)
243 LATBbits.LATB8 = 0; //90 OUT 1,1 :'シュツリョクセッテイ (ピンに3Vを出力)
244 LATBbits.LATB9 = 1; //100 OUT 2,0 :'シュツリョクセッテイ (ピンに0Vを出力)
245 LATBbits.LATB10 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
246 LATBbits.LATB11 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
247 LATAbits.LATA0 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
248 LATAbits.LATA1 = 0; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
249 LATAbits.LATA2 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
250 LATAbits.LATA3 = 1; //30 OUT 1,0 :'シュツリョクセッテイ (ピンに0Vを出力) 4
251 //"222"
252
253 LATBbits.LATB3 = 1; //110 OUT 11,1 :'トランジスタ オン
254 delay( writetime ); //120 WAIT 10 :'カキコミ
255 LATBbits.LATB3 = 0; //130 OUT 11,0 :'トランジスタ オフ
256
257 //140 'アドレス1ヲ ヨミコミ
258 TRISBbits.TRISB8 = 1; //150 OUT 1,-1 :'ニュウリョク セッテイ
259 TRISBbits.TRISB9 = 1; //160 OUT 2,-1 :'ニュウリョク セッテイ
260 TRISBbits.TRISB10 = 1; //(ピンを「出力」に設定)
261 TRISBbits.TRISB11 = 1; //(ピンを「出力」に設定)
262 TRISAbits.TRISA0 = 1; //(ピンを「出力」に設定)
263 TRISAbits.TRISA1 = 1; //(ピンを「出力」に設定)
264 TRISAbits.TRISA2 = 1; //(ピンを「出力」に設定)
265 TRISAbits.TRISA3 = 1; //(ピンを「出力」に設定)
266
267 LATBbits.LATB2 = 1; //170 OUT 7,1 :'トランジスタ オン
268 delay( readtime ); //(PIC24Hの場合は少し待つ必要がある)
269 r1b1 = PORTBbits.RB8; //180 ? IN(5) :'ニュウリョク ジッコウ
270 r1b2 = PORTBbits.RB9; //190 ? IN(5) :'ニュウリョク ジッコウ
271 r1b3 = PORTBbits.RB10; //190 ? IN(5) :'ニュウリョク ジッコウ
272 r1b4 = PORTBbits.RB11; //190 ? IN(5) :'ニュウリョク ジッコウ
273 r1b5 = PORTAbits.RA0; //190 ? IN(5) :'ニュウリョク ジッコウ
274 r1b6 = PORTAbits.RA1; //190 ? IN(5) :'ニュウリョク ジッコウ
275 r1b7 = PORTAbits.RA2; //190 ? IN(5) :'ニュウリョク ジッコウ
276 r1b8 = PORTAbits.RA3; //190 ? IN(5) :'ニュウリョク ジッコウ
277 LATBbits.LATB2 = 0; //200 OUT 7,0 :'トランジスタ オフ
278
279 //210 'アドレス2ヲ ヨミコミ
280 TRISBbits.TRISB8 = 1; //220 OUT 1,-1 :'ニュウリョク セッテイ
281 TRISBbits.TRISB9 = 1; //230 OUT 2,-1 :'ニュウリョク セッテイ
282 TRISBbits.TRISB10 = 1; //(ピンを「出力」に設定)
283 TRISBbits.TRISB11 = 1; //(ピンを「出力」に設定)
284 TRISAbits.TRISA0 = 1; //(ピンを「出力」に設定)
285 TRISAbits.TRISA1 = 1; //(ピンを「出力」に設定)
286 TRISAbits.TRISA2 = 1; //(ピンを「出力」に設定)
287 TRISAbits.TRISA3 = 1; //(ピンを「出力」に設定)
288
289 LATBbits.LATB3 = 1; //240 OUT 11,1 :'トランジスタ オン
290 delay( readtime ); //(PIC24Hの場合は少し待つ必要がある)
291 r2b1 = PORTBbits.RB8; //250 ? IN(5) :'ニュウリョク ジッコウ
292 r2b2 = PORTBbits.RB9; //260 ? IN(6) :'ニュウリョク ジッコウ
293 r2b3 = PORTBbits.RB10; //190 ? IN(5) :'ニュウリョク ジッコウ
294 r2b4 = PORTBbits.RB11; //190 ? IN(5) :'ニュウリョク ジッコウ
295 r2b5 = PORTAbits.RA0; //190 ? IN(5) :'ニュウリョク ジッコウ
296 r2b6 = PORTAbits.RA1; //190 ? IN(5) :'ニュウリョク ジッコウ
297 r2b7 = PORTAbits.RA2; //190 ? IN(5) :'ニュウリョク ジッコウ
298 r2b8 = PORTAbits.RA3; //190 ? IN(5) :'ニュウリョク ジッコウ
299 LATBbits.LATB3 = 0; //160 OUT 11,0 :'トランジスタ オフ
300
301 //280 '0,1,1,0 ト ヒョウジサレマス
302 r1 = r1b8 * 128 + r1b7 * 64 + r1b6 * 32 + r1b5 * 16 + r1b4 * 8 + r1b3 * 4 + r1b2 * 2 + r1b1;
303 r2 = r2b8 * 128 + r2b7 * 64 + r2b6 * 32 + r2b5 * 16 + r2b4 * 8 + r2b3 * 4 + r2b2 * 2 + r2b1;
304
305 lcdClr();
306 lcdLocate( 0, 0 );
307 lcdNum( r1 ); //アドレス1は2進で「10」、10進で「2」なので、2回点滅する。チカッチカッ
308
309 lcdLocate( 0, 1 );
310 lcdNum( r2 ); //アドレス2は2進で「01」、10進で「1」なので、1回点滅する。チカッ
311
312 //終了
313
314
315 //緑のボタンを押すとLED点灯
316 while( 1 ) {
317 //LED
318 if( PORTAbits.RA4 == 1 ) {
319 LATBbits.LATB6 = 1;
320 } else {
321 LATBbits.LATB6 = 0;
322 }
323 }
324
325 return (EXIT_SUCCESS);
326 }