OSDN Git Service

[LCD] Change IOPORT RC2 TO RC1 (PWM1 to PWM2) issue of ECCP, P1B-P1D is synced with...
[openi2cradio/OpenI2CRadio.git] / ioports.c
1 /*
2  * OpenI2CRADIO
3  * I/O Port Handler
4  * Copyright (C) 2013-06-20 K.Ohta <whatisthis.sowhat ai gmail.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2,
9  *  or (at your option) any later version.
10  *  This library / program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *  See the GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this library; see the file COPYING. If not, write to the
17  *  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
18  *  MA 02110-1301, USA.
19  *
20  *  As a special exception, if you link this(includeed from sdcc) library
21  *  with other files, some of which are compiled with SDCC,
22  *  to produce an executable, this library does not by itself cause
23  *  the resulting executable to be covered by the GNU General Public License.
24  *  This exception does not however invalidate any other reasons why
25  *  the executable file might be covered by the GNU General Public License.
26  */
27 #include "commondef.h"
28 #include "ioports.h"
29 #include <signal.h>
30
31 unsigned char statecount;
32
33 void set_amfmlamp(unsigned char f)
34 {
35     if(f == 0x00) {
36         _AM_STATLAMP = 0;
37         _FM_STATLAMP = 1;
38     } else {
39         _AM_STATLAMP = 1;
40         _FM_STATLAMP = 0;
41     }
42 }
43
44
45 void set_examp_mute(unsigned char f)
46 {
47     if(f == 0x00) {
48         _PORT_MUTE = 0; // Not Mute
49     } else {
50         _PORT_MUTE = 1;
51     }
52 }
53
54 void set_radiopower(unsigned char f)
55 {
56     if(f == 0x00) {
57         _PORT_RADIOPOW = 0; // OFF
58     } else {
59         _PORT_RADIOPOW = 1; // ON
60     }
61 }
62
63 void set_powerlamp(unsigned char f)
64 {
65     if(f == 0x00) {
66         _POW_STATLAMP = 0;
67     } else {
68         _POW_STATLAMP = 1;
69     }
70 }
71
72 void lcd_setbacklight(unsigned char flag, unsigned char level)
73 {
74     __bitops_t  b;
75     __bitops_t d;
76 #if 0
77     d.byte = _LCD_BACKLIGHT_TRIS;
78     d._LCD_BACKLIGHT_BIT = 0;
79    _LCD_BACKLIGHT_TRIS = d.byte;
80
81     b.byte = _LCD_BACKLIGHT;
82     b._LCD_BACKLIGHT_BIT = 0;
83     if(flag != 0){
84        b._LCD_BACKLIGHT_BIT = 1;
85     }
86     _LCD_BACKLIGHT = b.byte;
87 #else
88     if(flag == 0) {
89         d.byte = _LCD_BACKLIGHT_TRIS;
90         d._LCD_BACKLIGHT_BIT = 1;
91         _LCD_BACKLIGHT_TRIS = d.byte;
92         PSTRCONbits.STRA = 0;
93         T2CONbits.TMR2ON = 0;
94         TMR2 = 0x00;
95         CCP2CON = 0x00;
96         CCPR2L = 0;
97         CCPR2H = 0;
98     } else {
99       unsigned char h,l;
100 //      lv = level;
101 //      lv <<= 2;
102 //      level = (level * 25) / 10;
103 //      level = 255;
104       h = level >> 1;
105       if(h == CCPR1L) return;
106  //     l = 2 << 4; //(lv & 0x0300) >> 4;
107       d.byte = _LCD_BACKLIGHT_TRIS;
108       d._LCD_BACKLIGHT_BIT = 1;
109       _LCD_BACKLIGHT_TRIS = d.byte;
110       //PSTRCON = 0;
111       CCPR2L = h;
112       CCPR2H = h;
113       b.b2 = 1;
114       b.b3 = 1;
115       CCP2CON = b.byte;
116       PR2 = 50;
117       PIR1bits.TMR2IF = 0;
118       T2CON = 0b01111000; // Pre-scaler=1/1,Post-scaler = 1/16
119       // -> Freq = 2.44KHz * 16 = 39.4KHz.
120       TMR2 = 0x00;
121       T2CONbits.TMR2ON = 1;
122       do {
123           idle_time_ms(1);
124       } while(PIR1bits.TMR2IF ==0);
125       d.byte = _LCD_BACKLIGHT_TRIS;
126       d._LCD_BACKLIGHT_BIT = 0;
127       _LCD_BACKLIGHT_TRIS = d.byte;
128
129 //      _LCD_PORT |= _LCD_BACKLIGHT;
130     }
131 #endif
132 }
133
134 void TMR3_set(void)
135 {
136     TMR3L = 1000 & 0xff;
137     TMR3H = 1000 >> 8;
138     T3CONbits.TMR3ON = 1;
139 }
140
141 void io_intcountinit(void)
142 {
143     statecount = 0;
144     T3CON = 0b10001100; // TMR3 = 16bit, CCP is not use TMR3, Prescaler=1:2(1uS)
145                         // DO-not-use SYNC, Internal clock, TMR3 temporally off.
146     PIR2bits.TMR3IF = 0;
147     PIE2bits.TMR3IE = 1;
148     IPR2bits.TMR3IP = 0; // Low priority.
149     INTCONbits.PEIE = 1;
150     RCONbits.IPEN = 0;
151     TMR3L = 0;
152     TMR3H = 0;
153     TMR3_set();
154 }
155
156 void lcd_backlightinit(void)
157 {
158 #if 0
159     PSTRCON = 0b00000001; // P1A = PWM, P1B~P1D=PORT, Steeling sync to PWM.
160     CCP1CON = 0b00001100; // PWM, Low-Active.
161     ECCP1AS = 0b10000111; // Auto shutdown is disabled
162     // Use TMR2 as source.
163     PIE1   &= ~0b00000010; // TMR2 Interrupt disabled.
164     PIR1   &= ~0b00000010; // TMR2 Interrupt clear.
165     IPR1   &= ~0b00000010; // Priority = LOW
166     T2CON   = 0b00000011; // Prescaler/Postscaler = 1:1, Temporally disabled TMR2.
167     TMR2 = 0x00; // Value;
168     PR2 = 0x65; // 19.61KHz
169     CCPR1L = 100; // Duty = 100;
170 #endif
171 }
172
173
174 #if defined(pic18f23k22) || defined(pic18f24k22) || defined(pic18f25k22) || defined(pic18f26k22)
175 /*
176  * For 28Pin PIC(18F2xK22), I2C lcd using.
177  */
178
179 void keyin_ioinit(void)
180 {
181     /* Initialize IOPORTS*/
182     PORTA = 0x00;
183     LATA = 0x00;
184     ANSELA = AN_A_VAL;
185     TRISA = TRIS_A_VAL;
186
187     PORTB = 0x00;
188     LATB = 0x00;
189     ANSELB = AN_B_VAL;
190     TRISB = TRIS_B_VAL;
191
192     PORTC = 0x00;
193     LATC = 0x00;
194     ANSELC = AN_C_VAL;
195     TRISC = TRIS_C_VAL_O;
196     lcd_backlightinit();
197     io_intcountinit();
198 }
199 #endif
200
201 #if defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20)
202 /*
203  * For 28Pin PIC(18F2xK20), I2C lcd using.
204  */
205
206 void keyin_ioinit(void)
207 {
208     /* Initialize IOPORTS*/
209     PORTA = 0x00;
210     LATA = 0x00;
211     ANSEL = 0x01; // Use RA0 AS ADC, Another is not used.
212     ANSELH = 0x00; //
213     TRISA = TRIS_A_VAL;
214
215     PORTB = 0x00;
216     LATB = 0x00;
217     TRISB = TRIS_B_VAL;
218
219     PORTC = 0x00;
220     LATC = 0x00;
221     TRISC = TRIS_C_VAL_O;
222     lcd_backlightinit();
223     io_intcountinit();
224 }
225 #endif
226
227 #if defined(pic18f43k20) || defined(pic18f44k20) || defined(pic18f45k20) || defined(pic18f46k20)
228 /*
229  * For 40Pin PIC(18F4xK20), paralell or I2C lcd using.
230  */
231 void keyin_ioinit(void)
232 {
233     /* Initialize IOPORTS*/
234     PORTA = 0x00;
235     LATA = 0x00;
236     ANSEL = 0x80; // Use RA7 AS ADC, Another is not used.
237     ANSELH = 0x00; //
238     TRISA = TRIS_A_VAL;
239
240     PORTB = 0x00;
241     LATB = 0x00;
242     TRISB = TRIS_B_VAL;
243
244     PORTC = 0x00;
245     LATC = 0x00;
246     TRISC = TRIS_C_VAL_O;
247
248     /*
249      * You can use PORTD,RE0-RE2 extention, when using I2C lcd.
250      */
251     PORTD = 0x00;
252     LATD = 0x00;
253     TRISD = TRIS_D_VAL;
254
255     TRISE = TRIS_E_VAL;
256     PORTE = 0b00000000; // Mute OK
257
258     // Interrupts
259     INTCONbits.INT0IE = 0;
260     INTCONbits.INT0IF = 0;
261     INTCON3bits.INT1IF = 0;
262     INTCON3bits.INT2IF = 0;
263     INTCON3bits.INT1IE = 0;
264     INTCON3bits.INT2IE = 0;
265
266     lcd_backlightinit();
267     io_intcountinit();
268 }
269 #else
270 void keyin_ioinit(void)
271 {
272     /* Initialize IOPORTS*/
273     PORTA = 0x00;
274     LATA = 0x00;
275 //    ANSEL = 0x01; // Use RA0 AS ADC, Another is not used.
276 //    ANSELH = 0x00; //
277     TRISA = TRIS_A_VAL;
278
279     PORTB = 0x00;
280     LATB = 0x00;
281     TRISB = TRIS_B_VAL;
282
283     PORTC = 0x00;
284     LATC = 0x00;
285     TRISC = TRIS_C_VAL_O;
286     lcd_backlightinit();
287     io_intcountinit();
288 }
289 #endif
290
291 /*
292  * Read IOPORTS for KEY. You should modify if you modify circuit.
293  */
294 void readkey_io(unsigned char state)
295 {
296     char i;
297     __bitops_t portvar;
298  
299     switch(state) {
300         case 0:
301             for(i = 0; i < 2; i++){
302                 keyin_old[1].byte[i] = keyin_old[0].byte[i];
303                 keyin_old[0].byte[i] = keyin_now.byte[i];
304                 keyin_now.byte[i] = 0x00;
305             }
306             _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN.
307             break;
308         case 1:
309             _KEY_SEND_GRP1 = 0; // Group1 DOWN.
310             break;
311         case 2:
312             portvar.byte = _KEY_RECVPORT;
313             if(!_KEY_POS1MASK(portvar)) {
314                 keyin_now.BIT0A = 1;
315             }
316             if(!_KEY_POS2MASK(portvar)) {
317                 keyin_now.BIT1A = 1;
318             }
319             if(!_KEY_POS3MASK(portvar)) {
320                 keyin_now.BIT2A = 1;
321             }
322             if(!_KEY_POS4MASK(portvar)) {
323                 keyin_now.BIT3A = 1;
324             }
325             _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN.
326             break;
327         case 3:
328             _KEY_SEND_GRP2 = 0; // Group2 DOWN.
329             break;
330         case 4:
331             portvar.byte = _KEY_RECVPORT;
332             if(!_KEY_POS1MASK(portvar)) {
333                 keyin_now.BIT0B = 1;
334             }
335             if(!_KEY_POS2MASK(portvar)) {
336                 keyin_now.BIT1B = 1;
337             }
338             if(!_KEY_POS3MASK(portvar)) {
339                 keyin_now.BIT2B = 1;
340             }
341             if(!_KEY_POS4MASK(portvar)) {
342                 keyin_now.BIT3B = 1;
343             }
344             _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN.
345             break;
346         case 5:
347             _KEY_SEND_GRP3 = 0; // Group1 DOWN.
348             break;
349         case 6:
350             portvar.byte = _KEY_RECVPORT;
351             if(!_KEY_POS1MASK(portvar)) {
352                 keyin_now.BIT0C = 1;
353             }
354             if(!_KEY_POS2MASK(portvar)) {
355                 keyin_now.BIT1C = 1;
356             }
357             if(!_KEY_POS3MASK(portvar)) {
358                 keyin_now.BIT2C = 1;
359             }
360             if(!_KEY_POS4MASK(portvar)) {
361                 keyin_now.BIT3C = 1;
362             }
363             _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN.
364             break;
365         case 7:
366             _KEY_SEND_GRP4 = 0; // Group4 up
367             break;
368         case 8:
369             portvar.byte = _KEY_RECVPORT;
370             if(!_KEY_POS1MASK(portvar)) {
371                 keyin_now.BIT0D = 1;
372             }
373             if(!_KEY_POS2MASK(portvar)) {
374                 keyin_now.BIT1D = 1;
375             }
376             if(!_KEY_POS3MASK(portvar)) {
377                 keyin_now.BIT2D = 1;
378             }
379             if(!_KEY_POS4MASK(portvar)) {
380                 keyin_now.BIT3D = 1;
381             }
382             _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN.
383             break;
384         default:
385             break;
386     }
387 }