//****************************************************************************************** // dsPIC33FJ256GP710 Sample Program // Project : // Program Name : // Programer : // Create date : Version 1.0 H25.09.23 // History : // Laungage : MPLAB C30 //****************************************************************************************** // Description // 1.OSC 80MHz (10MHz[Crystal]/2*32/2) // 2.I/O Port // (1)Grafic LCD Control Port // PORTD(0-7) : SG12864A(DB0-DB7) // PORTD(8) : SG12864A(D/I) // PORTD(9) : SG12864A(R/W) // PORTD(10) : SG12864A(E) // PORTD(11) : SG12864A(CS1) // PORTD(12) : SG12864A(CS2) // PORTD(13) : SG12864A(RES) // //****************************************************************************************** #include "string.h" #include "stdio.h" #include "ctype.h" #include "math.h" #include "stdlib.h" #include "time.h" #include "p33FJ256GP710.h" //_FOSCSEL(FNOSC_FRC & IESO_OFF); //Fast RC oscillator //_FOSCSEL(FNOSC_FRCPLL & IESO_OFF); //Fast RC oscillator w/ divide and PLL _FOSCSEL(FNOSC_PRIPLL & IESO_OFF); //Primary oscillator (XT, HS, EC) w/ PLL //_FOSC(FCKSM_CSECMD & OSCIOFNC_ON & POSCMD_NONE ); //OSC2 Pin:Digital I/O, Primary disabled(Internal OSC) _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT ); //OSC2 Pin:OSC2 is clock O/P, XT oscillator(3-10MHz) _FWDT(FWDTEN_OFF); // Parameter #define PI_P_DI 8 #define PI_P_RW 9 #define PI_P_E 10 #define PI_P_CS1 11 #define PI_P_CS2 12 #define PI_P_RES 13 // #define PI_NORMAL 0 #define PI_FAILER 1 #define PI_LINE 10 #define PI_PAGE 11 #define PI_FUR 12 #define PI_SEC 13 #define PI_LCD_FUR 14 #define PI_LCD_SEC 15 #define PI_SOLID_LINE 20 #define PI_DOTTED_LINE 21 #define PI_GAMEOVER 22 #define PI_WIN 23 #define PI_RIGHT 24 #define PI_LEFT 25 #define PI_EOF 99 // #define PI_YMEM_MIN 5 #define PI_LCD_X_MAX 128 #define PI_LCD_Y_MAX 8 // PI_LCD_Y_MAX * 8(bits) => 64 #define PI_LCD_CHAR_X_MAX 20 #define PI_LCD_CHAR_Y_MAX 7 #define PI_INVADER_APPR 5 // #define PI_JOY_UP 0b00000010 #define PI_JOY_DOWN 0b00000001 #define PI_JOY_RIGHT 0b00001000 #define PI_JOY_LEFT 0b00000100 //#define PI_JOYPOS_X_MAX 20 //#define PI_JOYPOS_X_MIN 0 //#define PI_JOYPOS_Y_MAX 7 //#define PI_JOYPOS_Y_MIN 0 #define PI_JOYPOS_X_MAX 19 #define PI_JOYPOS_X_MIN 1 #define PI_JOYPOS_Y_MAX 6 #define PI_JOYPOS_Y_MIN 1 #define PI_INVPOS_X_MAX 19 #define PI_INVPOS_X_MIN 1 #define PI_INVPOS_Y_MAX 6 #define PI_INVPOS_Y_MIN 1 #define PI_INV_NUM_MAX 50 #define PI_HUMAN_CHAR_R 0x97 #define PI_HUMAN_CHAR_L 0x96 #define PI_INVADER_CHAR 0x98 #define PI_BLOCK_CHAR 0x99 #define PI_BALL_CHAR 0x95 // #define PI_RAND_LOOP (unsigned long)10000 #define PI_SWITCH_1 1 #define PI_SWITCH_2 2 #define PI_SWITCH_3 3 #define PI_SWITCH_ON 4 #define PI_SWITCH_OFF 5 #define PI_INV_LIVE 1 #define PI_INV_DEAD 2 #define PI_INV_UNDEF 3 // // Define function void Screen01(void); void Init_LCD(void); void LCD_clear(void); char GRF_LINE(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char); char LINE(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char); char PSET(unsigned char, unsigned char, unsigned char); void LCD_read(unsigned char, unsigned char, unsigned char, unsigned char *, unsigned char); void LCD_read_buff(unsigned char, unsigned char, unsigned char, unsigned char *, unsigned char); char Put_LCD_char(unsigned char, unsigned char, unsigned char, unsigned char); char Set_fnt(unsigned char *, unsigned char); void LCD_dsp(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char); void LCD_dsp_buff(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char); void LCD_write_buff(void); void LCD_MOVF_DB(unsigned char); void LCD_ENSIG(void); void LCD_ENSIG_R(void); void LCD_BCF(unsigned char); void LCD_BSF(unsigned char); void LCD_WRTRS_DB(void); void LCD_RDTRS_DB(void); void LCD_RED_DB(unsigned char *); void NopN(unsigned int); void InitUART(void); void Timer(unsigned int); void SendUART(char); void SendUARTStr(char *); void RecUART(char *); void Init_ADC_AN0(void); void Init_ADC_AN1(void); void GetADC(unsigned int *); unsigned char Get_Jstick(void); void Set_human(unsigned char *, unsigned char *); unsigned char Set_Invader(unsigned char *, unsigned char *, unsigned char, unsigned char, unsigned char); unsigned char Get_char_pos(void); unsigned char Get_rand(void); void Game_over(void); void Game_win(void); unsigned char Check_Switch(unsigned char); void Set_bullet(unsigned char, unsigned char, unsigned char *, unsigned char *, unsigned char *, unsigned char *,unsigned char *); void Select_stage(void); void Put_stage_no(void); void Put_botton_msg(void); volatile unsigned char G_PAGE=0; volatile unsigned char G_CLM=0; volatile unsigned char G_LCD_BUFFER[PI_LCD_X_MAX][PI_LCD_Y_MAX]; volatile unsigned char G_LCD_CHAR_BUFFER[PI_LCD_CHAR_X_MAX][PI_LCD_CHAR_Y_MAX]; volatile unsigned char G_rand_counter=0; volatile unsigned char G_inv_num =5; //Defines the number of invader volatile unsigned char G_human_dir =PI_RIGHT; volatile unsigned char G_dum_dir =PI_RIGHT; volatile unsigned char G_game_stage =1; int main(void) { unsigned char joy_pos_x ; unsigned char joy_pos_y ; unsigned char inv1_pos_x[PI_INV_NUM_MAX]; unsigned char inv1_pos_y[PI_INV_NUM_MAX]; unsigned char inv1_pos_status[PI_INV_NUM_MAX]; unsigned char lp; unsigned char game_status; unsigned char status; unsigned char ball_pos_x ; unsigned char ball_pos_y ; // ******************* // 1.Initilize // ******************* // (0)Define OSC 80MHz(10MHz/2*32(M32)/2) CLKDIV = 0b0000000000000000; PLLFBD = 0x001E; //M32(M32-2=>0d30=>0x1E) Use FNOSC_PRIPLL(Crystal) // PLLFBD = 0x0029; //M43(M43-2=>0d41=>0x29) Use FNOSC_FRCPLL(Internal OSC) // (1)Set All Digital Port AD1PCFGL = 0xffff; AD1PCFGH = 0xffff; // (2)Define PORT // 1)PortB TRISB = 0xFFFF; // LATB = 0x0000; PORTB = 0x0000; // 2)PortD TRISD = 0xC000; // LATD = 0x0000; PORTD = 0x0000; // 3)PortE TRISE = 0xFFFF; // LATE = 0x0000; PORTE = 0x0000; // 4)PortF TRISF = 0xFFFF; // LATF = 0x0000; PORTF = 0x0000; // (3)Initilized A/D Converter Init_ADC_AN0(); // (4)Initialized LCD Init_LCD(); // ***************************** // 2.Program Main // ***************************** // ----------------- // A.Select statge // ----------------- Select_stage(); while(1){ // ----------------- // B.Start Game // ----------------- // (1)Clear LCD LCD_clear(); // (2)Drow the initial screen Screen01(); // (3)Initialize the position of the invader for(lp=0;lp=PI_INV_NUM_MAX)G_inv_num =PI_INV_NUM_MAX; G_human_dir = PI_RIGHT; G_dum_dir = PI_RIGHT; G_game_stage++; LCD_clear(); Put_stage_no(); Put_botton_msg(); LCD_write_buff(); Timer((unsigned int)10); // Wait 1[S] // *************** // 2.Wait // *************** while(1){ if((Check_Switch(PI_SWITCH_1)) == PI_SWITCH_ON) return; if((Check_Switch(PI_SWITCH_2)) == PI_SWITCH_ON) return; if((Check_Switch(PI_SWITCH_3)) == PI_SWITCH_ON) return; } } //****************************************************************************************** // Function Name : Game_over // Title : // Input : // Output : //****************************************************************************************** void Game_over(void) { // *************** // 1.Put message // *************** // (1)Put message Put_LCD_char('G', 7, 2, PI_LCD_SEC); Put_LCD_char('A', 7, 3, PI_LCD_SEC); Put_LCD_char('M', 7, 4, PI_LCD_SEC); Put_LCD_char('E', 7, 5, PI_LCD_SEC); Put_LCD_char(' ', 7, 6, PI_LCD_SEC); Put_LCD_char('O', 7, 7, PI_LCD_SEC); Put_LCD_char('V', 7, 8, PI_LCD_SEC); Put_LCD_char('E', 7, 9, PI_LCD_SEC); Put_LCD_char('R', 7, 10, PI_LCD_SEC); LCD_write_buff(); Timer((unsigned int)10); // Wait 1[S] // (2)Default value G_inv_num = 5; //Defines the number of invader G_human_dir = PI_RIGHT; G_dum_dir = PI_RIGHT; G_game_stage = 1; // *************** // 2.Wait // *************** while(1){ if((Check_Switch(PI_SWITCH_1)) == PI_SWITCH_ON) return; if((Check_Switch(PI_SWITCH_2)) == PI_SWITCH_ON) return; if((Check_Switch(PI_SWITCH_3)) == PI_SWITCH_ON) return; } } //****************************************************************************************** // Function Name : Set_Invader // Title : // Input : // Output : //****************************************************************************************** unsigned char Set_Invader(unsigned char *pos_x, unsigned char *pos_y, unsigned char sur_flag, unsigned char pos_h_x, unsigned char pos_h_y) { unsigned char status; unsigned char rand_status; unsigned char tmp_x,tmp_y; // ***************** // 1.Initialize // ***************** tmp_x = *pos_x; tmp_y = *pos_y; Put_LCD_char(' ', *pos_y, *pos_x, PI_LCD_FUR); // ***************** // 2.Program // ***************** // (1)Get direction // 1-A)Get direction from the human position status = Get_rand(); status = status % PI_INVADER_APPR; if(status == 0){ if(pos_h_x < *pos_x) rand_status = PI_JOY_LEFT; else if(pos_h_x == *pos_x) rand_status = 0; else rand_status = PI_JOY_RIGHT; if(pos_h_y < *pos_y) rand_status |= PI_JOY_UP; else if(pos_h_y == *pos_y) rand_status |= 0; //dummy else rand_status |= PI_JOY_DOWN; }else{ // 1-B)Get direction from the joystick status = Get_rand(); status = status % 9; switch(status){ case 0: rand_status = PI_JOY_UP; break; case 1: rand_status = PI_JOY_DOWN; break; case 2: rand_status = PI_JOY_LEFT; break; case 3: rand_status = PI_JOY_RIGHT; break; case 4: rand_status = PI_JOY_UP; rand_status |= PI_JOY_RIGHT; break; case 5: rand_status = PI_JOY_UP; rand_status |= PI_JOY_LEFT; break; case 6: rand_status = PI_JOY_DOWN; rand_status |= PI_JOY_RIGHT; break; case 7: rand_status = PI_JOY_DOWN; rand_status |= PI_JOY_LEFT; break; default: rand_status = 0; } } if(((rand_status & PI_JOY_UP) != 0 ) && ( *pos_y > PI_INVPOS_Y_MIN )) tmp_y--; if(((rand_status & PI_JOY_DOWN) != 0 ) && ( *pos_y < PI_INVPOS_Y_MAX )) tmp_y++; if(((rand_status & PI_JOY_LEFT) != 0 ) && ( *pos_x > PI_INVPOS_X_MIN )) tmp_x--; if(((rand_status & PI_JOY_RIGHT)!= 0 ) && ( *pos_x < PI_INVPOS_X_MAX )) tmp_x++; // (2)Check gameover if(((G_LCD_CHAR_BUFFER[tmp_x][tmp_y] == PI_HUMAN_CHAR_R) ||(G_LCD_CHAR_BUFFER[tmp_x][tmp_y] == PI_HUMAN_CHAR_L)) &&(sur_flag == PI_INV_LIVE)){ *pos_x = tmp_x; *pos_y = tmp_y; Put_LCD_char(PI_INVADER_CHAR, *pos_y, *pos_x, PI_LCD_FUR); return(PI_GAMEOVER); } // (3)Check whether does not overlap with the obstacle if(G_LCD_CHAR_BUFFER[tmp_x][tmp_y] == ' ' ){ *pos_x = tmp_x; *pos_y = tmp_y; } // (4)Write on the screen icon if(sur_flag == PI_INV_LIVE) Put_LCD_char(PI_INVADER_CHAR, *pos_y, *pos_x, PI_LCD_FUR); return(PI_NORMAL); } //****************************************************************************************** // Function Name : Set_bullet // Title : Pistol bullet flies // Input : // Output : //****************************************************************************************** void Set_bullet(unsigned char pos_h_x, unsigned char pos_h_y, unsigned char *pos_x, unsigned char *pos_y, unsigned char inv1_pos_x[], unsigned char inv1_pos_y[], unsigned char inv1_pos_status[]) { unsigned char lp; // 1.Check trigger gun whether drawn if(*pos_x == PI_EOF){ if((Check_Switch(PI_SWITCH_1)) == PI_SWITCH_OFF)return; *pos_x = pos_h_x ; *pos_y = pos_h_y ; G_dum_dir = G_human_dir; }else{ Put_LCD_char(' ', *pos_y, *pos_x, PI_LCD_FUR); } // 2.Fly a ball of gun if(G_dum_dir == PI_RIGHT) *pos_x = *pos_x + 1; else *pos_x = *pos_x - 1; if(*pos_x >= PI_JOYPOS_X_MAX){ *pos_x = PI_EOF; }else if(*pos_x <= PI_JOYPOS_X_MIN){ *pos_x = PI_EOF; } // 3.If there is no obstacle, ball flies if(G_LCD_CHAR_BUFFER[*pos_x][*pos_y] == ' ' ){ Put_LCD_char(PI_BALL_CHAR, *pos_y, *pos_x, PI_LCD_FUR); return; } // 4.What happens when a ball hits the enemy if(G_LCD_CHAR_BUFFER[*pos_x][*pos_y] == PI_INVADER_CHAR ){ Put_LCD_char(' ', *pos_y, *pos_x, PI_LCD_FUR); for(lp=0;lp PI_JOYPOS_Y_MIN )) {tmp_y--;} if(((joy_status & PI_JOY_DOWN) != 0 ) && ( *pos_y < PI_JOYPOS_Y_MAX )) {tmp_y++;} if(((joy_status & PI_JOY_LEFT) != 0 ) && ( *pos_x > PI_JOYPOS_X_MIN )) {tmp_x--; G_human_dir = PI_LEFT ; } if(((joy_status & PI_JOY_RIGHT)!= 0 ) && ( *pos_x < PI_JOYPOS_X_MAX )) {tmp_x++; G_human_dir = PI_RIGHT; } // (2)Check whether does not overlap with the obstacle if(G_LCD_CHAR_BUFFER[tmp_x][tmp_y] == ' ' ){ *pos_x = tmp_x; *pos_y = tmp_y; } // (3)Write on the screen icon if(G_human_dir == PI_RIGHT) Put_LCD_char(PI_HUMAN_CHAR_R, *pos_y, *pos_x, PI_LCD_FUR); else Put_LCD_char(PI_HUMAN_CHAR_L, *pos_y, *pos_x, PI_LCD_FUR); } //****************************************************************************************** // Function Name : Get_Jstick // Title : This function get direction from the joystick // Input : // Output : 0b0000RLUD: Up, down, right, left //****************************************************************************************** unsigned char Get_Jstick(void) { unsigned char j_direction = 0; unsigned int adc_data = 0; // 1.X-axis direction Init_ADC_AN1(); GetADC(&adc_data); if(adc_data < 1000 ) j_direction = PI_JOY_LEFT ; else if(adc_data > 3000 ) j_direction = PI_JOY_RIGHT; // 2.Y-axis direction Init_ADC_AN0(); GetADC(&adc_data); if(adc_data > 3000 ) j_direction |= PI_JOY_UP ; else if(adc_data < 1000 ) j_direction |= PI_JOY_DOWN; return(j_direction); } //****************************************************************************************** // Function Name : Check_Switch // Title : // Input : // Output : //****************************************************************************************** unsigned char Check_Switch(unsigned char switch_no) { if(switch_no == PI_SWITCH_1){ if((PORTE & (unsigned int)0x0001) != 0) return(PI_SWITCH_ON) ; else return(PI_SWITCH_OFF) ; }else if(switch_no == PI_SWITCH_2){ if((PORTE & (unsigned int)0x0002) != 0) return(PI_SWITCH_ON) ; else return(PI_SWITCH_OFF) ; }else{ if((PORTE & (unsigned int)0x0004) != 0) return(PI_SWITCH_ON) ; else return(PI_SWITCH_OFF) ; } } //****************************************************************************************** // Function Name : Init_LCD // Title : Initialized LCD // Input : // Output : //****************************************************************************************** void Init_LCD(void) { unsigned short tmp_s=0; // ************************* // 1.Default Value // ************************* tmp_s = (1< in_x1){ tmp_c = in_x0; in_x0 = in_x1; in_x1 = tmp_c; tmp_c = in_y0; in_y0 = in_y1; in_y1 = tmp_c; } if((in_x0 == in_x1) && (in_y0 == in_y1)){ if((in_x0 < 128)&&(in_y0 < 64)){ if(in_mode == PI_FUR){ PSET(in_x0, in_y0,PI_FUR); } PSET(in_x0, in_y0,PI_SEC); } return(PI_NORMAL); }else if(in_x0 == in_x1){ if(in_y0 > in_y1){ tmp_c = in_y0; in_y0 = in_y1; in_y1 = tmp_c; } for(lp=in_y0;lp 127){ in_x0 = 127 ; } if(in_x1 > 127){ in_x1 = 127 ; } // ********************** // 2.Calc A // ********************** f_x0 = (float)in_x0; f_x1 = (float)in_x1; f_y0 = (float)in_y0; f_y1 = (float)in_y1; A = ((float)(f_y1 - f_y0)) / ((float)(f_x1 - f_x0)); B = (float)f_y0 - (float)(A * (float)f_x0); // ********************** // 3.Program // ********************** for(lp=in_x0;lp < ( in_x1 + 1 ) ; lp=lp+lp_add){ y = A * lp + B ; if(y < 0 || 62 < y ){ }else{ cx=lp; cy=y; if(in_mode == PI_FUR && chk_flg == 0){ PSET(cx, cy,PI_FUR); chk_flg = 1; } PSET(cx, cy,PI_SEC); } } return(PI_NORMAL); } //****************************************************************************************** // Function Name : PSET // Title : // Input : // Output : //****************************************************************************************** char PSET(unsigned char in_x, unsigned char in_y, unsigned char in_mode) { unsigned char tmp_page; unsigned char tmp_data; unsigned char tmp_lcd_data; tmp_page = in_y / 8 ; tmp_data = ( 1 << ( in_y % 8 )); if(tmp_page > 7) return(PI_FAILER); if(in_mode == PI_FUR){ LCD_read_buff(0, 0, 0, &tmp_lcd_data, PI_LINE); } LCD_read_buff(0, tmp_page, in_x, &tmp_lcd_data, PI_PAGE); tmp_data = tmp_data | tmp_lcd_data ; LCD_dsp_buff(0, tmp_page, in_x, tmp_data, PI_PAGE); return(PI_NORMAL); } //****************************************************************************************** // Function Name : Put_LCD_char // Title : // Input : char, page, clm(char), cs, mode // Output : //****************************************************************************************** char Put_LCD_char(unsigned char in_char, unsigned char in_page, unsigned char in_pos, unsigned char in_mode ) { unsigned char fnt[6]; unsigned int lp; unsigned char clm; unsigned char tmp_line; char status; // 1.Get Font status = Set_fnt(&fnt[0], in_char); // if(status != PI_NORMAL) return(PI_FAILER); // 2.Check Error // (1)Check position if(in_pos > PI_LCD_CHAR_X_MAX ){ return(PI_FAILER); }else if(in_page > PI_LCD_CHAR_Y_MAX){ return(PI_FAILER); } // 3.Put LCD if(in_mode == PI_LINE){ tmp_line = in_page *8; LCD_dsp_buff(tmp_line, 0, 0, 0x00, PI_LINE); } clm = in_pos * 6 ; for(lp=0;lp<6;lp++){ LCD_dsp_buff(0, in_page, clm, fnt[lp], PI_PAGE); clm++; } // 4.Set character table G_LCD_CHAR_BUFFER[in_pos][in_page] = in_char; return(PI_NORMAL); } //****************************************************************************************** // Function Name : Set_fnt // Title : // Input : // Output : //****************************************************************************************** char Set_fnt(unsigned char fnt[], unsigned char c) { // **************** // Default // **************** fnt[5] = 0b00000000; // **************** // 0-9 // **************** if(c=='0'){ fnt[0] = 0b00000000; fnt[1] = 0b00111110; fnt[2] = 0b01000001; fnt[3] = 0b00111110; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='1'){ fnt[0] = 0b00000000; fnt[1] = 0b01000010; fnt[2] = 0b01111111; fnt[3] = 0b01000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='2'){ fnt[0] = 0b01000010; fnt[1] = 0b01000001; fnt[2] = 0b01100001; fnt[3] = 0b01010001; fnt[4] = 0b01001110; return(PI_NORMAL); } if(c=='3'){ fnt[0] = 0b00100010; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00110110; return(PI_NORMAL); } if(c=='4'){ fnt[0] = 0b00111100; fnt[1] = 0b00100010; fnt[2] = 0b00100001; fnt[3] = 0b01111111; fnt[4] = 0b00100000; return(PI_NORMAL); } if(c=='5'){ fnt[0] = 0b01001111; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00110000; return(PI_NORMAL); } if(c=='6'){ fnt[0] = 0b00111110; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00110000; return(PI_NORMAL); } if(c=='7'){ fnt[0] = 0b00000001; fnt[1] = 0b00000001; fnt[2] = 0b01110001; fnt[3] = 0b00001001; fnt[4] = 0b00000111; return(PI_NORMAL); } if(c=='8'){ fnt[0] = 0b00110110; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00110110; return(PI_NORMAL); } if(c=='9'){ fnt[0] = 0b00100110; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00111110; return(PI_NORMAL); } // **************** // A-Z // **************** if(c=='A'){ fnt[0] = 0b01111100; fnt[1] = 0b00010010; fnt[2] = 0b00010001; fnt[3] = 0b00010010; fnt[4] = 0b01111100; return(PI_NORMAL); } if(c=='B'){ fnt[0] = 0b01111111; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00110110; return(PI_NORMAL); } if(c=='C'){ fnt[0] = 0b00111110; fnt[1] = 0b01000001; fnt[2] = 0b01000001; fnt[3] = 0b01000001; fnt[4] = 0b00100010; return(PI_NORMAL); } if(c=='D'){ fnt[0] = 0b01111111; fnt[1] = 0b01000001; fnt[2] = 0b01000001; fnt[3] = 0b01000001; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c=='E'){ fnt[0] = 0b01111111; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b01001001; return(PI_NORMAL); } if(c=='F'){ fnt[0] = 0b01111111; fnt[1] = 0b00001001; fnt[2] = 0b00001001; fnt[3] = 0b00001001; fnt[4] = 0b00001001; return(PI_NORMAL); } if(c=='G'){ fnt[0] = 0b00111110; fnt[1] = 0b01000001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b01111010; return(PI_NORMAL); } if(c=='H'){ fnt[0] = 0b01111111; fnt[1] = 0b00001000; fnt[2] = 0b00001000; fnt[3] = 0b00001000; fnt[4] = 0b01111111; return(PI_NORMAL); } if(c=='I'){ fnt[0] = 0b00000000; fnt[1] = 0b01000001; fnt[2] = 0b01111111; fnt[3] = 0b01000001; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='J'){ fnt[0] = 0b00100000; fnt[1] = 0b01000000; fnt[2] = 0b01000000; fnt[3] = 0b01000000; fnt[4] = 0b00111111; return(PI_NORMAL); } if(c=='K'){ fnt[0] = 0b01111111; fnt[1] = 0b00001000; fnt[2] = 0b00010100; fnt[3] = 0b00100010; fnt[4] = 0b01000001; return(PI_NORMAL); } if(c=='L'){ fnt[0] = 0b01111111; fnt[1] = 0b01000000; fnt[2] = 0b01000000; fnt[3] = 0b01000000; fnt[4] = 0b01000000; return(PI_NORMAL); } if(c=='M'){ fnt[0] = 0b01111111; fnt[1] = 0b00000010; fnt[2] = 0b00011100; fnt[3] = 0b00000010; fnt[4] = 0b01111111; return(PI_NORMAL); } if(c=='N'){ fnt[0] = 0b01111111; fnt[1] = 0b00000010; fnt[2] = 0b00001000; fnt[3] = 0b00100000; fnt[4] = 0b01111111; return(PI_NORMAL); } if(c=='O'){ fnt[0] = 0b00111110; fnt[1] = 0b01000001; fnt[2] = 0b01000001; fnt[3] = 0b01000001; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c=='P'){ fnt[0] = 0b01111111; fnt[1] = 0b00001001; fnt[2] = 0b00001001; fnt[3] = 0b00001001; fnt[4] = 0b00000110; return(PI_NORMAL); } if(c=='Q'){ fnt[0] = 0b00111110; fnt[1] = 0b01000001; fnt[2] = 0b01010001; fnt[3] = 0b00111110; fnt[4] = 0b01000000; return(PI_NORMAL); } if(c=='R'){ fnt[0] = 0b01111111; fnt[1] = 0b00001001; fnt[2] = 0b00011001; fnt[3] = 0b00101001; fnt[4] = 0b01000110; return(PI_NORMAL); } if(c=='S'){ fnt[0] = 0b00100110; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00110010; return(PI_NORMAL); } if(c=='T'){ fnt[0] = 0b00000001; fnt[1] = 0b00000001; fnt[2] = 0b01111111; fnt[3] = 0b00000001; fnt[4] = 0b00000001; return(PI_NORMAL); } if(c=='U'){ fnt[0] = 0b00111111; fnt[1] = 0b01000000; fnt[2] = 0b01000000; fnt[3] = 0b01000000; fnt[4] = 0b00111111; return(PI_NORMAL); } if(c=='V'){ fnt[0] = 0b00011111; fnt[1] = 0b00100000; fnt[2] = 0b01000000; fnt[3] = 0b00100000; fnt[4] = 0b00011111; return(PI_NORMAL); } if(c=='W'){ fnt[0] = 0b00111111; fnt[1] = 0b01000000; fnt[2] = 0b00111111; fnt[3] = 0b01000000; fnt[4] = 0b00111111; return(PI_NORMAL); } if(c=='X'){ fnt[0] = 0b01000001; fnt[1] = 0b00100010; fnt[2] = 0b00011100; fnt[3] = 0b00100010; fnt[4] = 0b01000001; return(PI_NORMAL); } if(c=='Y'){ fnt[0] = 0b00000001; fnt[1] = 0b00000100; fnt[2] = 0b01110000; fnt[3] = 0b00000100; fnt[4] = 0b00000001; return(PI_NORMAL); } if(c=='Z'){ fnt[0] = 0b01100001; fnt[1] = 0b01010001; fnt[2] = 0b01001001; fnt[3] = 0b01000101; fnt[4] = 0b01000011; return(PI_NORMAL); } // **************** // カナ文字 // **************** if(c==0xb1){ //'ア' fnt[0] = 0b00000001; fnt[1] = 0b01000001; fnt[2] = 0b00111101; fnt[3] = 0b00001001; fnt[4] = 0b00000111; return(PI_NORMAL); } if(c==0xb2){ //'イ' fnt[0] = 0b00100000; fnt[1] = 0b00010000; fnt[2] = 0b01111100; fnt[3] = 0b00000011; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0xb3){ //'ウ' fnt[0] = 0b00000110; fnt[1] = 0b00000010; fnt[2] = 0b01000011; fnt[3] = 0b00100010; fnt[4] = 0b00011110; return(PI_NORMAL); } if(c==0xb4){ //'エ' fnt[0] = 0b01000000; fnt[1] = 0b01000010; fnt[2] = 0b01111110; fnt[3] = 0b01000010; fnt[4] = 0b01000000; return(PI_NORMAL); } if(c==0xb5){ //'オ' fnt[0] = 0b00100010; fnt[1] = 0b00010010; fnt[2] = 0b00001010; fnt[3] = 0b01111111; fnt[4] = 0b00000010; return(PI_NORMAL); } if(c==0xb6){ //'カ' fnt[0] = 0b01000010; fnt[1] = 0b00111111; fnt[2] = 0b00000010; fnt[3] = 0b01000010; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c==0xb7){ //'キ' fnt[0] = 0b00001010; fnt[1] = 0b00001010; fnt[2] = 0b01111111; fnt[3] = 0b00001010; fnt[4] = 0b00001010; return(PI_NORMAL); } if(c==0xb8){ //'ク' fnt[0] = 0b00000100; fnt[1] = 0b00000011; fnt[2] = 0b01000001; fnt[3] = 0b00100001; fnt[4] = 0b00011111; return(PI_NORMAL); } if(c==0xb9){ //'ケ' fnt[0] = 0b00001000; fnt[1] = 0b00000111; fnt[2] = 0b01000010; fnt[3] = 0b00111110; fnt[4] = 0b00000010; return(PI_NORMAL); } if(c==0xba){ //'コ' fnt[0] = 0b01000010; fnt[1] = 0b01000010; fnt[2] = 0b01000010; fnt[3] = 0b01000010; fnt[4] = 0b01111110; return(PI_NORMAL); } if(c==0xbb){ //'サ' fnt[0] = 0b00000010; fnt[1] = 0b00001111; fnt[2] = 0b01000010; fnt[3] = 0b00111111; fnt[4] = 0b00000010; return(PI_NORMAL); } if(c==0xbc){ //'シ' fnt[0] = 0b00001010; fnt[1] = 0b00010100; fnt[2] = 0b00000000; fnt[3] = 0b01000000; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c==0xbd){ //'ス' fnt[0] = 0b01000010; fnt[1] = 0b00100010; fnt[2] = 0b00011010; fnt[3] = 0b00100110; fnt[4] = 0b01000010; return(PI_NORMAL); } if(c==0xbe){ //'セ' fnt[0] = 0b00000100; fnt[1] = 0b01111111; fnt[2] = 0b01000100; fnt[3] = 0b01000100; fnt[4] = 0b01011100; return(PI_NORMAL); } if(c==0xbf){ //'ソ' fnt[0] = 0b00000010; fnt[1] = 0b00000100; fnt[2] = 0b01000000; fnt[3] = 0b00100000; fnt[4] = 0b00011110; return(PI_NORMAL); } if(c==0xc0){ //'タ' fnt[0] = 0b00001000; fnt[1] = 0b00000110; fnt[2] = 0b01001001; fnt[3] = 0b00100001; fnt[4] = 0b00011111; return(PI_NORMAL); } if(c==0xc1){ //'チ' fnt[0] = 0b00001000; fnt[1] = 0b01001010; fnt[2] = 0b00111111; fnt[3] = 0b00001001; fnt[4] = 0b00001000; return(PI_NORMAL); } if(c==0xc2){ //'ツ' fnt[0] = 0b00000100; fnt[1] = 0b00001000; fnt[2] = 0b00000100; fnt[3] = 0b01001000; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c==0xc3){ //'テ' fnt[0] = 0b00000100; fnt[1] = 0b01000101; fnt[2] = 0b00111101; fnt[3] = 0b00000101; fnt[4] = 0b00000100; return(PI_NORMAL); } if(c==0xc4){ //'ト' fnt[0] = 0b00000000; fnt[1] = 0b01111111; fnt[2] = 0b00001000; fnt[3] = 0b00010000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0xc5){ //'ナ' fnt[0] = 0b00000100; fnt[1] = 0b00000100; fnt[2] = 0b01000100; fnt[3] = 0b00111111; fnt[4] = 0b00000100; return(PI_NORMAL); } if(c==0xc6){ //'ニ' fnt[0] = 0b01000000; fnt[1] = 0b01000010; fnt[2] = 0b01000010; fnt[3] = 0b01000010; fnt[4] = 0b01000000; return(PI_NORMAL); } if(c==0xc7){ //'ヌ' fnt[0] = 0b01000010; fnt[1] = 0b00101010; fnt[2] = 0b00010010; fnt[3] = 0b00101010; fnt[4] = 0b01000110; return(PI_NORMAL); } if(c==0xc8){ //'ネ' fnt[0] = 0b00100010; fnt[1] = 0b00010010; fnt[2] = 0b01111011; fnt[3] = 0b00010110; fnt[4] = 0b00100010; return(PI_NORMAL); } if(c==0xc9){ //'ノ' fnt[0] = 0b00000000; fnt[1] = 0b00000000; fnt[2] = 0b01000000; fnt[3] = 0b00111111; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0xca){ //'ハ' fnt[0] = 0b01100000; fnt[1] = 0b00011110; fnt[2] = 0b00000000; fnt[3] = 0b00011110; fnt[4] = 0b01100000; return(PI_NORMAL); } if(c==0xcb){ //'ヒ' fnt[0] = 0b00111110; fnt[1] = 0b01001000; fnt[2] = 0b01001000; fnt[3] = 0b01001000; fnt[4] = 0b01001000; return(PI_NORMAL); } if(c==0xcc){ //'フ' fnt[0] = 0b00000010; fnt[1] = 0b00000010; fnt[2] = 0b01000010; fnt[3] = 0b01000010; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c==0xcd){ //'ヘ' fnt[0] = 0b00001000; fnt[1] = 0b00000100; fnt[2] = 0b00000100; fnt[3] = 0b00001000; fnt[4] = 0b00010000; return(PI_NORMAL); } if(c==0xce){ //'ホ' fnt[0] = 0b00110010; fnt[1] = 0b00000010; fnt[2] = 0b01111111; fnt[3] = 0b00000010; fnt[4] = 0b00110010; return(PI_NORMAL); } if(c==0xcf){ //'マ' fnt[0] = 0b00000010; fnt[1] = 0b00001010; fnt[2] = 0b00010010; fnt[3] = 0b00101010; fnt[4] = 0b01000110; return(PI_NORMAL); } if(c==0xd0){ //'ミ' fnt[0] = 0b00000000; fnt[1] = 0b01001001; fnt[2] = 0b01001001; fnt[3] = 0b01001001; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0xd1){ //'ム' fnt[0] = 0b01110000; fnt[1] = 0b01001111; fnt[2] = 0b01000000; fnt[3] = 0b00110000; fnt[4] = 0b01000000; return(PI_NORMAL); } if(c==0xd2){ //'メ' fnt[0] = 0b01000000; fnt[1] = 0b00101000; fnt[2] = 0b00011111; fnt[3] = 0b00100000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0xd3){ //'モ' fnt[0] = 0b00001010; fnt[1] = 0b01111110; fnt[2] = 0b01001010; fnt[3] = 0b01001010; fnt[4] = 0b01001010; return(PI_NORMAL); } if(c==0xd4){ //'ヤ' fnt[0] = 0b00000100; fnt[1] = 0b01111111; fnt[2] = 0b00000100; fnt[3] = 0b00010100; fnt[4] = 0b00001100; return(PI_NORMAL); } if(c==0xd5){ //'ユ' fnt[0] = 0b01000000; fnt[1] = 0b01000100; fnt[2] = 0b01000100; fnt[3] = 0b01111100; fnt[4] = 0b01000000; return(PI_NORMAL); } if(c==0xd6){ //'ヨ' fnt[0] = 0b00000000; fnt[1] = 0b01010100; fnt[2] = 0b01010100; fnt[3] = 0b01111100; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0xd7){ //'ラ' fnt[0] = 0b00000100; fnt[1] = 0b00000101; fnt[2] = 0b01000101; fnt[3] = 0b01000101; fnt[4] = 0b00111100; return(PI_NORMAL); } if(c==0xd8){ //'リ' fnt[0] = 0b00000000; fnt[1] = 0b00001111; fnt[2] = 0b00000000; fnt[3] = 0b01000000; fnt[4] = 0b00111111; return(PI_NORMAL); } if(c==0xd9){ //'ル' fnt[0] = 0b01111111; fnt[1] = 0b00000000; fnt[2] = 0b01111111; fnt[3] = 0b01000000; fnt[4] = 0b00100000; return(PI_NORMAL); } if(c==0xda){ //'レ' fnt[0] = 0b00000000; fnt[1] = 0b01111111; fnt[2] = 0b01000000; fnt[3] = 0b01000000; fnt[4] = 0b00100000; return(PI_NORMAL); } if(c==0xdb){ //'ロ' fnt[0] = 0b00000000; fnt[1] = 0b01111110; fnt[2] = 0b01000010; fnt[3] = 0b01000010; fnt[4] = 0b01111110; return(PI_NORMAL); } if(c==0xdc){ //'ワ' fnt[0] = 0b00000000; fnt[1] = 0b00001110; fnt[2] = 0b00000010; fnt[3] = 0b01000010; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c==0xdd){ //'ン' fnt[0] = 0b00000010; fnt[1] = 0b00000100; fnt[2] = 0b01000000; fnt[3] = 0b00110000; fnt[4] = 0b00001110; return(PI_NORMAL); } if(c==0xde){ //'゙' fnt[0] = 0b00000111; fnt[1] = 0b00000000; fnt[2] = 0b00000111; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0xdf){ //'゚' fnt[0] = 0b00000111; fnt[1] = 0b00000101; fnt[2] = 0b00000111; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } // **************** // ELSE // **************** if(c==' '){ fnt[0] = 0b00000000; fnt[1] = 0b00000000; fnt[2] = 0b00000000; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='u'){ fnt[0] = 0b00000100; fnt[1] = 0b00000010; fnt[2] = 0b01111111; fnt[3] = 0b00000010; fnt[4] = 0b00000100; return(PI_NORMAL); } if(c=='d'){ fnt[0] = 0b00010000; fnt[1] = 0b00100000; fnt[2] = 0b01111111; fnt[3] = 0b00100000; fnt[4] = 0b00010000; return(PI_NORMAL); } if(c=='r'){ fnt[0] = 0b00001000; fnt[1] = 0b01001001; fnt[2] = 0b00101010; fnt[3] = 0b00011100; fnt[4] = 0b00001000; return(PI_NORMAL); } if(c=='l'){ fnt[0] = 0b00001000; fnt[1] = 0b00011100; fnt[2] = 0b00101010; fnt[3] = 0b01001001; fnt[4] = 0b00001000; return(PI_NORMAL); } if(c=='a'){ fnt[0] = 0b01111111; fnt[1] = 0b01111111; fnt[2] = 0b01111111; fnt[3] = 0b01111111; fnt[4] = 0b01111111; return(PI_NORMAL); } if(c=='+'){ fnt[0] = 0b00001000; fnt[1] = 0b00001000; fnt[2] = 0b01111111; fnt[3] = 0b00001000; fnt[4] = 0b00001000; return(PI_NORMAL); } if(c=='-'){ fnt[0] = 0b00001000; fnt[1] = 0b00001000; fnt[2] = 0b00001000; fnt[3] = 0b00001000; fnt[4] = 0b00001000; return(PI_NORMAL); } if(c=='='){ fnt[0] = 0b00010100; fnt[1] = 0b00010100; fnt[2] = 0b00010100; fnt[3] = 0b00010100; fnt[4] = 0b00010100; return(PI_NORMAL); } if(c==')'){ fnt[0] = 0b00000000; fnt[1] = 0b00000000; fnt[2] = 0b00000000; fnt[3] = 0b01000001; fnt[4] = 0b00111110; return(PI_NORMAL); } if(c=='('){ fnt[0] = 0b00111110; fnt[1] = 0b01000001; fnt[2] = 0b00000000; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==']'){ fnt[0] = 0b00000000; fnt[1] = 0b00000000; fnt[2] = 0b00000000; fnt[3] = 0b01000001; fnt[4] = 0b01111111; return(PI_NORMAL); } if(c=='['){ fnt[0] = 0b01111111; fnt[1] = 0b01000001; fnt[2] = 0b00000000; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='>'){ fnt[0] = 0b00000000; fnt[1] = 0b01000001; fnt[2] = 0b00100010; fnt[3] = 0b00010100; fnt[4] = 0b00001000; return(PI_NORMAL); } if(c=='['){ fnt[0] = 0b00001000; fnt[1] = 0b00010100; fnt[2] = 0b00100010; fnt[3] = 0b01000001; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='*'){ fnt[0] = 0b00100010; fnt[1] = 0b00010100; fnt[2] = 0b00001000; fnt[3] = 0b00010100; fnt[4] = 0b00100010; return(PI_NORMAL); } if(c=='/'){ fnt[0] = 0b01000000; fnt[1] = 0b01100000; fnt[2] = 0b00011000; fnt[3] = 0b00000110; fnt[4] = 0b00000001; return(PI_NORMAL); } if(c=='"'){ fnt[0] = 0b00000000; fnt[1] = 0b00000111; fnt[2] = 0b00000000; fnt[3] = 0b00000111; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='!'){ fnt[0] = 0b00000000; fnt[1] = 0b00000000; fnt[2] = 0b11011111; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==','){ fnt[0] = 0b00000000; fnt[1] = 0b01000000; fnt[2] = 0b00110000; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c=='.'){ fnt[0] = 0b00000000; fnt[1] = 0b00000000; fnt[2] = 0b01100000; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==':'){ fnt[0] = 0b00000000; fnt[1] = 0b00000000; fnt[2] = 0b00110110; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==';'){ fnt[0] = 0b00000000; fnt[1] = 0b01000000; fnt[2] = 0b00110110; fnt[3] = 0b00000000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0x95){ fnt[0] = 0b00000000; fnt[1] = 0b00111000; fnt[2] = 0b01111100; fnt[3] = 0b00111000; fnt[4] = 0b00000000; return(PI_NORMAL); } if(c==0x96){ fnt[0] = 0b00000010; fnt[1] = 0b11000100; fnt[2] = 0b00111111; fnt[3] = 0b00100100; fnt[4] = 0b11001000; return(PI_NORMAL); } if(c==0x97){ fnt[0] = 0b00001000; fnt[1] = 0b11000100; fnt[2] = 0b00111111; fnt[3] = 0b00100100; fnt[4] = 0b11000010; return(PI_NORMAL); } if(c==0x98){ fnt[0] = 0b00000000; fnt[1] = 0b11011100; fnt[2] = 0b00111110; fnt[3] = 0b00111110; fnt[4] = 0b11011100; return(PI_NORMAL); } if(c==0x99){ fnt[0] = 0b11111111; fnt[1] = 0b11111111; fnt[2] = 0b11111111; fnt[3] = 0b11111111; fnt[4] = 0b11111111; fnt[5] = 0b11111111; return(PI_NORMAL); } // ELSE fnt[0] = 0b00000110; fnt[1] = 0b00001001; fnt[2] = 0b01110001; fnt[3] = 0b00000001; fnt[4] = 0b00000010; return(PI_FAILER); } //****************************************************************************************** // Function Name : LCD_dsp_buff // Title : // Input : // Output : // Description : This function reads and writes to the buffer in order to speed up the process //****************************************************************************************** void LCD_dsp_buff(unsigned char in_line, unsigned char in_page, unsigned char in_clm, unsigned char in_dat, unsigned char in_mode) { // ************************* // 1.Initialize // ************************* if(in_clm > ( PI_LCD_X_MAX - 1)){ in_clm = PI_LCD_X_MAX - 1; } if(in_page > ( PI_LCD_Y_MAX - 1)){ in_page = PI_LCD_Y_MAX - 1; } if(in_mode == PI_FUR){ in_page = 0; } // ************************* // 2.Set buffer // ************************* G_LCD_BUFFER[in_clm][in_page] = in_dat; } //****************************************************************************************** // Function Name : LCD_write_buff // Title : This function copies the data on the LCD display buffer from the MPU buffer // Input : // Output : //****************************************************************************************** void LCD_write_buff(void) { unsigned char X_ind,Y_ind; for(X_ind=0; X_ind 127){ LCD_BCF(PI_P_CS1); LCD_BSF(PI_P_CS2); in_clm = 63 ; }else{ LCD_BCF(PI_P_CS1); LCD_BSF(PI_P_CS2); in_clm = in_clm - 64 ; } // ************************* // 1.Display ON // ************************* // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); LCD_MOVF_DB((unsigned short)0b00111111); // (2)Enable signal LCD_ENSIG(); // ************************* // 2.Display Start Line(0-63) // ************************* if(in_mode == PI_LINE){ // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); tmp_c = 0b11000000 | in_line; LCD_MOVF_DB(tmp_c); // (2)Enable signal LCD_ENSIG(); } // ************************* // 3.Page Adress set(0-7) // ************************* if(in_mode == PI_PAGE){ // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); tmp_c = 0b10111000 | (in_page & 0b00000111 ); LCD_MOVF_DB(tmp_c); // (2)Enable signal LCD_ENSIG(); } // ************************* // 4.Set Colmn Adress(0-63) // ************************* // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); tmp_c = 0b01000000 | (in_clm & 0b00111111 ); LCD_MOVF_DB(tmp_c); // (2)Enable signal LCD_ENSIG(); // ************************* // 5.Status Read // ************************* // ************************* // 6.Write Display Data // ************************* // (1)Set data LCD_BCF(PI_P_RW); LCD_BSF(PI_P_DI); LCD_MOVF_DB(in_dat); // (2)Enable signal LCD_ENSIG(); LCD_MOVF_DB((unsigned short)0b00111111); LCD_BCF(PI_P_DI); // ************************* // 7.Read Display Data // ************************* } //****************************************************************************************** // Function Name : LCD_read_buff // Title : // Input : // Output : // Description : This function reads and writes to the buffer in order to speed up the process //****************************************************************************************** void LCD_read_buff(unsigned char in_line, unsigned char in_page, unsigned char in_clm, unsigned char *out_dat, unsigned char in_mode) { // ************************* // 1.Initialize // ************************* if(in_clm > ( PI_LCD_X_MAX - 1)){ in_clm = PI_LCD_X_MAX - 1; } if(in_page > ( PI_LCD_Y_MAX - 1)){ in_page = PI_LCD_Y_MAX - 1; } if(in_mode == PI_FUR){ in_page = 0; } // ************************* // 2.Read buffer // ************************* *out_dat = G_LCD_BUFFER[in_clm][in_page]; } //****************************************************************************************** // Function Name : LCD_read // Title : // Input : // Output : //****************************************************************************************** void LCD_read(unsigned char in_line, unsigned char in_page, unsigned char in_clm, unsigned char *out_dat, unsigned char in_mode) { unsigned char tmp_c; // ************************* // 0.Initialize // ************************* if(in_clm < 64){ LCD_BSF(PI_P_CS1); LCD_BCF(PI_P_CS2); }else if(in_clm > 127){ LCD_BCF(PI_P_CS1); LCD_BSF(PI_P_CS2); in_clm = 63 ; }else{ LCD_BCF(PI_P_CS1); LCD_BSF(PI_P_CS2); in_clm = in_clm - 64 ; } // ************************* // 1.Display ON // ************************* // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); LCD_MOVF_DB((unsigned short)0b00111111); // (2)Enable signal LCD_ENSIG(); // ************************* // 2.Display Start Line(0-63) // ************************* if(in_mode == PI_LINE){ // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); tmp_c = 0b11000000 | in_line; LCD_MOVF_DB(tmp_c); // (2)Enable signal LCD_ENSIG(); } // ************************* // 3.Page Adress set(0-7) // ************************* if(in_mode == PI_PAGE){ // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); tmp_c = 0b10111000 | (in_page & 0b00000111 ); LCD_MOVF_DB(tmp_c); // (2)Enable signal LCD_ENSIG(); } // ************************* // 4.Set Colmn Adress(0-63) // ************************* // (1)Set data LCD_BCF(PI_P_RW); LCD_BCF(PI_P_DI); tmp_c = 0b01000000 | (in_clm & 0b00111111 ); LCD_MOVF_DB(tmp_c); // (2)Enable signal LCD_ENSIG(); // ************************* // 5.Status Read // ************************* // ************************* // 6.Write Display Data // ************************* // ************************* // 7.Read Display Data // ************************* // (1)Set data LCD_RDTRS_DB(); LCD_BSF(PI_P_RW); LCD_BSF(PI_P_DI); // (2)Enable signal LCD_ENSIG_R(); LCD_RED_DB(out_dat); LCD_BCF(PI_P_RW); NopN(5); LCD_WRTRS_DB(); // LCD_MOVF_DB((unsigned short)0b00111111); LCD_BCF(PI_P_DI); } //****************************************************************************************** // Function Name : LCD_MOVF_DB // Title : // Input : // Output : //****************************************************************************************** void LCD_MOVF_DB(unsigned char dat) { unsigned short tmp_s; tmp_s = PORTD & 0xFF00; tmp_s = tmp_s | dat ; PORTD = tmp_s; } //****************************************************************************************** // Function Name : LCD_ENSIG // Title : Enable Signal // Input : // Output : //****************************************************************************************** void LCD_ENSIG(void) { NopN(1); //450[nS]< // LCD_BCF(PI_P_E); NopN(1); //450[nS]< // LCD_BSF(PI_P_E); NopN(1); //450[nS]< } //****************************************************************************************** // Function Name : LCD_ENSIG_R // Title : Enable Signal // Input : // Output : //****************************************************************************************** void LCD_ENSIG_R(void) { NopN(5); // LCD_BCF(PI_P_E); NopN(5); // LCD_BSF(PI_P_E); NopN(5); } //****************************************************************************************** // Function Name : LCD_BCF // Title : BSF // Input : // Output : //****************************************************************************************** void LCD_BCF(unsigned char pos) { PORTD = PORTD & ~(1 << pos); } //****************************************************************************************** // Function Name : LCD_BSF // Title : BSF Control // Input : // Output : //****************************************************************************************** void LCD_BSF(unsigned char pos) { PORTD = PORTD | (1 << pos); } //****************************************************************************************** // Function Name : LCD_WRTRS_DB // Title : // Input : // Output : //****************************************************************************************** void LCD_WRTRS_DB(void) { TRISD = 0xC000; } //****************************************************************************************** // Function Name : LCD_RDTRS_DB // Title : // Input : // Output : //****************************************************************************************** void LCD_RDTRS_DB(void) { TRISD = 0xC0FF; } //****************************************************************************************** // Function Name : LCD_RED_DB // Title : Read DB0 - DB7 // Input : // Output : //****************************************************************************************** void LCD_RED_DB(unsigned char *dat) { unsigned short tmp_dat; tmp_dat = PORTD; *dat = tmp_dat & 0b0000000011111111; } //****************************************************************************************** // Function Name : NopN // Title : // Input : // Output : // Description : OSC:80MHz ==> 80MHz / 2(PIC) * 40 ==> 1MHz(1μS) / n < //****************************************************************************************** void NopN(unsigned int n) { unsigned int lp,lp1; for(lp=0;lp) AD1PCFGLbits.PCFG0 = 0; //PCFG(15-0) 1:Digital mode, 0:Analog mode AD1PCFGLbits.PCFG1 = 1; AD1PCFGLbits.PCFG2 = 1; AD1PCFGLbits.PCFG3 = 1; AD1PCFGLbits.PCFG4 = 1; AD1PCFGLbits.PCFG5 = 1; AD1PCFGLbits.PCFG6 = 1; AD1PCFGLbits.PCFG7 = 1; AD1PCFGLbits.PCFG8 = 1; AD1PCFGLbits.PCFG9 = 1; AD1PCFGLbits.PCFG10 = 1; AD1PCFGLbits.PCFG11 = 1; AD1PCFGLbits.PCFG12 = 1; AD1PCFGLbits.PCFG13 = 1; AD1PCFGLbits.PCFG14 = 1; AD1PCFGLbits.PCFG15 = 1; // AD1CHS0bits.CH0SA0 = 0; //Channel 0 positive input is AN0 AD1CHS0bits.CH0SA1 = 0; //Channel 0 positive input is AN0 AD1CHS0bits.CH0SA2 = 0; //Channel 0 positive input is AN0 AD1CHS0bits.CH0SA3 = 0; //Channel 0 positive input is AN0 // AD1CHS0bits.CH0NB = 0; //Channel 0 negative input is VREF // AD1CHS123bits.CH123NA0 = 0; //CH1, CH2, CH3 negative input is VREF- AD1CHS123bits.CH123NA1 = 0; //CH1, CH2, CH3 negative input is VREF- AD1CHS123bits.CH123SA = 0; //0 = CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive input is AN2 // AD1CSSH = 0x00; //ADC1 PORT CONFIGURATION REGISTER HIGH AD1CSSL = 0x01; //ADC1 PORT CONFIGURATION REGISTER LOW // b) Select voltage reference source to match expected range on analog inputs(AD1CON2<15:13>) AD1CON2bits.VCFG = 0; //VR+:AVDD , VR-:AVSS // c) Select the analog conversion clock to match desired data rate with processor clock (AD1CON3<7:0>) AD1CON3bits.ADCS = 0; //TCY/2 // d) Select the appropriate sample/conversion sequence (AD1CON1<7:5> and AD1CON3<12:8>) AD1CON1bits.SSRC = 0x7;//Internal counter ends sampling and starts conversion (auto-convert) AD1CON3bits.SAMC = 31; //31 TAD AD1CON3bits.ADCS = 0b111111; //ADC Conversion Clock Select bits (TCY (ADCS<7:0> + 1) = 64 TCY = TAD) // e) Select how conversion results are presented in the buffer (AD1CON1<9:8>) AD1CON1bits.FORM = 0; //Integer (0000 00dd dddd dddd) // e) 10-bit or 12-bit Operation Mode bit (AD1CON1<10>) AD1CON1bits.AD12B = 1; //1 = 12-bit, 1-channel ADC operation // AD1CON1bits.AD12B = 0; //0 = 10-bit, 4-channel ADC operation // f) Select interrupt rate (AD1CON2<5:2>) AD1CON2bits.SMPI = 0; //Interrupts at the completion of conversion for each sample/convert sequence // g) Turn on A/D module (AD1CON1<15>) AD1CON1bits.ADON = 1; // Turn on the A/D converter // ******************************* // 2. Configure A/D interrupt (if required) // ******************************* // a) Clear the AD1IF bit // IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit // b) Select A/D interrupt priority // IEC0bits.AD1IE = 1; // Enable A/D interrupt } //****************************************************************************************** // Function Name : Init_ADC_AN1 // Title : Initialize A/D Converter (AN1) // Input : // Output : //****************************************************************************************** void Init_ADC_AN1(void) { // ******************************* // 1. Configure the A/D module // ******************************* // a) Select port pins as analog inputs(AD1PCFG<15:0>) AD1PCFGLbits.PCFG0 = 1; //PCFG(15-0) 1:Digital mode, 0:Analog mode AD1PCFGLbits.PCFG1 = 0; AD1PCFGLbits.PCFG2 = 1; AD1PCFGLbits.PCFG3 = 1; AD1PCFGLbits.PCFG4 = 1; AD1PCFGLbits.PCFG5 = 1; AD1PCFGLbits.PCFG6 = 1; AD1PCFGLbits.PCFG7 = 1; AD1PCFGLbits.PCFG8 = 1; AD1PCFGLbits.PCFG9 = 1; AD1PCFGLbits.PCFG10 = 1; AD1PCFGLbits.PCFG11 = 1; AD1PCFGLbits.PCFG12 = 1; AD1PCFGLbits.PCFG13 = 1; AD1PCFGLbits.PCFG14 = 1; AD1PCFGLbits.PCFG15 = 1; // AD1CHS0bits.CH0SA0 = 1; //Channel 0 positive input is AN1 AD1CHS0bits.CH0SA1 = 0; //Channel 0 positive input is AN1 AD1CHS0bits.CH0SA2 = 0; //Channel 0 positive input is AN1 AD1CHS0bits.CH0SA3 = 0; //Channel 0 positive input is AN1 // AD1CHS0bits.CH0NB = 0; //Channel 0 negative input is VREF // AD1CHS123bits.CH123NA0 = 0; //CH1, CH2, CH3 negative input is VREF- AD1CHS123bits.CH123NA1 = 0; //CH1, CH2, CH3 negative input is VREF- AD1CHS123bits.CH123SA = 0; //0 = CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive input is AN2 // AD1CSSH = 0x00; //ADC1 PORT CONFIGURATION REGISTER HIGH AD1CSSL = 0x01; //ADC1 PORT CONFIGURATION REGISTER LOW // b) Select voltage reference source to match expected range on analog inputs(AD1CON2<15:13>) AD1CON2bits.VCFG = 0; //VR+:AVDD , VR-:AVSS // c) Select the analog conversion clock to match desired data rate with processor clock (AD1CON3<7:0>) AD1CON3bits.ADCS = 0; //TCY/2 // d) Select the appropriate sample/conversion sequence (AD1CON1<7:5> and AD1CON3<12:8>) AD1CON1bits.SSRC = 0x7;//Internal counter ends sampling and starts conversion (auto-convert) AD1CON3bits.SAMC = 31; //31 TAD AD1CON3bits.ADCS = 0b111111; //ADC Conversion Clock Select bits (TCY (ADCS<7:0> + 1) = 64 TCY = TAD) // e) Select how conversion results are presented in the buffer (AD1CON1<9:8>) AD1CON1bits.FORM = 0; //Integer (0000 00dd dddd dddd) // e) 10-bit or 12-bit Operation Mode bit (AD1CON1<10>) AD1CON1bits.AD12B = 1; //1 = 12-bit, 1-channel ADC operation // AD1CON1bits.AD12B = 0; //0 = 10-bit, 4-channel ADC operation // f) Select interrupt rate (AD1CON2<5:2>) AD1CON2bits.SMPI = 0; //Interrupts at the completion of conversion for each sample/convert sequence // g) Turn on A/D module (AD1CON1<15>) AD1CON1bits.ADON = 1; // Turn on the A/D converter // ******************************* // 2. Configure A/D interrupt (if required) // ******************************* // a) Clear the AD1IF bit // IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit // b) Select A/D interrupt priority // IEC0bits.AD1IE = 1; // Enable A/D interrupt } //****************************************************************************************** // Function Name : GetADC // Title : Get A/D Converter Value // Input : // Output : //****************************************************************************************** void GetADC(unsigned int *dat) { AD1CON1bits.SAMP=1; IFS0bits.AD1IF = 0; while(IFS0bits.AD1IF==0); *dat = (unsigned int)ADC1BUF0; } //****************************************************************************************** // Function Name : Get_rand // Title : // Input : // Output :volatile unsigned char G_rand_counter; //****************************************************************************************** unsigned char Get_rand(void) { unsigned long lp; for(lp=0;lp