0,0 → 1,299 |
|
/****************************************************************/ |
/* */ |
/* NG-Video 5,8GHz */ |
/* */ |
/* Copyright (C) 2011 - gebad */ |
/* */ |
/* This code is distributed under the GNU Public License */ |
/* which can be found at http://www.gnu.org/licenses/gpl.txt */ |
/* */ |
/* using DOGM-Library 1.0. */ |
/* Copyright (C) 2010-averyfarwaydate Luca Bertoncello */ |
/* Hartigstrasse, 12 - 01127 Dresden Deutschland */ |
/* E-Mail: lucabert@lucabert.de, lucabert@lucabert.com */ |
/* http://www.lucabert.de/ http://www.lucabert.com/ */ |
/****************************************************************/ |
|
#include <util/delay.h> |
|
#include "config.h" |
#include "dogm.h" |
#include <avr/pgmspace.h> |
#include <string.h> |
|
// Instruktionen mit ST7036 4 Bit Mode im "Extension mode" |
#define CLEAR_DISPLAY 0b00000001 |
#define FUNCTION_SET_INIT_0 0b00110011 // 0x30 & 0x30 als nibble |
#define FUNCTION_SET_INIT_1 0b00110010 // 0x30 & 0x20 als nibble |
#define FUNCTION_SET_INIT_2 0b00101001 // 0x29 4-bit, 2 Zeilen, kein DoubleHeight, InstructionTable1 |
#define INSTRUCTION_Table_0 0b00101000 // Instruction table 0 |
#define INSTRUCTION_Table_1 0b00101001 // Instruction table 1 |
#define SET_CGRAM 0b01000000 // für user defined Char |
#define BIAS_SET 0b00010101 // table 1 DB3=Bias 1/4, DB0=3 Zeilen 0b00011101 |
#define FOLLOWER_CONTROL 0b01101110 // nach Datenblattbsp. 3,3V DOGM bei 5V 0b01101100 |
#define CONTRAST_SET 0b01110000 // Kontrastwert Bit3 bis Bit0 |
#define POWER_CONTRAST 0b01010100 // Bit1 und Bit0 entspricht Kontrastwert Bit5 und Bit4 3,3V 0b0101 0100 5V 0b0101 0000 |
#define DISPLAY_ON 0b00001100 |
#define ENTRY_MODE 0b00000110 // Cursor Auto-Increment |
#define SET_DDRAM_ADDR 0b10000000 // Bit7 bis Bit0 Adresse |
#define BS 3 // 0 - 1/5 bias // 1 - 1/4 bias |
#define RAB1 1 // select follower amplified ratio |
#define BON 2 // set booster circuit on/off bei Power_Contrast |
|
#define lcdSetEnable() LCD_E_PORT |= (1<<LCD_ENABLE); |
#define lcdClearEnable() LCD_E_PORT &= ~(1<<LCD_ENABLE); |
#define lcdSetRegSelect() LCD_RS_PORT |= (1<<LCD_REGSELECT) |
#define lcdClearRegSelect() LCD_RS_PORT &= ~(1<<LCD_REGSELECT) |
|
uint8_t CursorPos; // ersetzt lesen der aktuellen LCD-CursorPosition |
|
/************************************************************************************/ |
/* sendet ein Nibble (4 Bit) zum LCD-Controller */ |
/* Parameter: */ |
/* char data :Byte */ |
/* */ |
/************************************************************************************/ |
void lcdSendNibble(char data) |
{ |
LCD_DATA_PORT |= (data & 0x0f); |
LCD_DATA_PORT &= (data | 0xf0); |
lcdSetEnable(); |
_delay_us(2); |
lcdClearEnable(); |
_delay_us(30); // nach Datenblatt > 26,3µs |
} |
|
/************************************************************************************/ |
/* sendet 8 Bit (2 Nibble) zum LCD-Controller */ |
/* Parameter: */ |
/* char data :Byte */ |
/* */ |
/************************************************************************************/ |
void lcdSendByte(char data) |
{ |
lcdSendNibble(data>>4); |
lcdSendNibble(data); |
} |
|
/************************************************************************************/ |
/* sendet instruction zum LCD-Controller */ |
/* Parameter: */ |
/* char instruction :Byte */ |
/* */ |
/************************************************************************************/ |
void lcdSendInstruction(char instruction) |
{ |
lcdClearRegSelect(); // LCD-RS für Instruktionen |
lcdSendByte(instruction); |
} |
|
/************************************************************************************/ |
/* sendet ein Zeichen zum LCD-Display */ |
/* Parameter: */ |
/* char c :Zeichen */ |
/* */ |
/************************************************************************************/ |
void lcdSendC(char c) |
{ |
lcdSetRegSelect(); // LCD-RS für Daten |
lcdSendByte(c); |
} |
|
/************************************************************************************/ |
/* sendet ein Zeichen zum LCD-Display */ |
/* Parameter: */ |
/* char c :Zeichen */ |
/* */ |
/************************************************************************************/ |
void lcdPutc(char c) |
{ |
lcdSendC(c); |
CursorPos++; |
if (CursorPos >= (LCD_LINES * LCD_COLS)) CursorPos = 0; |
} |
|
/************************************************************************************/ |
/* sendet einen String zum LCD-Display */ |
/* Parameter: */ |
/* char *str :Zeichenkette */ |
/* */ |
/************************************************************************************/ |
void lcdPuts(char *str) |
{ uint8_t pos = CursorPos / LCD_COLS; |
|
while (*str) { |
if (*str == '\n') { |
if (pos >= LCD_LINES) |
pos = 0; |
else |
pos++; |
lcdGotoXY(0, pos); |
} |
else |
lcdPutc(*str); |
str++; |
} |
} |
|
/************************************************************************************/ |
/* stellt eine String mittig auf Display dar */ |
/* Parameter: */ |
/* char *str : darzustellende Zeichenkette */ |
/* uint8_t zle : Display-Zeile */ |
/* */ |
/************************************************************************************/ |
void lcdPutStrMid(char *str, uint8_t zle) |
{ int8_t x; |
|
lcdClearLine(zle); |
x = (LCD_COLS - strlen(str))/2; // Array-String mittig schreiben |
lcdGotoXY(x,zle); |
lcdPuts(str); |
} |
|
/************************************************************************/ |
/* Definieren eines Sonderzeichen */ |
/* Parameter: */ |
/* uint8_t lcd_addr : Adresse, 1.Adresse 0 */ |
/* char *lcd_zeichen: Zeiger auf das 1. Byte der Zeichendefinition */ |
/* */ |
/************************************************************************/ |
void lcdWriteCGRAM(uint8_t lcd_addr, char *lcdChr) |
{ int8_t i; |
|
lcdSendInstruction(INSTRUCTION_Table_0); |
for(i = 0; i < 8; i++) |
{ |
lcdSendInstruction(SET_CGRAM | (lcd_addr * 8 + i)); // CG RAM Adresse |
//lcdPutc(lcdChr[i]); // Data Write 8x Pixelzeile |
lcdPutc(pgm_read_byte(&lcdChr[i])); // array im Flash |
} |
lcdSendInstruction(INSTRUCTION_Table_1); |
} |
|
/************************************************************************/ |
/* Definieren von n <= 8 Sonderzeichen */ |
/* Parameter: */ |
/* SpecialChr_t lcdChr : Array mit Sonderzeichen */ |
/* uint8_t quantity : Anzahl der zu übertragenen Sonderzeichen */ |
/* */ |
/************************************************************************/ |
void lcdWriteCGRAM_Array(SpecialChr_t *lcdChr, uint8_t quantity) |
{ |
for (uint8_t i = 0; i < quantity; i++) |
lcdWriteCGRAM(i, lcdChr[i]); // Sonderzeichen in CGRAM der LCD schreiben |
} |
|
/************************************************************************************/ |
/* Löscht Inhalt auf LCD-Display */ |
/* */ |
/************************************************************************************/ |
void lcdClear() |
{ |
lcdSendInstruction(CLEAR_DISPLAY); |
CursorPos = 0; |
_delay_ms(2); |
} |
|
/************************************************************************************/ |
/* Löscht Inhalt ab Cursorposition bis Zeilenende auf LCD-Display */ |
/* CursorPos bleibt auf ab zu löschenden Zeichen */ |
/* */ |
/************************************************************************************/ |
void lcdClearEOL() |
{ uint8_t cp = CursorPos % LCD_COLS; |
|
if (cp > 0) //falls letztes Zeichen auf letzte Spalte geschrieben, nicht nächste Zeile löschen |
for (; cp < LCD_COLS; cp++) lcdSendC(' '); |
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos); |
} |
|
/************************************************************************************/ |
/* Löscht Inhalt der angegebenen Zeile auf LCD-Display */ |
/* CursorPos bleibt auf Zeilenanfang */ |
/* */ |
/************************************************************************************/ |
void lcdClearLine(uint8_t y) |
{ |
lcdGotoXY(0, y); |
for (uint8_t x = 0; x < LCD_COLS; x++) lcdSendC(' '); |
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos); |
} |
|
/************************************************************************************/ |
/* Setzt Kontrast auf LCD-Display */ |
/* Parameter: */ |
/* uint8_t contrast :Wert vo 0 bis max 63 */ |
/* */ |
/************************************************************************************/ |
void lcdContrast(uint8_t dogm, uint8_t contrast) |
{ uint8_t power_contrast = POWER_CONTRAST; |
|
if(dogm == DOGM5V) { |
power_contrast &= ~(1<<BON); |
} |
lcdSendInstruction(INSTRUCTION_Table_1); |
lcdSendInstruction(CONTRAST_SET | (contrast & 0x0F)); |
lcdSendInstruction(power_contrast | ((contrast>>4) & 0x03)); |
} |
|
//***********************************************************************************/ |
/* Setzt setzt den Cursor zur Position x/y */ |
/* Parameter: */ |
/* uint8_t x, :Position Spalte */ |
/* uint8_t y, :Position Zeile */ |
/* */ |
/************************************************************************************/ |
void lcdGotoXY(uint8_t x, uint8_t y) |
{ |
if(x > LCD_COLS) x = 0; |
if(y > LCD_LINES) y = 0; |
CursorPos = y * LCD_COLS + x; |
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos); |
} |
|
/************************************************************************************/ |
/* Initialisiert den LCD-Controller und der Atmega-Ausgänge */ |
/* Parameter: */ |
/* uint8_t dogm :0=3,3V oder 1=5V DOGM */ |
/* uint8_t contrast :Wert vo 0 bis max 63 */ |
/* uint8_t cursor :Darstellung des Cursors ein oder 0 aus */ |
/* uint8_t blink :Cursor blinken, 0 kein blinken */ |
/* */ |
/************************************************************************************/ |
void lcdInit(uint8_t dogm, uint8_t contrast, uint8_t cursor, uint8_t blink) |
{ uint8_t bias_set = BIAS_SET; |
uint8_t follower_ctrl = FOLLOWER_CONTROL; |
uint8_t power_contrast = POWER_CONTRAST; |
|
LCD_BACKLIGHT_DDR |= (1<<LCD_BACKLIGHT); |
LCD_E_DDR |= (1<<LCD_ENABLE); |
LCD_RS_DDR |= (1<<LCD_REGSELECT); |
LCD_DATA_DDR |= (1<<LCD_DATA7) | (1<<LCD_DATA6) | (1<<LCD_DATA5) | (1<<LCD_DATA4); |
|
lcdClearEnable(); |
_delay_ms(40); // lt. Datenblatt muss > 40ms nach Power On or ext. Reset |
|
if(dogm == DOGM5V) { |
follower_ctrl &= ~(1<<RAB1); |
bias_set |= (1 << BS); |
power_contrast &= ~(1<<BON); |
} |
|
//Initialisierung für DOGM (mit ST7036) 4 Bit Mode |
lcdClearRegSelect(); // LCD-RS für Instruktionen |
lcdSendNibble(FUNCTION_SET_INIT_0>>4); |
_delay_ms(2); // lt. Datenblatt muss > 1,6ms Pause nach ersten Nibble |
lcdSendNibble(FUNCTION_SET_INIT_0); |
lcdSendInstruction(FUNCTION_SET_INIT_1); |
lcdSendInstruction(FUNCTION_SET_INIT_2); |
lcdSendInstruction(bias_set); |
lcdSendInstruction(CONTRAST_SET | (contrast & 0x0F)); |
lcdSendInstruction(power_contrast | ((contrast>>4) & 0x03)); |
lcdSendInstruction(follower_ctrl); |
lcdSendInstruction(INSTRUCTION_Table_0); |
lcdSendInstruction(DISPLAY_ON | (cursor & 0x01) << 1 | (blink & 0x01)); |
lcdClear(); |
lcdSendInstruction(ENTRY_MODE); |
} |