Subversion Repositories Code-Repo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
148 Kevin 1
#include "oled_NHD-0216KZW-AB5.h"
2
#include "defines.h"
3
#include <delays.h>
4
#include <string.h>
5
#include <stdio.h>
6
 
7
static OLED_CHAR_DATA oled_char_data;
8
static OLED_CHAR_DATA *oled_char_data_p = &oled_char_data;
9
 
10
void NHD_Init() {
11
    PARALLEL_RS_TRIS = 0;
12
    PARALLEL_RW_TRIS = 0;
13
    PARALLEL_EN_TRIS = 0;
14
 
15
    PARALLEL_D4_TRIS = 0;
16
    PARALLEL_D5_TRIS = 0;
17
    PARALLEL_D6_TRIS = 0;
18
    PARALLEL_D7_TRIS = 0;
19
 
20
    oled_char_data_p->display_function = LCD_FUNCTIONSET | LCD_4BITMODE;
21
}
22
 
23
void NHD_Begin(char cols, char rows) {
24
    oled_char_data_p->num_lines = rows;
25
    oled_char_data_p->current_line = 0;
26
 
27
    PARALLEL_RS_LAT = 0;
28
    PARALLEL_RW_LAT = 0;
29
    PARALLEL_EN_LAT = 0;
30
 
31
    PARALLEL_D4_LAT = 0;
32
    PARALLEL_D5_LAT = 0;
33
    PARALLEL_D6_LAT = 0;
34
    PARALLEL_D7_LAT = 0;
35
 
36
    Delay10KTCYx(1);    // ~1ms
37
 
38
    // Initialization sequence
39
    NHD_Write_4_Bits(0x3);
40
    NHD_Write_4_Bits(0x2);
41
    NHD_Write_4_Bits(0x2);
42
    NHD_Write_4_Bits(0x8);
43
    NHD_Wait_For_Ready();
44
 
45
    NHD_Send_Command(0x08);  // Turn Off
46
    NHD_Send_Command(0x01);  // Clear Display
47
    NHD_Send_Command(0x06);  // Set Entry Mode
48
    NHD_Send_Command(0x02);  // Return to Home Position
49
    NHD_Send_Command(0x0C);  // Turn On
50
}
51
 
52
void NHD_Clear() {
53
    NHD_Send_Command(LCD_CLEARDISPLAY);
54
}
55
 
56
void NHD_Home() {
57
    NHD_Send_Command(LCD_RETURNHOME);
58
}
59
 
60
void NHD_Set_Cursor(unsigned char col, unsigned char row) {
61
    unsigned char row_offsets[] = {0x00, 0x40, 0x14, 0x54};
62
    if (row >= oled_char_data_p->num_lines) {
63
        row = 0;
64
    }
65
    NHD_Send_Command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
66
}
67
 
68
void NHD_Display(char option) {
69
    if (option) {
70
        oled_char_data_p->display_control |= LCD_DISPLAYON;
71
    } else {
72
        oled_char_data_p->display_control &= ~LCD_DISPLAYON;
73
    }
74
    NHD_Send_Command(LCD_DISPLAYCONTROL | oled_char_data_p->display_control);
75
}
76
 
77
void NHD_Blink(char option) {
78
    if (option) {
79
        oled_char_data_p->display_control |= LCD_BLINKON;
80
    } else {
81
        oled_char_data_p->display_control &= ~LCD_BLINKON;
82
    }
83
    NHD_Send_Command(LCD_DISPLAYCONTROL | oled_char_data_p->display_control);
84
}
85
 
86
void NHD_Cursor(char option) {
87
    if (option) {
88
        oled_char_data_p->display_control |= LCD_CURSORON;
89
    } else {
90
        oled_char_data_p->display_control &= ~LCD_CURSORON;
91
    }
92
    NHD_Send_Command(LCD_DISPLAYCONTROL | oled_char_data_p->display_control);
93
}
94
 
95
void NHD_Scroll_Display_Left() {
96
    NHD_Send_Command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
97
}
98
 
