เว็บมาสเตอร์
|
ความคิดเห็นที่ 1
19/01/2012
, 14:42
Quote
#define _PIC16f877_ #include <16f877.h> #define CLOCK_SP 20000000 // Device Specification #fuses HS //Oscillator mode HS #fuses NOLVP, NOWDT //No Low Voltage Program, No Watchdog timar #fuses NOPROTECT //Code no protection #use delay (clock=CLOCK_SP) //Use built-in function: delay_ms() & delay_us() #define use_portd_lcd //define for use portb lcd #include "lcd.c" //use module function BOOLEAN HOOKEXT=FALSE; int key; /*********************************************************************** * FUNCTION: IntExt_isr * DESCRIPTION: External Interrupt * PARAMETERS: nothing * RETURNED: nothing ***********************************************************************/ #INT_EXT int IntExt_isr(void) { HOOKEXT = TRUE; } void key_int(int i,int j,int k,int m); void key_int(int i,int j,int k,int m) {int A,B,C,D;
i = input(PIN_B1); j = input(PIN_B2); k = input(PIN_B4); m = input(PIN_B5); A = i*1; B = j*2; C = k*4; D = m*8; key=D+C+B+A;
switch (key) { case 0 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key+1); break; case 1 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key+1); break; case 2 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key+1); break; case 3 : lcd_gotoxy(1,1); printf(lcd_putc,"Upper"); break; case 4 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key); break; case 5 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key); break; case 6 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key); break; case 7 : lcd_gotoxy(1,1); printf(lcd_putc, "Under"); break; case 8 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-1); break; case 9 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-1); break; case 10: lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-1); break; case 11: lcd_gotoxy(1,1); printf(lcd_putc,"Function"); break; case 12: lcd_gotoxy(1,1); printf(lcd_putc, "Clear"); break; case 13: lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-13); break; case 14: lcd_gotoxy(1,1); printf(lcd_putc, "Help"); break; case 15: lcd_gotoxy(1,1); printf(lcd_putc,"Enter"); break;
default : break; } }
void main(void){ int i=1; enable_interrupts(GLOBAL); // Enable Global Interrupts enable_interrupts(INT_EXT); // Enable External Interrupts set_tris_d(0x00); set_tris_C(0x0F); set_tris_B(0x37); while(TRUE) {
if(HOOKEXT) { HOOKEXT = TRUE; } else { output_high(pin_c0); lcd_init(); key_int(0,0,0,0); } } }
ส่วน Lcd 16x2 ติดต่อแบบ 4 bit ครับ // LCD.C file diver // As defined in the following structure the pin connection is as follows: // RD3 enable // RD2 rs // RD4 DB4 // RD5 DB5 // RD6 DB6 // RD7 DB7 // // LCD pins D0-D3 are not used and RW is not used. #define rs PIN_D2 //rw connect gnd #define enabled PIN_D3 #define DB4 PIN_D4 #define DB5 PIN_D5 #define DB6 PIN_D6 #define DB7 PIN_D7 char const lcd_type=2; char const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; //======================================= //======================================= void make_out_data(char buffer_data) { output_bit(DB4,bit_test(buffer_data,0)); output_bit(DB5,bit_test(buffer_data,1)); output_bit(DB6,bit_test(buffer_data,2)); output_bit(DB7,bit_test(buffer_data,3)); } //=================================== //=================================== void lcd_send_nibble(char buffer_nibble) { make_out_data(buffer_nibble); delay_us(10); output_high(enabled); delay_us(10); output_low(enabled); } //==================================== //==================================== void lcd_send_byte( char address, char n ) { output_low(rs); //rs= = 0; delay_ms(1); output_bit(rs,address);//lcd.rs = address; delay_us(20); delay_us(20); output_low(enabled);//lcd.enable = 0; lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); } //=============================================== //=============================================== void lcd_init() { char i; //set_tris_lcd(LCD_WRITE); output_low(rs); //lcd.rs = 0; //output_low(rw); //lcd.rw = 0; output_low(enabled); //lcd.enable = 0; delay_ms(200); for(i=1;i<=3;++i) { lcd_send_nibble(3); delay_ms(10); } lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); } //================================================ //================================================ void lcd_gotoxy( char x, char y) {char address; switch(y) { case 1 : address=0x80;break; case 2 : address=0xc0;break; case 3 : address=0x94;break; case 4 : address=0xd4;break; } address=address+(x-1); lcd_send_byte(0,0x80|address); } //================================================= //================================================= void lcd_putc( char c) { switch (c) { case 'f' : lcd_send_byte(0,1); delay_ms(2); break; case 'n' : lcd_gotoxy(1,2); break; case 'b' : lcd_send_byte(0,0x10); break; default : lcd_send_byte(1,c); break; } } //==================================================== void LCD_Command(int cm); void LCD_ShiftLeft(void); void LCD_ShiftRight(void); void LCD_MoveRight(char p); void LCD_MoveLeft(char p); void LCD_String(char*s,int dly);
void LCD_Command(int cm){ lcd_send_byte(0,cm); }
void LCD_ShiftLeft(void){ lcd_send_byte(0,0x18); } void LCD_ShiftRight(void){ lcd_send_byte(0,0x1C); } void LCD_MoveRight(char p){ char i; for(i=0;i<p;i++){ LCD_ShiftRight(); delay_ms(100); } } void LCD_MoveLeft(char p){ char i; for(i=0;i<p;i++){ LCD_ShiftLeft(); delay_ms(100); } } void strcpy(char*s1,char*s2) { while(*s1++ = *s2++); } void LCD_String(char*s, int dly) { while(*s!=0) { lcd_putc(*s++); delay_ms(dly); } }
#define _PIC16f877_ #include <16f877.h> #define CLOCK_SP 20000000 // Device Specification #fuses HS //Oscillator mode HS #fuses NOLVP, NOWDT //No Low Voltage Program, No Watchdog timar #fuses NOPROTECT //Code no protection #use delay (clock=CLOCK_SP) //Use built-in function: delay_ms() & delay_us() #define use_portd_lcd //define for use portb lcd #include "lcd.c" //use module function BOOLEAN HOOKEXT=FALSE; int key; /*********************************************************************** * FUNCTION: IntExt_isr * DESCRIPTION: External Interrupt * PARAMETERS: nothing * RETURNED: nothing ***********************************************************************/ #INT_EXT int IntExt_isr(void) { HOOKEXT = TRUE; } void key_int(int i,int j,int k,int m); void key_int(int i,int j,int k,int m) {int A,B,C,D;
i = input(PIN_B1); j = input(PIN_B2); k = input(PIN_B4); m = input(PIN_B5); A = i*1; B = j*2; C = k*4; D = m*8; key=D+C+B+A;
switch (key) { case 0 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key+1); break; case 1 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key+1); break; case 2 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key+1); break; case 3 : lcd_gotoxy(1,1); printf(lcd_putc,"Upper"); break; case 4 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key); break; case 5 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key); break; case 6 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key); break; case 7 : lcd_gotoxy(1,1); printf(lcd_putc, "Under"); break; case 8 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-1); break; case 9 : lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-1); break; case 10: lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-1); break; case 11: lcd_gotoxy(1,1); printf(lcd_putc,"Function"); break; case 12: lcd_gotoxy(1,1); printf(lcd_putc, "Clear"); break; case 13: lcd_gotoxy(1,1); printf(lcd_putc,"Number: %d",key-13); break; case 14: lcd_gotoxy(1,1); printf(lcd_putc, "Help"); break; case 15: lcd_gotoxy(1,1); printf(lcd_putc,"Enter"); break;
default : break; } }
void main(void){ int i=1; enable_interrupts(GLOBAL); // Enable Global Interrupts enable_interrupts(INT_EXT); // Enable External Interrupts set_tris_d(0x00); set_tris_C(0x0F); set_tris_B(0x37); while(TRUE) {
if(HOOKEXT) { HOOKEXT = TRUE; } else { output_high(pin_c0); lcd_init(); key_int(0,0,0,0); } } }
ส่วน Lcd 16x2 ติดต่อแบบ 4 bit ครับ // LCD.C file diver // As defined in the following structure the pin connection is as follows: // RD3 enable // RD2 rs // RD4 DB4 // RD5 DB5 // RD6 DB6 // RD7 DB7 // // LCD pins D0-D3 are not used and RW is not used. #define rs PIN_D2 //rw connect gnd #define enabled PIN_D3 #define DB4 PIN_D4 #define DB5 PIN_D5 #define DB6 PIN_D6 #define DB7 PIN_D7 char const lcd_type=2; char const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; //======================================= //======================================= void make_out_data(char buffer_data) { output_bit(DB4,bit_test(buffer_data,0)); output_bit(DB5,bit_test(buffer_data,1)); output_bit(DB6,bit_test(buffer_data,2)); output_bit(DB7,bit_test(buffer_data,3)); } //=================================== //=================================== void lcd_send_nibble(char buffer_nibble) { make_out_data(buffer_nibble); delay_us(10); output_high(enabled); delay_us(10); output_low(enabled); } //==================================== //==================================== void lcd_send_byte( char address, char n ) { output_low(rs); //rs= = 0; delay_ms(1); output_bit(rs,address);//lcd.rs = address; delay_us(20); delay_us(20); output_low(enabled);//lcd.enable = 0; lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); } //=============================================== //=============================================== void lcd_init() { char i; //set_tris_lcd(LCD_WRITE); output_low(rs); //lcd.rs = 0; //output_low(rw); //lcd.rw = 0; output_low(enabled); //lcd.enable = 0; delay_ms(200); for(i=1;i<=3;++i) { lcd_send_nibble(3); delay_ms(10); } lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); } //================================================ //================================================ void lcd_gotoxy( char x, char y) {char address; switch(y) { case 1 : address=0x80;break; case 2 : address=0xc0;break; case 3 : address=0x94;break; case 4 : address=0xd4;break; } address=address+(x-1); lcd_send_byte(0,0x80|address); } //================================================= //================================================= void lcd_putc( char c) { switch (c) { case 'f' : lcd_send_byte(0,1); delay_ms(2); break; case 'n' : lcd_gotoxy(1,2); break; case 'b' : lcd_send_byte(0,0x10); break; default : lcd_send_byte(1,c); break; } } //==================================================== void LCD_Command(int cm); void LCD_ShiftLeft(void); void LCD_ShiftRight(void); void LCD_MoveRight(char p); void LCD_MoveLeft(char p); void LCD_String(char*s,int dly);
void LCD_Command(int cm){ lcd_send_byte(0,cm); }
void LCD_ShiftLeft(void){ lcd_send_byte(0,0x18); } void LCD_ShiftRight(void){ lcd_send_byte(0,0x1C); } void LCD_MoveRight(char p){ char i; for(i=0;i<p;i++){ LCD_ShiftRight(); delay_ms(100); } } void LCD_MoveLeft(char p){ char i; for(i=0;i<p;i++){ LCD_ShiftLeft(); delay_ms(100); } } void strcpy(char*s1,char*s2) { while(*s1++ = *s2++); } void LCD_String(char*s, int dly) { while(*s!=0) { lcd_putc(*s++); delay_ms(dly); } }
|