1 | #include <msp430g2553.h>
|
2 |
|
3 | // Definitions
|
4 | #define DR P1OUT = P1OUT | BIT4 // define RS high
|
5 | #define CWR P1OUT = P1OUT & (~BIT4) // define RS low
|
6 | #define READ P1OUT = P1OUT | BIT5 // define Read signal R/W = 1 for reading
|
7 | #define WRITE P1OUT = P1OUT & (~BIT5) // define Write signal R/W = 0 for writing
|
8 | #define ENABLE_HIGH P1OUT = P1OUT | BIT6 // define Enable high signal
|
9 | #define ENABLE_LOW P1OUT = P1OUT & (~BIT6) // define Enable Low signal
|
10 |
|
11 | // Function Prototypes
|
12 | void data_write(void);
|
13 | void data_read(void);
|
14 | void check_busy(void);
|
15 | void send_command(unsigned char cmd);
|
16 | void send_data(unsigned char data);
|
17 | void send_string(char *s);
|
18 | void lcd_init(void);
|
19 |
|
20 | //===================================================================================//
|
21 | // DATA_WRITE
|
22 | //===================================================================================//
|
23 | void data_write(void)
|
24 | {
|
25 | ENABLE_HIGH;
|
26 | __delay_cycles(40000);
|
27 | ENABLE_LOW;
|
28 | }
|
29 |
|
30 | //===================================================================================//
|
31 | // DATA_READ
|
32 | //===================================================================================//
|
33 | void data_read(void)
|
34 | {
|
35 | ENABLE_LOW;
|
36 | __delay_cycles(40000);
|
37 | ENABLE_HIGH;
|
38 | }
|
39 |
|
40 | //===================================================================================//
|
41 | // DATA_WRITE
|
42 | //===================================================================================//
|
43 | void check_busy(void)
|
44 | {
|
45 | P1DIR &= ~(BIT3); // make P1.3 as input
|
46 | while ((P1IN & BIT3) == 1)
|
47 | {
|
48 | data_read();
|
49 | }
|
50 | P1DIR |= BIT3; // make P1.3 as output
|
51 | }
|
52 |
|
53 | //===================================================================================//
|
54 | // SEND_COMMAND
|
55 | //===================================================================================//
|
56 | void send_command(unsigned char cmd)
|
57 | {
|
58 | check_busy();
|
59 | WRITE;
|
60 | CWR;
|
61 | P1OUT = (P1OUT & 0xF0) | ((cmd >> 4) & 0x0F); // send higher nibble
|
62 | data_write(); // give enable trigger
|
63 | P1OUT = (P1OUT & 0xF0) | (cmd & 0x0F); // send lower nibble
|
64 | data_write(); // give enable trigger
|
65 | }
|
66 |
|
67 | //===================================================================================//
|
68 | // SEND_DATA
|
69 | //===================================================================================//
|
70 | void send_data(unsigned char data)
|
71 | {
|
72 | check_busy();
|
73 | WRITE;
|
74 | DR;
|
75 | P1OUT = (P1OUT & 0xF0) | ((data >> 4) & 0x0F); // send higher nibble
|
76 | data_write(); // give enable trigger
|
77 | P1OUT = (P1OUT & 0xF0) | (data & 0x0F); // send lower nibble
|
78 | data_write(); // give enable trigger
|
79 | }
|
80 |
|
81 | //===================================================================================//
|
82 | // SEND_STRING
|
83 | //===================================================================================//
|
84 | void send_string(char *s)
|
85 | {
|
86 | while (s)
|
87 | {
|
88 | send_data(*s);
|
89 | s++;
|
90 | }
|
91 | }
|
92 |
|
93 | //===================================================================================//
|
94 | // LCD_INIT
|
95 | //===================================================================================//
|
96 | void lcd_init(void)
|
97 | {
|
98 | P2OUT &= 0x00;
|
99 | P2DIR &= 0x00;
|
100 |
|
101 | P1DIR |= 0xFF;
|
102 | P1OUT &= 0x00;
|
103 | send_command(0x33);
|
104 | send_command(0x32);
|
105 | send_command(0x28); // 4 bit mode
|
106 | send_command(0x0E); // clear the screen
|
107 | send_command(0x01); // display on cursor on
|
108 | send_command(0x06); // increment cursor
|
109 | send_command(0x80); // row 1 column 1
|
110 | }
|