MFK
Joined: 24 Oct 2007 Posts: 12
|
Port Changing GLCD Driver |
Posted: Wed Jan 23, 2008 5:19 pm |
|
|
Hi ,
I'm using a PIC18f4520 with an 240x128 LCD. It is working fine. I'm
using the glcd Driver. My question is probably very easy but I don't get
it. I want to change the controlling part from Port C to Port B. I want to
use C6 and C7 for RS232. At the code i changed this
#byte LCD = 0xf82 // portC address on 18F452 ---> to 0xf80
Afterwards the display didn't work any more. Do I have to change
something else ?
-----------------------------------
Complete Code
Code: |
/////////////////////////////////////////////////////////////////////////
//// T6963C.c - T6963C driver ////
//// Not for comercial Use ////
//// Driver by treitmey Graphic functions and Resolution Select ////
//// by endSly ([email protected]) ////
//// ////
//// This file contains drivers for using a Tosiba T6963C controller ////
//// in parallel/8080(intel) mode. The T6963C is 240 pixels across ////
//// and 64 pixels down. The driver treats the upper left pixel 0,0 ////
//// ////
//// Connections are as follows: ////
//// /WR - - C4 ////
//// /RD - - C5 ////
//// C//D- - C6 ////
//// /RST- - C7 ////
//// DATA0-7 PORTD0-7 ////
//// LCD's FS is tied low (FS = 0 is 8x8 font) ////
//// ////
/////////////////////////////////////////////////////////////////////////
// 240 x 64 in the 8x8 font mode means that 30 characters across by
// 8 rows of characters may be displayed
#define set_tris_lcd(x) set_tris_d(x)
#define LCDColorBlack 0b1
#define LCDColorWhite 0b0
//TRIS DataBus=x, note:control bus (PORTC) always outputs
unsigned int16 TextHome = 0x0F00;//0x0780;
const int8 TextArea = 0x001E; // how many bytes before a new line
const int16 GraphicsHome = 0x0000;
const int8 GraphicsArea = 0x001E; // how many bytes before a new line
const int8 AutoModeWrite = 0xB0;
const int8 AutoModeRead = 0xB1;
const int8 AutoModeReset = 0xB2;
const int8 LCDModeSet = 0x80; // send this OR'd with the following
const int8 LCDMode_OR = 0b0000;
const int8 LCDMode_XOR = 0b0001;
const int8 LCDMode_AND = 0b0010;
const int8 LCDMode_TA = 0b0100; // TEXT ATTRIBUTE mode.
const int8 LCDMode_RAM = 0b1000; // 1=CG RAM, 0=internal CG ROM
const int8 LCDSetCursorPtr = 0x21; // cursor address
const int8 LCDSetCursorSize = 0xA0; // 1 line cursor
const int8 LCDDispMode = 0x90; // send this OR'd with the following
const int8 LCDDisp_BLK = 0b0001;
const int8 LCDDisp_CUR = 0b0010;
const int8 LCDDisp_TXT = 0b0100;
const int8 LCDDisp_GRH = 0b1000;
const int8 LCDBitSet = 0xF8;
const int8 LCDBitReset = 0xF0;
const int8 LCDBit0 = 0b000;
const int8 LCDBit1 = 0b001;
const int8 LCDBit2 = 0b010;
const int8 LCDBit3 = 0b011;
const int8 LCDBit4 = 0b100;
const int8 LCDBit5 = 0b101;
const int8 LCDBit6 = 0b110;
const int8 LCDBit7 = 0b111;
const int8 LCDSetPtr = 0xE0;
struct lcd_pin_def
{
BOOLEAN unused1; // C0
BOOLEAN unused2; // C1
BOOLEAN unused3; // C2
BOOLEAN unused4; // C3
BOOLEAN w_bar; // C4 Write bar active low
BOOLEAN r_bar; // C5 Read bar active low
BOOLEAN cd; // C6 Command/Data BAR 1=command 0=data
BOOLEAN reset_bar; // C7 Reset active low
int data : 8; // PortD=Data bus
};
struct lcd_pin_def LCD;
#byte LCD = 0xf82 // portC address on 18F452
int glcd_ReadByte(void);
void glcd_WriteByte(int1 cd, int data);
void glcd_WriteByteAuto(int data);
void glcd_WriteCmd2(int16 data, int cmd);
void glcd_WriteCmd1(int data, int cmd);
void glcd_ (int x, int y, int1 text);
#inline
void glcd_init(unsigned int16 res_x, unsigned int16 res_y) {
int16 counter;
TextHome = (res_x/8)*res_y; //0x0F00;//0x0780;
set_tris_c(0x00); // graphic lcd control lines all output
set_tris_lcd(0xff); //TRIS DATA bus,note:control bus always outputs
LCD.w_bar = 1; // INITIAL STATES OF CONTROL PINS
LCD.r_bar = 1; //
LCD.cd = 1; // command
LCD.reset_bar = 0; // perform a reset
delay_us(10); // delay for a reset
LCD.reset_bar = 1; // run
// Set up the graphics and text areas
glcd_WriteCmd2(TextHome, 0x40);
glcd_WriteCmd2(TextArea, 0x41);
glcd_WriteCmd2(GraphicsHome, 0x42);
glcd_WriteCmd2(GraphicsArea, 0x43);
// set address to 0
glcd_WriteCmd2(0x0000, 0x24);
glcd_WriteCmd2(0x0000, 0x24);
// Clear all RAM of LCD (8k)
glcd_WriteByte(1, AutoModeWrite);
for (counter = 0; counter < 0x1fff; counter++)
{
glcd_WriteByteAuto(0); // fill everything with zeros
}
glcd_WriteByte(1, AutoModeReset);
}
void glcd_WriteByte(int1 cd, int data)
{
int status = 0, temp = 0;
set_tris_lcd(0xff);
LCD.w_bar = 1;
LCD.r_bar= 1;
LCD.cd = 1;//defaults
while (status != 0x03) { // is LCD busy?
LCD.r_bar= 0;
temp = LCD.data;
LCD.r_bar = 1;
status = temp & 0x03;
}
set_tris_lcd(0x00); // All outputs
LCD.cd = cd; // Command/Data bar
LCD.data = data;
LCD.r_bar = 1; // not read
LCD.w_bar = 0; // write
LCD.w_bar = 1; // release
}
void glcd_WriteByteAuto(int data)
{
int status = 0, temp = 0; // status bits ARE DIFFERENT BITS THAN NORMAL
set_tris_lcd(0xff);
LCD.w_bar = 1;
LCD.r_bar = 1;
LCD.cd = 1; // defaults
while (status != 0x08) { // is LCD busy?
LCD.r_bar = 0;
temp = LCD.data;
LCD.r_bar = 1;
status = temp & 0x08;
}
set_tris_lcd(0x00); // All outputs
LCD.cd = 0; // This is always data, cd=0
LCD.data = data; // Put data on data bus
LCD.w_bar = 0; // write
LCD.w_bar = 1; // release
}
void glcd_WriteCmd1(int data, int cmd)
{
glcd_WriteByte(0, data);
glcd_WriteByte(1, cmd);
}
void glcd_WriteCmd2(int16 data, int cmd)
{
glcd_WriteByte(0, data & 0xff);
glcd_WriteByte(0, data>>8);
glcd_WriteByte(1, cmd);
}
int glcd_ReadByte(void)
{
int data = 0, status = 0, temp = 0;
set_tris_lcd(0xff);
LCD.w_bar = 1;
LCD.r_bar = 1;
LCD.cd = 1; // defaults
#asm nop #endasm
while (status != 0x03) { // is LCD busy?
LCD.r_bar = 0;
temp = LCD.data;
LCD.r_bar = 1;
status = temp & 0x03;
}
LCD.cd = 0; // Command/Data bar
LCD.r_bar = 0; // read
/////////////////////////////////////////////////////////
#asm nop #endasm // THIS PAUSE IS VERY NESSESARY !!!//
/////////////////////////////////////////////////////////
data = LCD.data;
LCD.r_bar = 1;
LCD.cd = 1;
return data; // Return the read data
}
void glcd_putc(char c) {
glcd_WriteCmd1(c - 0x20, 0xc0);
}
void glcd_gotoxy(int x, int y, int1 text) { // sets memory location to screen location x, y
// location 1,1 is upper left corner; text = 1 (text area), text = 0 (graphics area)
int16 location, home;
int line;
if (!text) {
home = GraphicsHome;
line = GraphicsArea;
} else {
home = TextHome;
line = TextArea;
}
location = home + (((int16)y) * line) + x;
glcd_WriteCmd2(location, 0x24);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Clears LCD RAM
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_clr(int16 location,int16 size)
{
////fprintf(DEBUG,"loc=%lu size=%lu\n\r",location,size);
// look very simular to the init,... doesn't it. : )
glcd_WriteCmd2(location,LCDSetPtr);
glcd_WriteCmd1(1,AutoModeWrite);
for (;size;size--)
{
glcd_WriteByteAuto(0x00);//clear ram
}
glcd_WriteCmd1(1,AutoModeReset);
}
/////////////////////////////////////////
// Graphics Controller by endSly (c)2007
// [email protected]
// Not for comercial use
/////////////////////////////////////////
unsigned int8 i; //General Purpouse variable
// glcd_pixel(x,y,c) sets pixel x,y with c color
void glcd_pixel(unsigned int8 x, unsigned int8 y, int1 c){
unsigned int8 x_H;
unsigned int8 x_L=0;
x_H = (x / 8);
x_L = 7 - (x - 8*x_H);
glcd_gotoxy(x_H,y,0); //Bug fixed, thanks to etiedon
if(c){
glcd_WriteCmd1(1,(LCDBitSet|x_L));
} else {
glcd_WriteCmd1(1,(LCDBitReset|x_L));
}
}
// glcd_pixel8(x,y,px8) sets 8 pixels in line.
void glcd_pixel8(unsigned int8 x, unsigned int8 y, int8 pixel8){
unsigned int8 x_H;
x_H = (x / 8);
glcd_gotoxy(x_H+1,y,0);
glcd_WriteCmd1(pixel8,0xc0);
}
// glcd_line(x0,y0, x1,y1, c) puts line from (x0, y0) to (x1, y1) with c color
#separate
void glcd_line(signed int16 x0, signed int16 y0,
signed int16 x1, signed int16 y1 , int1 c){
int16 x;
int16 y;
unsigned int16 n;
int1 m_case;
x=abs(x1-x0);
y=abs(y1-y0);
if (y > x){
n=(y1-y0);
m_case=1;
} else {
n=(x1-x0);
m_case=0;
}
for(i=0 ; i<=n ; i++){
if (m_case){
y=i + y0;
x=(y*(x1-x0))/(y1-y0) + x0;
} else {
x=i + x0;
y=(x*(y1-y0))/(x1-x0) + y0;
}
glcd_pixel(x, y,c);
}
}
// glcd_square(x0,y0,x1,y1, c) sets square
void glcd_square( unsigned int8 x0, unsigned int8 y0,
unsigned int8 x1, unsigned int8 y1 , int1 c){
glcd_line(x0,y0, x1,y0, c);
glcd_line(x1,y0, x1,y1, c);
glcd_line(x0,y1, x1,y1, c);
glcd_line(x0,y0, x0,y1, c);
}
// glcd_box(x0,y0,x1,y1, c)
void glcd_box( unsigned int8 x0, unsigned int8 y0,
unsigned int8 x1, unsigned int8 y1 , int1 c){
unsigned int8 x;
unsigned int8 y;
for(y=y0; y<=y1;y++){
for(x=x0; x<=x1;x++){
if((!(x%8)) && ((x1-x)>8)){
glcd_pixel8(x,y,0xFF*c); //Same time to write 8 pixel
x +=7 ;
} else {
glcd_pixel(x,y,c);
}
}
}
}
//glcd_image8 (*Pic, x, y, size_x, size_y)
void glcd_image8(int8 *pic_px, unsigned int8 x, unsigned int8 y,
unsigned int8 size_x, unsigned int8 size_y){
unsigned int8 px_y;
unsigned int8 px_x;
unsigned int8 px=0;
for(px_y=y; px_y<(y+size_y); px_y++){
for(px_x=x; px_x<(x+size_x); px_x+=8){
glcd_pixel8(px_x, px_y, *(pic_px+px));
px+=1;
}
}
}
#use fast_io(D)
|
Thank for helping me. I really appreciate.
greetz to all. |
|