При подаче питания кратковременно выводится мусор в виде горизонтальных и вертикальных палок и дальше пусто...
Схема подключения - предложенная когда-то Winstar одному из пользователей, код для контроллера ST7565P - оттуда же.
Интерфейс - параллельный, 6800.
Если бы индикатор был один - можно предположить, что убит контроллер, но у меня их несколько...
Ну ткните, пожалуйста, носом, где я накосячил!!!
Код
#include "LPC17xx.H" // LPC1768 definitions
// Индикатор WO12864C2-TFH
// параллельный интерфейс 6800 (P/S=1, C86=1)
// Шина индикатора
//#define PIN_D0 0x00040000 // Шина данных индикатора P1.18-P1.25
//#define PIN_D7 0x02000000 //
#define line_datalcd 18 //шина данных начинается с 18-й линии
//Выводы управления WO12864C2-TFH()
#define PIN_RST 0x00000001 // 0.0 Сброс
#define PIN_CS1 0x00000002 // 0.1 Выбор кристалла
#define PIN_A0 0x20000000 // 1.29
#define PIN_WR 0x10000000 // 1.28
#define PIN_RD 0x08000000 // 1.27
#define RESET(X) ((X)? (GPIO0 -> FIOSET = PIN_RST):(GPIO0 -> FIOCLR=PIN_RST));
#define CS1(X) ((X)? (GPIO0 -> FIOSET = PIN_CS1):(GPIO0 -> FIOCLR=PIN_CS1));
#define A0(X) ((X)? (GPIO1 -> FIOSET = PIN_A0):(GPIO1 -> FIOCLR=PIN_A0));
#define WR(X) ((X)? (GPIO1 -> FIOSET = PIN_WR):(GPIO1 -> FIOCLR=PIN_WR));
#define RD(X) ((X)? (GPIO1 -> FIOSET = PIN_RD):(GPIO1 -> FIOCLR=PIN_RD));
#define LCD_COLUM_SET_H 0x10
#define LCD_COLUM_SET_L 0x00
int main (void)
//#############################################################################
//#############################################################################
//#############################################################################
{
SystemInit();
TargetInit();
Display_Init(); //ST7565P init
LCD_Clear(); // Заливка черным экрана
while(1)
{
//......
}
}
//################################################################################
#####
// Инициализация индикатора
//################################################################################
#####
void Display_Init(void)
{
// параллельный интерфейс 6800
// P/S=1, C86=1
CS1(0) // Разрешаем работу с ST7565
BusOUT(); // Шина на вывод
SetBus(0x00); // Выставили нули на шине
RESET(0)
delay_ms(50);
RESET(1)
delay_ms(50);
RD(1) WR(0)
// Power Controller Set (Booster circuit | Voltage regulator circuit | Voltage follower circuit)
Write_Command(0x2F); // 00101111 - Все включено(1)
// Booster Ratio Select Mode Set
// + Register Set - устанавливаем 4x
Write_Command(0xF8); // 11111000
Write_Command(0x00);// младшие два нуля - 2x,3x,4x
// LCD Bias Set
Write_Command(0xA2);//10100010 - 1,9 bias
//The Electronic Volume Mode Set
Write_Command(0x81); //10000001
// Electronic Volume Register Set
Write_Command(0x24); //00100100 - Уровень36 из 64 возможных
Write_Command(0x40); // 01000000(0x40) Начинаем с нулевой линии
Write_Command(0xAF); // Включаем панель
}// End
//################################################################################
#####
//################################################################################
#####
// Вывод команды на индикатор
//################################################################################
#####
void Write_Command(unsigned char code)
{
unsigned char SCH=8,tic=0;
BusOUT(); // Шина на вывод
RD(1) WR(0)
A0(0) // Идет команда
SetBus(code); // Выставили данные на шине
RD(1) // Строб E
delay_us(20);
RD(0)
}//End
//################################################################################
#####
//################################################################################
#####
//Вывод данных на индикатор
//################################################################################
#####
void Write_Data(unsigned char code)
{
unsigned char SCH=8,tic=0;
BusOUT(); // Шина на вывод
RD(1) WR(0)
A0(1) // Идут данные
SetBus(code); // Выставили данные на шине
RD(1) // Строб E
delay_us(20);
RD(0)
}//End
//################################################################################
#####
//################################################################################
#####
// Очистка страниц LCD
//################################################################################
#####
void LCD_Clear(void)
{
unsigned char i,j;
BusOUT();// Шина на вывод
for(i=0; i<9; i++) //clear page 0~8
{
Write_Command(0xB0+i); //set page
Write_Command(LCD_COLUM_SET_L); //set column
Write_Command(LCD_COLUM_SET_H); //set column
for(j=0; j<130; j++) //clear all columns upto 130
{
Write_Data(0xFF); // Заливаем экран
}
}
}
//################################################################################
#####
//################################################################################
#####
void BusOUT(void)// Шина данных индикатора на вывод
//################################################################################
#####
{
GPIO1 -> FIODIR |= (0xFF << line_datalcd);
}//End
//################################################################################
#####
//################################################################################
#####
void SetBus(unsigned char _data) //Установка сигналов данных на шине данных индикатора
//################################################################################
#####
{
unsigned long dta,dta1;
// Шина данных начинается с 18-й линии (line_datalcd=18)
// Порт шины данных - GPIO1
BusOUT();// Шина на вывод
dta = _data;
dta1 = _data ^ 255;
dta = dta << line_datalcd;
dta1 = dta1 << line_datalcd;
if(_data & 0x40) dta |= 0x01000000;
else dta1 |= 0x01000000;
GPIO1 -> FIOSET = dta;
GPIO1 -> FIOCLR = dta1;
}//End
//################################################################################
#####
// Индикатор WO12864C2-TFH
// параллельный интерфейс 6800 (P/S=1, C86=1)
// Шина индикатора
//#define PIN_D0 0x00040000 // Шина данных индикатора P1.18-P1.25
//#define PIN_D7 0x02000000 //
#define line_datalcd 18 //шина данных начинается с 18-й линии
//Выводы управления WO12864C2-TFH()
#define PIN_RST 0x00000001 // 0.0 Сброс
#define PIN_CS1 0x00000002 // 0.1 Выбор кристалла
#define PIN_A0 0x20000000 // 1.29
#define PIN_WR 0x10000000 // 1.28
#define PIN_RD 0x08000000 // 1.27
#define RESET(X) ((X)? (GPIO0 -> FIOSET = PIN_RST):(GPIO0 -> FIOCLR=PIN_RST));
#define CS1(X) ((X)? (GPIO0 -> FIOSET = PIN_CS1):(GPIO0 -> FIOCLR=PIN_CS1));
#define A0(X) ((X)? (GPIO1 -> FIOSET = PIN_A0):(GPIO1 -> FIOCLR=PIN_A0));
#define WR(X) ((X)? (GPIO1 -> FIOSET = PIN_WR):(GPIO1 -> FIOCLR=PIN_WR));
#define RD(X) ((X)? (GPIO1 -> FIOSET = PIN_RD):(GPIO1 -> FIOCLR=PIN_RD));
#define LCD_COLUM_SET_H 0x10
#define LCD_COLUM_SET_L 0x00
int main (void)
//#############################################################################
//#############################################################################
//#############################################################################
{
SystemInit();
TargetInit();
Display_Init(); //ST7565P init
LCD_Clear(); // Заливка черным экрана
while(1)
{
//......
}
}
//################################################################################
#####
// Инициализация индикатора
//################################################################################
#####
void Display_Init(void)
{
// параллельный интерфейс 6800
// P/S=1, C86=1
CS1(0) // Разрешаем работу с ST7565
BusOUT(); // Шина на вывод
SetBus(0x00); // Выставили нули на шине
RESET(0)
delay_ms(50);
RESET(1)
delay_ms(50);
RD(1) WR(0)
// Power Controller Set (Booster circuit | Voltage regulator circuit | Voltage follower circuit)
Write_Command(0x2F); // 00101111 - Все включено(1)
// Booster Ratio Select Mode Set
// + Register Set - устанавливаем 4x
Write_Command(0xF8); // 11111000
Write_Command(0x00);// младшие два нуля - 2x,3x,4x
// LCD Bias Set
Write_Command(0xA2);//10100010 - 1,9 bias
//The Electronic Volume Mode Set
Write_Command(0x81); //10000001
// Electronic Volume Register Set
Write_Command(0x24); //00100100 - Уровень36 из 64 возможных
Write_Command(0x40); // 01000000(0x40) Начинаем с нулевой линии
Write_Command(0xAF); // Включаем панель
}// End
//################################################################################
#####
//################################################################################
#####
// Вывод команды на индикатор
//################################################################################
#####
void Write_Command(unsigned char code)
{
unsigned char SCH=8,tic=0;
BusOUT(); // Шина на вывод
RD(1) WR(0)
A0(0) // Идет команда
SetBus(code); // Выставили данные на шине
RD(1) // Строб E
delay_us(20);
RD(0)
}//End
//################################################################################
#####
//################################################################################
#####
//Вывод данных на индикатор
//################################################################################
#####
void Write_Data(unsigned char code)
{
unsigned char SCH=8,tic=0;
BusOUT(); // Шина на вывод
RD(1) WR(0)
A0(1) // Идут данные
SetBus(code); // Выставили данные на шине
RD(1) // Строб E
delay_us(20);
RD(0)
}//End
//################################################################################
#####
//################################################################################
#####
// Очистка страниц LCD
//################################################################################
#####
void LCD_Clear(void)
{
unsigned char i,j;
BusOUT();// Шина на вывод
for(i=0; i<9; i++) //clear page 0~8
{
Write_Command(0xB0+i); //set page
Write_Command(LCD_COLUM_SET_L); //set column
Write_Command(LCD_COLUM_SET_H); //set column
for(j=0; j<130; j++) //clear all columns upto 130
{
Write_Data(0xFF); // Заливаем экран
}
}
}
//################################################################################
#####
//################################################################################
#####
void BusOUT(void)// Шина данных индикатора на вывод
//################################################################################
#####
{
GPIO1 -> FIODIR |= (0xFF << line_datalcd);
}//End
//################################################################################
#####
//################################################################################
#####
void SetBus(unsigned char _data) //Установка сигналов данных на шине данных индикатора
//################################################################################
#####
{
unsigned long dta,dta1;
// Шина данных начинается с 18-й линии (line_datalcd=18)
// Порт шины данных - GPIO1
BusOUT();// Шина на вывод
dta = _data;
dta1 = _data ^ 255;
dta = dta << line_datalcd;
dta1 = dta1 << line_datalcd;
if(_data & 0x40) dta |= 0x01000000;
else dta1 |= 0x01000000;
GPIO1 -> FIOSET = dta;
GPIO1 -> FIOCLR = dta1;
}//End
//################################################################################
#####