99
void NHD_Scroll_Display_Right() {
100
    NHD_Send_Command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
101
}
102
 
103
void NHD_Left_To_Rigtht() {
104
    oled_char_data_p->display_mode |= LCD_ENTRYLEFT;
105
    NHD_Send_Command(LCD_ENTRYMODESET | oled_char_data_p->display_mode);
106
}
107
 
108
void NHD_Right_To_Left() {
109
    oled_char_data_p->display_mode &= ~LCD_ENTRYLEFT;
110
    NHD_Send_Command(LCD_ENTRYMODESET | oled_char_data_p->display_mode);
111
}
112
 
113
void NHD_Autoscroll(char option) {
114
    if (option) {
115
        oled_char_data_p->display_mode |= LCD_ENTRYSHIFTINCREMENT;
116
    } else {
117
        oled_char_data_p->display_mode &= ~LCD_ENTRYSHIFTINCREMENT;
118
    }
119
    NHD_Send_Command(LCD_ENTRYMODESET | oled_char_data_p->display_mode);
120
}
121
 
122
void NHD_Create_Char(unsigned char location, unsigned char *charmap) {
123
    char i;
124
    location &= 0x7;
125
    NHD_Send_Command(LCD_SETCGRAMADDR | (location << 3));
126
    for (i = 0; i < 8; i++) {
127
        NHD_Send_Data(charmap[i]);
128
    }
129
}
130
 
131
void NHD_Send_Command(unsigned char value) {
132
    PARALLEL_RS_LAT = 0;
133
    PARALLEL_RW_LAT = 0;
134
    NHD_Write_4_Bits(value>>4);
135
    NHD_Write_4_Bits(value);
136
    NHD_Wait_For_Ready();
137
}
138
 
139
void NHD_Send_Data(unsigned char value) {
140
    PARALLEL_RS_LAT = 1;
141
    PARALLEL_RW_LAT = 0;
142
    NHD_Write_4_Bits(value>>4);
143
    NHD_Write_4_Bits(value);
144
    NHD_Wait_For_Ready();
145
}
146
 
147
void NHD_Pulse_Enable(void) {
148
    PARALLEL_EN_LAT = 1;
149
    Nop();
150
    Nop();
151
    PARALLEL_EN_LAT = 0;
152
}
153
 
154
void NHD_Write_4_Bits(unsigned char value) {
155
    PARALLEL_D4_LAT = (value) & 0x01;
156
    PARALLEL_D5_LAT = (value>>1) & 0x01;
157
    PARALLEL_D6_LAT = (value>>2) & 0x01;
158
    PARALLEL_D7_LAT = (value>>3) & 0x01;
159
    NHD_Pulse_Enable();
160
}
161
 
162
void NHD_Wait_For_Ready() {
163
    char busy;
164
    PARALLEL_BUSY_TRIS = 1;
165
    PARALLEL_RS_LAT = 0;
166
    PARALLEL_RW_LAT = 1;
167
    do {
168
        NHD_Pulse_Enable();
169
        Nop();
170
        busy = PARALLEL_BUSY_PORT;
171
        NHD_Pulse_Enable();
172
    } while (busy);
173
    PARALLEL_BUSY_TRIS = 0;
174
    PARALLEL_RW_LAT = 0;
175
}
176
 
177
void NHD_Write_String(const rom char *fmt, ...) {
178
    unsigned char i, len;
179
    unsigned char buffer[NHD_STRING_BUFFER_SIZE];
180
 
181
    // Parse and create string
182
    va_list args;
183
    va_start(args, fmt);
184
    vsprintf((char *) buffer, fmt, args);
185
    va_end(args);
186
    len = strlen((char *) buffer);
187
 
188
    // Make sure string to insert fits in buffer, truncate if necessary
189
    if (len > NHD_STRING_BUFFER_SIZE)
190
        len = NHD_STRING_BUFFER_SIZE;
191
 
192
    // Print buffer to string
193
    for (i = 0; i < len; i++) {
194
        NHD_Send_Data(buffer[i]);
195
    }
196
}