embeded/AVR (ATmega,ATtiny)2013. 12. 24. 23:54
명령어와 데이터 관련 GPIO 제어루틴

귀찮으니 대충 정리해서
명령어는
Step 1. RS/RW가 동시에 Low로 이동 (40ns delay)
Step 2. E가 High로 이동 / Data 설정(상위 4비트)
Step 3. E가 Low로 이동 (10ns delay)
Step 4. RW 해제
 

Step 5. RS/RW가 동시에 Low로 이동
Step 6. E가 High로 이동 / Data 설정 (하위 4비트) - Step 2 반복
Step 7. E가 Low로 이동 (10ns delay) - Step 3 반복
Step 8. RS/RW가 동시에 High로 이동

DDRAM/CGRAM 데이터는
Step 1. RS는 High RW는 Low로 이동 (40ns delay)
Step 2. E가 High로 이동 / Data 설정(상위 4비트)
Step 3. E가 Low로 이동 (10ns delay)
Step 4. RW 해제
 

Step 5. RS는 High RW는 Low로 이동
Step 6. E가 High로 이동 / Data 설정 (하위 4비트) - Step 2 반복
Step 7. E가 Low로 이동 (10ns delay) - Step 3 반복
Step 8. RS/RW가 동시에 High로 이동


01#define CLCD_RS 0x01
02#define CLCD_RW 0x02
03#define CLCD_E  0x04
04 
05#define DEFAULT_DLY 20
06 
07void ls1628_write_cmd(char cmd)
08{
09    /**************************************/
10    // set RS & R/W
11    PORTC = 0x00;
12 
13    // set E clock to high
14    _delay_us(DEFAULT_DLY); // 40ns delay
15    PORTC |= CLCD_E;
16 
17    // data set - high nibble
18    PORTC |= (cmd & 0xF0);
19    _delay_us(DEFAULT_DLY); // 80ns delay
20 
21    // set E clock to low
22    PORTC &= (~CLCD_E);
23    _delay_us(DEFAULT_DLY); // 10ns delay
24 
25    // release RW
26    PORTC &= (~CLCD_RW);
27 
28 
29    /**************************************/
30    // set RS & R/W
31    PORTC = 0x00;
32 
33    // set E clock to high
34    _delay_us(DEFAULT_DLY); // 40ns delay
35    PORTC |= CLCD_E;
36 
37    // data set - low nibble
38    PORTC |= ((cmd & 0x0F) << 4);
39    _delay_us(DEFAULT_DLY); // 80ns delay
40 
41    // set E clock to low
42    PORTC &= (~CLCD_E);
43    _delay_us(DEFAULT_DLY); // 10ns delay
44 
45    // release RW
46    PORTC &= (~CLCD_RW);
47}
48 
49void ls1628_write_char(char data)
50{
51    /**************************************/
52    // set RS & R/W
53    PORTC = CLCD_RS;
54 
55    // set E clock to high
56    _delay_us(DEFAULT_DLY); // 40ns delay
57    PORTC |= CLCD_E;
58 
59    // data set - high nibble
60    PORTC |= (data & 0xF0);
61    _delay_us(DEFAULT_DLY); // 80ns delay
62 
63    // set E clock to low
64    PORTC &= (~CLCD_E);
65    _delay_us(DEFAULT_DLY); // 10ns delay
66 
67    // release RW
68    PORTC &= (~CLCD_RW);
69 
70 
71    /**************************************/
72    // set RS & R/W
73    PORTC = CLCD_RS;
74 
75    // set E clock to high
76    _delay_us(DEFAULT_DLY); // 40ns delay
77    PORTC |= CLCD_E;
78 
79    // data set - low nibble
80    PORTC |= ((data & 0x0F) << 4);
81    _delay_us(DEFAULT_DLY); // 80ns delay
82 
83    // set E clock to low
84    PORTC &= (~CLCD_E);
85    _delay_us(DEFAULT_DLY); // 10ns delay
86 
87    // release RW
88    PORTC &= (~CLCD_RW);
89}

CLCD 초기화는 아래와 같이 수행해 준다.
그런데.. Function set 이후에 왜 E를 High로 해주어야 하는건지... 이유를 모르겠다!!!
01#define CMD_CLS 0x01    // Clear Display
02#define CMD_RTH 0x02    // Return HOME
03#define CMD_MOD 0x04    // Entry Mode Set
04    #define MOD_INC 0x02
05    #define MOD_DEC 0x00
06    #define MOD_SHL 0x01
07    #define MOD_SHR 0x00
08#define CMD_DIS 0x08    // Display on/off
09    #define DIS_ON  0x04
10    #define DIS_CUR 0x02
11    #define DIS_BLK 0x01
12#define CMD_CUR 0x10    // Cursor or Display Shift
13    #define CUR_CUR 0x08
14    #define CUR_ALL 0x00
15    #define CUR_LEF 0x04
16    #define CUR_RIG 0x00
17#define CMD_FNC 0x20    // Function Set
18    #define FNC_DL8 0x10
19    #define FNC_DL4 0x00
20    #define FNC_DN2 0x08
21    #define FNC_DN1 0x00
22    #define FNC_H10 0x04
23    #define FNC_H07 0x00
24#define CMD_CGA 0x40    // Set CGRAM Address
25    #define CRA_ADR 0x3F
26#define CMD_DDA 0x80    // Set DDRAM Address
27 
28void init_clcd(void)
29{
30    _delay_ms(50);
31    ls1628_write_cmd(CMD_FNC | FNC_DL4 | FNC_DN2 | FNC_H07);    // fuction set
32    PORTC = CLCD_E; // unknown
33 
34    _delay_us(80);                                              // 39 us wait
35    ls1628_write_cmd(CMD_DIS | DIS_ON | DIS_CUR | DIS_BLK);     // disp on/off control
36    _delay_us(80);                                              // 39 us wait
37    ls1628_write_cmd(CMD_CLS);                                  // disp clear
38    _delay_ms(2);                                               // 1.53ms wait
39    ls1628_write_cmd(CMD_MOD | MOD_INC | MOD_SHR);              // entry mode set CMD_MOD
40    _delay_us(80);
41    ls1628_write_cmd(CMD_DDA);
42    _delay_us(80);
43}

'embeded > AVR (ATmega,ATtiny)' 카테고리의 다른 글

ATtiny2313 / ATmega8 인공호흡!  (0) 2013.12.27
ATmega128 + LC1628 제어하기 3  (2) 2013.12.25
ATmega128 + LC1628 제어하기 1  (0) 2013.12.24
lc1628 예제 소스  (0) 2013.12.20
Atmega8 으앙 쥬금!!! ㅠㅠ  (0) 2013.12.20
Posted by 구차니