uAVR
윤덕용 교수님의 한글 GLCD 라이브러리 - 하위 제어포트 살리기
DIYworld
2017. 1. 21. 15:57
윤교수님 한글 GLCD 라이브러리 수정중인데
지난 포스팅까지 일단 제어는 성공
그런데 포트에서 제어핀으로 사용하지 않은 잔여핀도 제어가 변하는 현상이
일단 핀이 아까운 경우가 발생하므로 다른 한글라이브러리 처럼
제어핀 콘트롤 독립화 -영향 제거
아직 어딘가 문제가 있는듯
..
GLCD 제어 기본원리는 = http://blog.naver.com/freehuds?Redirect=Log&logNo=100074004932
수정할 곳
다른 곳에서 얻어온 소스 주입
지난 포스팅까지 일단 제어는 성공
그런데 포트에서 제어핀으로 사용하지 않은 잔여핀도 제어가 변하는 현상이
일단 핀이 아까운 경우가 발생하므로 다른 한글라이브러리 처럼
제어핀 콘트롤 독립화 -영향 제거
아직 어딘가 문제가 있는듯
..
GLCD 제어 기본원리는 = http://blog.naver.com/freehuds?Redirect=Log&logNo=100074004932
수정할 곳
다른 곳에서 얻어온 소스 주입
* LCD_DATABUS(0x2000) : D0-D7 = DB0-DB7 (7-14, data bus) */ /* LCD_CONTROL(0x2100) : D3 = R/-W (5, read/write) */ /* D4 = D/-I (4, data/instruction) */ /* D5 = E (6, enable) */ /* D6 = CS1 (15, chip select 1) */ /* D7 = CS2 (16, chip select 2) */ #define LCD_DATABUS PORTD // LCD/GLCD data #define LCD_DATA_PIN PIND // Added to read data #define LCD_DATA_DIR DDRD #define LCD_CONTROL PORTF // LCD/GLCD control signal #define LCD_CTRL_DIR DDRF #define LCD_CTRL_PIN PINF // Added to read data #define RW 3 #define RS 4 #define G_E 5 #define G_CS1 6 #define G_CS2 7 #define RS_DATA LCD_CONTROL|=_BV(RS) #define RS_CMD LCD_CONTROL&=~_BV(RS) #define RW_READ LCD_CONTROL|=_BV(RW) #define RW_WRITE LCD_CONTROL&=~_BV(RW) #define E_ON LCD_CONTROL|=_BV(G_E) #define E_OFF LCD_CONTROL&=~_BV(G_E) #define CS1_ON LCD_CONTROL|=_BV(G_CS1) #define CS1_OFF LCD_CONTROL&=~_BV(G_CS1) #define CS2_ON LCD_CONTROL|=_BV(G_CS2) #define CS2_OFF LCD_CONTROL&=~_BV(G_CS2) 기본 GLCD 제어 루틴 수정 - 원래 포트 데이터 건드리지 않게 수정 // ---------------------------------------------------------------------------- void GLCD_command(uint8_t signal,uint8_t command) /* write a command */ { //LCD_CONTROL = (signal & 0xC0); // D/-I = 0 if(signal == 0x40){ CS1_ON; CS2_OFF; }else if(signal == 0x80){ CS1_OFF; CS2_ON; }else{ CS1_ON; CS2_ON; } RS_CMD; RW_WRITE; asm volatile(" PUSH R0 "); // delay for 500 ns asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); LCD_DATABUS = command; // write command //LCD_CONTROL |= (signal & 0xC0)|0x20; // E = 1 E_ON; asm volatile(" PUSH R0 "); // delay for 500 ns asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); //LCD_CONTROL = signal & 0xC0; // E = 0 E_OFF; asm volatile(" NOP "); //LCD_CONTROL = 0x00; // clear all control signals Delay_us(10); // wait for GLCD busy } // ---------------------------------------------------------------------------- void GLCD_data(uint8_t signal,uint8_t character) /* write a data */ { //LCD_CONTROL = (signal & 0xC0)|0x10; // D/-I = 1 if(signal == 0x40){ CS1_ON; CS2_OFF; }else{ CS1_OFF; CS2_ON; } RS_DATA; RW_WRITE; asm volatile(" PUSH R0 "); // delay for 500 ns asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); LCD_DATABUS = character; // write data //LCD_CONTROL = (signal & 0xC0)|0x30; // E = 1 E_ON; asm volatile(" PUSH R0 "); // delay for 500 ns asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); //LCD_CONTROL = (signal & 0xC0)|0x10; // E = 0 E_OFF; asm volatile(" NOP "); //LCD_CONTROL = 0x00; // clear all control signals Delay_us(10); // wait GLCD busy } // ---------------------------------------------------------------------------- unsigned char GLCD_data_RD(uint8_t cols) // Read a data { unsigned char data=0, signal; if(cols < 64) // if y <= 7, CS1 signal = 0x40; else // if y >= 8, CS2 signal = 0x80; //LCD_CONTROL = (signal & 0xC0)|0x10; // RS = 1 => PD4 if(signal == 0x40){ CS1_ON; CS2_OFF; }else{ CS1_OFF; CS2_ON; } RS_DATA; asm volatile(" PUSH R0 "); // delay for 500 ns asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); //LCD_CONTROL |= 0x08; // Set Read; RW = PD3 RW_READ; LCD_DATA_DIR = 0x00; LCD_DATABUS = 0x00; //LCD_CONTROL |= (signal & 0xC0)|0x30; // E = 1 E_ON; asm volatile(" PUSH R0 "); // delay for 500 ns asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); data = LCD_DATA_PIN; //LCD_CONTROL = (signal & 0xC0)|0x10; // E = 0 E_OFF; asm volatile(" NOP "); //LCD_CONTROL &= ~0x08; // Set Write ; RW = PD3 RW_WRITE; LCD_DATA_DIR = 0xFF; LCD_DATABUS = 0x00; //LCD_CONTROL = 0x00; // clear all control signals Delay_us(10); // wait GLCD busy return data; }