использую Winstar WH1602a-NGG-CP LCD display.
но надо нестандартное включение:
(смотри схему ниже)
Программа тут:
- Код: Выделить всё
/*****************************************************
CodeWizardAVR V1.25.9
Project : lcd-2
Version : 1
Date : 10.02.2010
Author : alex
Company : SVR
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
// ==============================================
// Declare your global variables here
char i;
unsigned char pc;
void init_mylcd(void)
{
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x03; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1); // delay = 1 milisecond
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x03; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
delay_ms(100);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x03; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x02; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x02; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x0C; // init N+F
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x00; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x08; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x00; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x01; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x00; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x07; // init ID+S
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=1; // ïîäíèìàåì RS â 1
delay_ms(220);
}
void WriteIns(unsigned char instruction)
{
unsigned char tmp;
PORTC.4=0; // ïîäíèìàåì RS â 0
tmp=instruction>>4;
// tmp|=0b00100000; // ïîäíèìàåì Å â 1
tmp&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=tmp; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0
// instruction|=0b00100000; // ïîäíèìàåì Å â 1
instruction&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC.4=0; // ïîäíèìàåì RS â 0
PORTC=instruction; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0
delay_ms(100);
}
void WriteData(unsigned char data1)
{
unsigned char tmp1;
PORTC.4=1; // ïîäíèìàåì RS â 1
tmp1=data1>>4;
// tmp1|=0b00110000; // ïîäíèìàåì Å è RS â 1
tmp1&=0b00011111; // ãàñèì ñòàðø.áèòû
PORTC=tmp1; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0
// data1|=0b00110000; // ïîäíèìàåì Å è RS â 1
data1&=0b00011111; // ãàñèì ñòàðø.áèòû
PORTC.4=1; // ïîäíèìàåì RS â 1
PORTC=data1; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0
delay_ms(100);
}
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x7F;
PORTD=0x00;
DDRD=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
delay_ms(500);
init_mylcd();
// ---------------------
i=0;
pc=0;
for (i=0; i<20; i++)
{
WriteIns(0x00); // Óñòàíîâèëè êóð â 1 ïîç ïåð ñòðîê
WriteData(0x44); // âûâåëè "D"
WriteIns(0x01); // âòîð ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x49); // âûâåëè "I"
WriteIns(0x02); // òðåòüÿ ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x47); // âûâåëè "G"
WriteIns(0x03); // ÷åòâåðòàÿ ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x49); // âûâåëè "I"
WriteIns(0x04); // ïÿòàÿ ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x54); // âûâåëè "T"
delay_ms(500);
}
delay_ms(1000);
};
}
Писано "дебильно" потому что я уже задолбался - не работает дисплей - ни одного символа не выводит и инит не проходит. Осциллографом все проверил - все сигналы АТмега8 выдает, ЖКИ сам рабочий - проверял на другом контроллере...
Пайка нормальная - проверил все что можно.
Косяков нет.
ПОМОГИТЕ !!!
саму тему такого нестандартного включения я брал отсюда:
http://www.pocketmagic.net/?p=447