Код
/////////////////////////////////////////////////////////////////////////
//// SED1335_MOD.c ////
//// Модифицированный модуль управления ЖКИ 320х240 пикселей ////
//// Example drivers for the SED1335 LCD controller ////
/////////////////////////////////////////////////////////////////////////
#ifndef SED1335_VERSION
#define SED1335_VERSION 0x0000
#ifndef GLCD_WIDTH
#define GLCD_WIDTH 320
#endif
#ifndef GLCD_HEIGHT
#define GLCD_HEIGHT 240
#endif
#ifndef LCD_RESET
#define LCD_RESET PIN_E3//
#endif
#ifndef LCD_RD
#define LCD_RD PIN_E0//
#endif
#ifndef LCD_WR
#define LCD_WR PIN_E1//
#endif
#ifndef LCD_A0
#define LCD_A0 PIN_E2//
#endif
#ifndef LCD_CS
#define LCD_CS PIN_C3//
#endif
//##############################################################################
VOID LCD_init_Grafik( void );
void OVERLAY( unsigned int ovlay );
void display_off( void );
void enable_display( void );
void write_data( unsigned char Data );
void send_msg( unsigned char Data, unsigned char A0, unsigned char WR,
unsigned char RD, unsigned char CS );
void text_cursor_pos( unsigned INT16 Position );
void clear_text( void );
void clear_graphic(void );
void setCursorAddress(int16 addr);
int8 lcd_readByte();
int8 getData(int16 addr);
void setData(int16 addr, int8 data);
void pixel(int16 x, int16 y, int1 color);
void pixel_(int16 x, int16 y, int1 color);
void write_char( unsigned char Zeichen );
void flash_textcursor( unsigned char flashing );
//##############################################################################
// ----- Level 1 Funktionen ----------------------------------------------
VOID LCD_init_Grafik( void )
{
SET_TRIS_E (0);
SET_TRIS_D (0);// LCD_TRIS = 0x00;
Output_bit(LCD_RESET,0);
delay_ms(200);
Output_bit(LCD_RESET,1);
// --- SEND SYSTEM SET --- //
// A0 WR RD CS
send_msg( 0x40, 1, 0, 1, 0 ); // C SYSTEM SET instruction
send_msg( 0x30, 0, 0, 1, 0 ); // P1 // single panel drive
// define display resolution: physical 320pixel / 8 = 40 char-cols ???
// virtual display resolution: 40*8= 320 pixels (X)
// 0х86- двухкадровое управление, 0х06- 16ти строчное управление
send_msg( 0x87, 0, 0, 1, 0 ); // P2 (FX) - ширина символа (7 pixels) /86 /06
//Установите FY в "0" (вертикальный размер равняется единице) в графическом режиме.
send_msg( 0x00, 0, 0, 1, 0 ); // P3 (FY) - высота символа (8 pixels) /0x0 for grafik
// allocate 39 bytes for one line адресный диапазон, занимаемый одной строкой дисплея
send_msg( 0x27, 0, 0, 1, 0 ); // P4 (c/r) - address range (39) (40 chars) //2b //11
send_msg( 0x39, 0, 0, 1, 0 ); // P5 (tc/r) - length of 1 line (43) (c/r+4) //9f //ef
//delay_us(2);//Установка высоты кадра, в линиях.
send_msg( 0xef, 0, 0, 1, 0 ); // P6 (l/f) - height (in lines) of a frame (239) //28
//Определяет горизонтальный адресный диапазон виртуального экрана.
//APL - младший значащий байт адреса. зона очистки виртуального экрана
send_msg( 0x28, 0, 0, 1, 0 ); // P7 (apl) - horiz. addr. range - LOW (40)
send_msg( 0x00, 0, 0, 1, 0 ); // P8 (aph) - horiz. addr. range - HIGH
//################################################################################
#####
// --- SEND SCROLL PARAMS --- //
//Установка начального адреса дисплея и участков дисплея
send_msg( 0x44, 1, 0, 1, 0 ); // C (start SCROLL settings)
//первый текстовый слой стартовый адрес- 0000
send_msg( 0x00, 0, 0, 1, 0 ); // P1 (SAD 1L) - layer1 start addr. LOW
send_msg( 0x00, 0, 0, 1, 0 ); // P2 (SAD 1H) - layer1 start addr. HIGH
send_msg( 0xEF, 0, 0, 1, 0 ); // P3 (SL1) -Отображаемых строк в первом экранном блоке - 30 no. of pixels of screen 1 (239) //ef
//второй графический слой , нач. адрес- 1200 (dec) 0х040В
send_msg( 0x81, 0, 0, 1, 0 ); // P4 (SAD 2L) - layer2 start addr. LOW //b0
send_msg( 0x25, 0, 0, 1, 0 ); // P5 (SAD 2H) - layer2 start addr. HIGH //04
send_msg( 0xEF, 0, 0, 1, 0 ); // P6 (SL2) - no. of pixel rows per screen 2 239 pixels (Y) //ef
send_msg( 0x81, 0, 0, 1, 0 ); // P7 (SAD 3L) мл. адрес третьего экранного блока 32 10802
send_msg( 0x25, 0, 0, 1, 0 ); // P8 (SAD 3H) ст. адрес третьего экранного блока 2a
send_msg( 0x00, 0, 0, 1, 0 ); // P9 (SAD 4L) (disabled)
send_msg( 0x00, 0, 0, 1, 0 ); // P10 (SAD 4H) (disabled)
// --- set cursor form (CSRFORM) --- //
//Установка типа курсора
send_msg( 0x5D, 1, 0, 1, 0 ); // C (start CSRFORM settings)
send_msg( 0x03, 0, 0, 1, 0 ); // P1 (CRX) - cursor length толщина курсора
send_msg( 0x88, 0, 0, 1, 0 ); // P2 (CM,CRY) - cur. shape, cursor height
// --- set character gen. RAM addr (CGRAM ADR) --- //
//Установка начального адреса генератора символов RAM
// send_msg( 0x5C, 1, 0, 1, 0 ); // C (start CGRAM ADR settings)
// send_msg( 0x00, 0, 0, 1, 0 ); // P1 (SAGL) - start addr. LOW 81
// send_msg( 0x00, 0, 0, 1, 0 ); // P2 (SAGH) - start addr. HIGH25
// --- set default auto cursor direction (CSDIR) ---//
//Установка направления движения курсора
send_msg( 0x4C, 1, 0, 1, 0 ); // C (start CSRDIR settings) - right
// --- set horiz. scrolling (HDOT SCR) --- //
//Установка позиции горизонтальной прокрутки
send_msg( 0x5A, 1, 0, 1, 0 ); // C (start HDOT SCR settings)
send_msg( 0x00, 0, 0, 1, 0 ); // P1 number of pixels to scroll down (1)
//--------------------------------------------------------------------------------
// Выбор метода композиции(OVLAY)
//Выбирает композицию наслоённого экрана и текстовый.графический режим экрана.
//MX1 MX2 Функция Метод композиции Применение
// 0 0 L1ИL2ИL3 ИЛИ Подчёркивание, инструкции, смешанные текст и графика
// 0 1 (L1ЕL2)ИL3 ИСКЛЮЧАЮЩЕЕ ИЛИ Инвертированные символы, мерцающие области, подчёркивание
// 1 0 (L1ЗL2)ИL3 И Простая анимация, трёхмерный вид
// 1 1 L1>L2>L3 ПРИОРИТЕТНОЕ ИЛИ
// 00,01,02,03,10,11,12,13,0c,0d,0e,0f,1c,1d,1e,1f
//0d инвертирует картинку
send_msg( 0x5B, 1, 0, 1, 0 ); // C (start OVLAY settings)
send_msg( 0x0d, 0, 0, 1, 0 ); // P1 screen mode (text), style, 2 layers
//--------------------------------------------------------------------------------
display_off( );
clear_graphic();
clear_text();
enable_display(); // DISP ON
}//OK
//#####################################################################
void OVERLAY( unsigned int8 ovlay )
{ send_msg( 0x5B, 1, 0, 1, 0 ); // C (start OVLAY settings)
switch( ovlay )
{
case 1: send_msg( 0x01, 0, 0, 1, 0 );break; // P1 screen mode (text), style, 2 layers
case 2: send_msg( 0x10, 0, 0, 1, 0 );break; // P1 screen mode (grafik), style, 2 layers
}
}//--------------------------OK
//####################################################################
void enable_display( void )
{ //установить мерцание блоков и курсора
send_msg( 0x59, 1, 0, 1, 0 ); // разрешение instruction
// send_msg( 0x34, 1, 0, 1, 0 ); //представления двух наложенных графиков на экране
// send_msg( 0x56, 0, 0, 1, 0 ); // parameters (no flashing)
send_msg( 0x16, 0, 0, 1, 0 );//два блока ,нет мерцания
//send_msg( 0x55, 0, 0, 1, 0 );//три блока ,нет мерцания
//send_msg( 0xac, 0, 0, 1, 0 );//три блока , мерцание 16Гц
// send_msg( 0x3c, 0, 0, 1, 0 );//2 блока , мерцание 16Гц
// send_msg( 0x58, 0, 0, 1, 0 );//2 блока , мерцание 16Гц
}//OK
//#####################################################################
void display_off( void )
{ //установить мерцание блоков и курсора
send_msg( 0x58, 1, 0, 1, 0 ); // разрешение instruction
// send_msg( 0x59, 1, 0, 1, 0 ); // запрет instruction
// send_msg( 0x56, 0, 0, 1, 0 ); // parameters (no flashing)
//send_msg( 0x55, 0, 0, 1, 0 );//3 блока ,нет мерцания
send_msg( 0x16, 0, 0, 1, 0 );//два блока ,нет мерцания
//send_msg( 0xac, 0, 0, 1, 0 );//три блока , мерцание 16Гц
// send_msg( 0x3c, 0, 0, 1, 0 );//2 блока , мерцание 16Гц
// send_msg( 0x58, 0, 0, 1, 0 );//2 блока , мерцание 16Гц
}//OK
//#####################################################################
void clear_text( void )
{
unsigned long cnt = 0x00;
send_msg( 0x42, 1, 0, 1, 0 );
Output_bit(LCD_A0, 0);
for( cnt = 0x00; cnt < 1200; cnt++ ) // 680
{
write_data( 0x00 );
}
}//OK
//#####################################################################
void clear_graphic( )
{
unsigned int16 cnt = 0x0000;
send_msg( 0x42, 1, 0, 1, 0 );
#asm
BCF 0x0F8D,2 //замена Output_bit(LCD_A0 ,0);
#endasm
for( cnt = 0x0000;cnt < 9600; cnt++ ) // всё чистит
{
write_data( 0x00 );//негатив
}
}//OK
//#####################################################################
void write_data( unsigned char Data )
{
Output_d(Data);
#asm
BCF 0x0F8B,3//Output_bit(LCD_CS,0);// замена
BCF 0x0F8D,1//Output_bit(LCD_WR,0); //
BSF 0x0F8D,1//Output_bit(LCD_WR,1);//
BSF 0x0F8B,3//Output_bit(LCD_CS,1);//
#endasm
}//OK
//#####################################################################
void send_msg( unsigned char Data, unsigned char A0, unsigned char WR,
unsigned char RD, unsigned char CS )
{
Output_bit(LCD_A0,A0);
Output_bit(LCD_WR,WR);
Output_bit(LCD_RD,RD);
Output_bit(LCD_CS,CS);
write_data( Data );
}//OK
//#####################################################################
// Purpose: Set the cursor address
// Inputs: A 16 bit integer containing the new cursor address
void setCursorAddress(unsigned int16 addr) { //CSRW Установка адреса курсора
send_msg( 0x46, 1, 0, 1, 0 );
#asm
BCF 0x0F8D,2//Output_bit(LCD_A0 ,0);
#endasm
write_data( (addr) & 0x00ff );
write_data( (addr >> 8) & 0x00ff );
}//OK
//#####################################################################
int8 lcd_readByte()
{char data;
set_tris_d(0xFF);
#asm
BCF 0x0F8B,3//Output_bit(LCD_CS,0);
BSF 0x0F8D,2//Output_bit(LCD_A0,1); // new line дополнен
#endasm
delay_us(1);
#asm
BCF 0x0F8D,0// Output_bit(LCD_RD,0);
#endasm
delay_us(2);
data = input_d();
#asm
BSF 0x0F8D,0//Output_bit(LCD_RD,1);
BSF 0x0F8B,3//Output_bit(LCD_CS,1);
#endasm
return data;
}//--------------------------OK
//####################################################################
int8 getData(unsigned int16 addr)
{
setCursorAddress(addr);
send_msg( 0x43, 1, 0, 1, 0 );//MREAD чтение из памяти дисплея
#asm
BCF 0x0F8D,2//Output_bit(LCD_A0 ,0);
#endasm
return lcd_readByte();
}//--------------------------OK
//####################################################################
// Purpose: Set a byte of display data at an address
// Inputs: 1) A 16 bit address
// 2) 8 bits worth
//MWRITE 1 0 1 0 1 0 0 0 0 1 0 42 Запись в память дисплея
void setData(unsigned int16 addr,unsigned int8 data)
{
setCursorAddress(addr);
send_msg( 0x42, 1, 0, 1, 0 );//
#asm
BCF 0x0F8D,2//Output_bit(LCD_A0 ,0);
#endasm
write_data(data);
}//--------------------------OK
//####################################################################
// Purpose: Turn a pixel on a graphic LCD on or off
// Inputs: x - the x coordinate of the pixel
// y - the y coordinate of the pixel
// color - ON or OFF
void pixel(unsigned int16 x,unsigned int16 y, int1 color)
{
unsigned int8 data;
unsigned int16 addr;
// расчитать байт адреса, содержащего пиксель
// addr = GLCD_GRAPHICS_ADDR + (GLCD_WIDTH/8 * y + x/8);
// addr =1200 + (40 * y + x/8);//если первый слой текстовый
addr = 40 * y + x/8 + 9601;//если первый слой графический
data = getData(addr);//считать байт данных в адресе
if(color == 1) bit_set(data, 7 - x%8);//нарисовать пиксель
else bit_clear(data, 7 - x%8);//стереть пиксель
setData(addr , data); //записать новый байт данных в память дисплея
}//
//#####################################################################
void pixel_(unsigned int16 x,unsigned int16 y, int1 color)
{
unsigned int8 data;
unsigned int16 addr;
// расчитать байт адреса, содержащего пиксель
addr = 40 * y + x/8;//
data = getData(addr);//считать байт данных в адресе
if(color == 1) bit_set(data, 7 - x%8);//нарисовать пиксель
else bit_clear(data, 7 - x%8);//стереть пиксель
setData(addr , data); //записать новый байт данных в память дисплея
}//
//#####################################################################
void flash_textcursor( unsigned char flashing )
{
switch( flashing )
{
case 1:
{
send_msg( 0x59, 1, 0, 1, 0 );
Output_bit(LCD_A0,0);
write_data( 0x05 );
}break;
case 2:
{
send_msg( 0x59, 1, 0, 1, 0 );
Output_bit(LCD_A0, 0);
write_data( 0x06 );
}break;
case 3:
{
send_msg( 0x59, 1, 0, 1, 0 );
Output_bit(LCD_A0,0);
write_data( 0x07 );
}break;
}
}//OK
//#####################################################################
#endif
тут полный проект с рисунком печатной платы в СПРИНТе5.0