Subversion Repositories Code-Repo

Rev

Details | Last modification | View Log | RSS feed

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