Попал в руки новый дисплей WG12232 (О его управлении прочитал >тут<).
Второй день его мучаю, ни как не могу добиться от него хотя бы точки или символа...
Помогите, пожалуйста, понять, что я не так делаю в коде?
С генерацией всё нормально, 2кГц на него подаю (7вывод) (и, следовательно, МК прошивается нормально).
Распаял тоже всё верно, проверил уже раз 10.
МК: Atmega8535, тактирована кварцем 16МГц
Собственно, код (портировал на CVAVR из вышеуказанной статьи):
Спойлер
Код: Выделить всё
#include <mega8535.h>
#include <delay.h>
interrupt [TIM0_OVF] void timer0_ovf_isr(void){PORTD.7= ~PORTD.7;TCNT0= 0xC2;}
//Команды
#define Display_ON 0b10101111
#define Display_OFF 0b10101110
#define Display_START_Line 0b11000000
#define Set_Page 0b10111000
#define Set_Address 0b00000000
#define ADC_Select_right 0b10100000
#define ADC_Select_back 0b10100001
#define Static_Drive_ON 0b10100101
#define Static_Drive_OFF 0b10100100
#define Duty_Select_0 0b10101000
#define Duty_Select_1 0b10101001
#define Read_Modify_Write 0b11100000
#define END 0b11101110
#define RESET_com 0b11100010
//порт к которому подключена шина данных ЖКД
#define PORT_DATA PORTA
#define PIN_DATA PINA
#define DDR_DATA DDRA
//порт к которому подключены управляющие выводы
#define PORT_SIG PORTC
#define PIN_SIG PINC
#define DDRX_SIG DDRC
//номера выводов микроконтроллера, к которым подключены управляющие выводы ЖКД
#define A0 2
#define RW 3
#define EN 4
#define CS2 5 //L -> Chip2 Enabled!
#define CS1 6 //L -> Chip1 Enabled!
#define RES 7
//макросы для работы с битами
#define ClearBit(reg, bit) reg &= (~(1<<(bit)))
#define SetBit(reg, bit) reg |= (1<<(bit))
void WG12232_write (unsigned char data){//общая часть для функций вывода команд и данных
DDR_DATA = 0xFF;
PORT_DATA = 0x00;
ClearBit(PORT_SIG,RW);//режим записи
SetBit(PORT_SIG,EN);//фронт стробирующего импульса
PORT_DATA = data;//подаём данные
delay_us(2);//длительность стробирующего импульса
ClearBit(PORT_SIG,EN);//спад стробирующего импульса
}
void busy_wait (void){//функция проверки занятости индикатора
SetBit(PORT_SIG,RW);//режим чтения
ClearBit(PORT_SIG,A0);//регистра состояния
PORT_DATA = 0xFF;//с подтягивающими резисторами
DDR_DATA = 0x00;//порт на вход
SetBit(PORT_SIG,EN);//фронт стробирующего импульса
while (!(PIN_DATA & (1<<7)));//ждать выполнения предыдущей команды
ClearBit(PORT_SIG,EN);//спад стробирующего импульса
PORT_DATA = 0x00;//обнуляем порт данных
DDR_DATA = 0xFF;//и переводим его на выход
SetBit(PORT_SIG,RW);//возвращаем режим записи
}
void WG12232_com_write (unsigned char com){//функция ввода команды в индикатор
busy_wait();//проверка готовности LCD
ClearBit(PORT_SIG,A0);//Вывод Ao в 0 (команда)
WG12232_write(com);//подаём команду
}
void WG12232_data_write (unsigned char data){//функция вывода данных на индикатор
busy_wait();//проверка готовности LCD
SetBit(PORT_SIG,A0);//вывод Ao в 1 (данные)
WG12232_write(data);//подаём данные
}
void WG12232_clear (void){//функция очистки видео ОЗУ, соответсвтенно экрана
unsigned char V_page,i;//внутренние переменные
ClearBit(PORT_SIG,CS1);//выбираем оба кристалла
ClearBit(PORT_SIG,CS2);
for(V_page=0;V_page<4;V_page++)//для всех страниц
{
WG12232_com_write(Set_Page | V_page);
WG12232_com_write(Set_Address);//и адресов
for (i=0;i<61;i++) WG12232_data_write(0);//пишем нули
}
}
//функция чтения данных из видео ОЗУ
unsigned char WG12232_data_read (unsigned char page, unsigned char addr){
unsigned char data;
if((page>3) || (addr>60)){return(0x00);}//проверяем не вышли ли за границы
WG12232_com_write(Set_Page | page);//установить адрес по вертикали
WG12232_com_write(Set_Address | addr);//установить адрес по горизонтали
ClearBit(PORT_SIG,RW);//режим чтения
SetBit(PORT_SIG,A0);//данных
PORT_DATA = 0xFF;//с подтягивающими резисторами
DDR_DATA = 0x00;//порт на вход
busy_wait();//проверка готовности LCD
SetBit(PORT_SIG,EN);//фронт стробирующего импульса
delay_us(10);
data = PIN_DATA;//считать данные
ClearBit(PORT_SIG,EN);//спад стробирующего импульса
PORT_DATA = 0x00;//обнуляем порт данных
DDR_DATA = 0xFF;//и переводим его на выход
ClearBit(PORT_SIG,RW);//возвращаем режим записи
return(data);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void InitLcd(void){
//настраиваем порты ввода/вывода
DDR_DATA = 0b00000000;
PORT_DATA = 0b11111111;
DDRX_SIG = 0b11111100;
PORT_SIG = 0b10001000; // (7)RES=1, (6)CS1=0, (5)CS2=0, (4)EN=0, (3)RW=1, (2)A0=0
ClearBit(PORT_SIG,RES);
delay_us(40);
SetBit(PORT_SIG,RES);
while (!(PIN_DATA & (1<<4)));//ждём ответа ЖКИ
WG12232_com_write(END);//END
WG12232_com_write(Static_Drive_OFF);
WG12232_com_write(Duty_Select_1);
WG12232_com_write(Display_ON);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void WG12232_point (unsigned char x, unsigned char y){//функция вывода точки
unsigned char s;//внутренняя переменная для считанных данных видео ОЗУ
if((x>32) || (y>122)) return;//проверяем не вышли ли за границы
if(y>=61){ //если точка на втором кристалле
SetBit(PORT_SIG,CS1);
ClearBit(PORT_SIG,CS2);//выбираем второй кристалл
y = y-61;//определяем для него адрес
}
else{ //если на первом кристалле
ClearBit(PORT_SIG,CS1);//выбираем первый кристалл
SetBit(PORT_SIG,CS2);
}
s=(WG12232_data_read((x/8),y));//считываем видео ОЗУ по адресу, где ставим точку (чтобы уже засвеченные точки не потушить)
WG12232_com_write(Set_Page | (x/8));//выставляем тот же адрес по странице
WG12232_com_write(Set_Address | y);//и колонке
WG12232_data_write((1<<(x%8)) | s);//и рисуем точку
}
void main(void){
TCCR0=0x03; // прескалер
TIMSK=0x01; // разрешаем прерывание по переполнению от таймер0
ACSR=0x80;
#asm("sei")
InitLcd();
WG12232_com_write (RESET_com);//сброс ЖКИ
WG12232_clear();//очистка видео ОЗУ
WG12232_point(10,10);
while (1);}Инициализацию пробовал проводить по-разному, из разных источников...
Регулятор контраста крутил - без толку.
19 и 20 выводы индикатора не запитываю, судя по ДШ они отвечают за подсветку (кстати, тут не понятно. подсветка есть и без них, это нормально?).
Какова вероятность того, что дисплей мертв?
Или, всё же, не правильно им дергаю?
Подскажите минимальный код, который отобразит на нем хоть что-нибудь (без разницы что)?
PS: Вселяет надежду только то, что после хардрезета (0 на RES) яркость подсветки на миг снижается, далее засвечивается нижний ряд пикселей, потом пиксели пропадают и подсветка возвращается в прежнее состояние.
Спойлер
Подключения:DB0-DB7 дисплея к соответствующим битам PORTA
A0 = PortC.2
EN = PortC.4
RW = PortC.3
CS1 = PortC.6
CS2 = PortC.5
RES = PortC.7
CL = PortD.7
Кому не трудно, перекомпилируйте, пожалуйста, код из статьи под эти порты, буду очень благодарен...
