Micom_Electric/GLCD_CLCD_TFT 2012. 1. 23. 13:47
윤교수님 한글 GLCD 라이브러리 수정중인데
지난 포스팅까지 일단 제어는 성공
그런데 포트에서 제어핀으로 사용하지 않은 잔여핀도 제어가 변하는 현상이
일단 핀이 아까운 경우가 발생하므로 다른 한글라이브러리 처럼
제어핀 콘트롤 독립화 -영향 제거

아직 어딘가 문제가 있는듯
..
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;
}
 
 
posted by 털보네i
: