명령어와 데이터 관련 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로 이동
CLCD 초기화는 아래와 같이 수행해 준다.
그런데.. Function set 이후에 왜 E를 High로 해주어야 하는건지... 이유를 모르겠다!!!
귀찮으니 대충 정리해서
명령어는
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 |
07 | void 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 |
49 | void 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 |
28 | void 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 |