|
|
View previous topic :: View next topic |
Author |
Message |
rafa
Joined: 28 Sep 2004 Posts: 0 Location: valencia
|
I need help with my graphic lcd based in T6963C |
Posted: Tue Sep 28, 2004 10:32 am |
|
|
I can't make my lcd function. I have found code for it but it isn't sufficient.
Please, someboby give me the code. I already have been 1 month workng and i don't find a solution.
Thanks, rafa |
|
|
Oznog
Joined: 16 Oct 2004 Posts: 6
|
|
Posted: Sat Oct 16, 2004 1:59 am |
|
|
What is it doing?
Post your code, maybe we can fix it? I've done T6963C, graphics tasks, graphical fonts, it's all good.
And- the question that will make you find something breakable around you and smash it if this is it- did you give it the appropriate -Vee? Display won't show anything without it! |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Sat Oct 16, 2004 10:28 am |
|
|
Then post your question in the other forum. This one is for posting code to share with others and not for asking questions. Also do a search. That is the first thing you should do. I know I have seen routines posted for that controller. Heck, it is even in this forum!!!
http://www.ccsinfo.com/forum/viewtopic.php?t=19957&highlight=t6963c |
|
|
rafa
Joined: 28 Sep 2004 Posts: 0 Location: valencia
|
|
Posted: Mon Oct 18, 2004 5:02 am |
|
|
This is the code i'm using. Initially this war for a pic18f452. I have intented change it but i can't get function it for my pic16f877.
Thanks
/////////////////////////////////////////////////////////////////////////
//// EX_GLCD.C ////
//// ////
//// This example program demonstrates the use of a graphic LCD. ////
//// A reading is taken by the analog to digital converter and ////
//// displayed on the LCD. A bar shows the current reading relative ////
//// to the minimum and maximum values. If the reading is greater ////
//// than 4 volts, a warning message is displayed. A clock timer ////
//// demonstrates the use of the circle and line functions and shows ////
//// that the program is active. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16f877.h> //CAMBIO
#CASE
//#fuses HS,NOWDT,PROTECT,NOLVP,WRT,BROWNOUT,BORV45,NODEBUG,STVREN,PUT,NODEBUG
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
//CAMBIO: he cambiado este fuses por el de arriba + put + brownout
//#fuses HS,NOWDT,PROTECT,NOLVP,WRT,BROWNOUT,BORV45,NODEBUG,STVREN,PUT,NODEBUG,WRT,WRTD,WRTB,WRTC,CPD,CPB
#use delay(clock=4000000) //CAMBIO: ulilizo una velocidad de 4000000
//CAMBIOS:�hacen falta las 3 proximas lineas?
//#use rs232(baud=38400,xmit=PIN_C4,INVERT,stream=DEBUG) // STDERR(same as DEBUG)
//#use rs232(baud=38400,xmit=PIN_C4,INVERT,stream=STDERR) // STDERR(same as DEBUG)
//#use rs232(baud=19200,xmit=PIN_C6,rcv=PIN_C7,stream=RS485) // RS485 is the default
#zero_ram
#use fast_io(D) //CAMBIO
#include <stdlib.h>
//#include <stdlibm.h> //AQUI ESTA EL ERROR
#include <math.h>
int16 ERRORS;
#include "LCD_T6963C.h" //CAMBIO: incluyo esta libreria
void displayVoltage(int data) {
char voltValue[9]; // Stores the converted number
sprintf(voltValue, "%f", (float)data * .01960784);// Converts number to text
voltValue[4] = '\0'; // Limit shown digits to 3
glcd_rect(45, 18, 69, 25, YES, OFF); // Clear the old number
glcd_text57(45, 18, voltValue, 1, ON); // Write the new number
}
void main() {
int value1 = 0, value2 = 0, Warn = 0;
char voltText[] = "Volts", warning[] = "Warning";
float theta = 0;
//setup_adc_ports(RA0_ANALOG); // Set the ADC to read A0
//setup_adc(ADC_CLOCK_INTERNAL); // Set the ADC clock
//set_adc_channel(0); // Set ADC to use channel 0
glcd_init(ON);
glcd_WriteCmd0(LCDDispMode | LCDDisp_GRH); // Must initialize the LCD
//glcd_rect(1, 5, 126, 15, NO, ON); // Draw the rectangle around the bar
glcd_text57(70, 18, voltText, 1, ON); // Write "Volts" on the LCD
while(1);
glcd_circle(30, 47, 10, NO, ON); // Draw the clock circle
do{value1 = read_adc(); // Read a value from the ADC
displayVoltage(value1); // Display the reading
value1 = (value1 > 250) ? 250 : value1; // Keep the value under 251
if(value1 > 200 && !Warn) { // Check if reading is above 200
glcd_rect(45, 38, 124, 55, YES, ON); // Draw a filled black rectangle
glcd_text57(47, 40, warning, 2, OFF); // Write "Warning" on the LCD
Warn = 1; }
else if(value1 <=200){
glcd_rect(45, 37, 125, 55, YES, OFF); // Draw a filled white rectangle
Warn = 0; }
// The following 3 lines make the clock hand spin around
glcd_line(30, 47, 30+(int)(8*sin(theta)+.5), 47-(int)(8*cos(theta)+.5), OFF);
theta = (theta > 5.9) ? 0 : (theta += .3);
glcd_line(30, 47, 30+(int)(8*sin(theta)+.5), 47-(int)(8*cos(theta)+.5), ON);
glcd_rect(value1/2, 6, value2/2, 14, YES, OFF); // Clears the old bar
glcd_rect(1, 6, value1/2, 14, YES, ON); // Draws a new bar
value2 = value1; // Set old value to new
delay_ms(150); // Delay for a bit
} while (TRUE);
}
/////////////////////////////////////////////////////////////////////////
// Notice : Copyright (c) 2004 Sentinel Systems Corporation
// : All Rights Reserved
// Date : 01-05-2004
// Version: 1.0
/////////////////////////////////////////////////////////////////////////
//// LCD_T6963C.c
//// 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 ////
//// ////
//// glcd_init(mode) ////
//// glcd_pixel(x,y,color) ////
//// glcd_line(x1,y1,x2,y2,color) ////
//// glcd_rect(x1,y1,x2,y2,fill,color) ////
//// glcd_bar(x1,y1,x2,y2,width,color) ////
//// glcd_circle(x,y,radius,fill,color) ////
//// glcd_text57(x,y,textptr,size,color) ////
//// glcd_fillScreen(color) ////
/////////////////////////////////////////////////////////////////////////
//5/25/2004 9:26AM consolidating pins on port A & D
//5/25/2004 10:06AM consolidating pins on port C & D
//5/26/2004 7:48AM V1.2.4
//5/26/2004 7:48AM Fixing little graphics problems
//5/26/2004 10:22AM V1.2.5
//5/27/2004 8:31AM V1.2.6 Good LCD, RX/TX, now working on keypad
#ifndef GLCD_COL
#define GLCD_COL 240 // Used for text wrapping by glcd_text57 function and sanity check
#endif
#ifndef GLCD_ROW
#define GLCD_ROW 128 //CAMBIO: 64 en vez de 128
// Used for text wrapping by glcd_text57 function and sanity check
#endif
#define ON 1
#define OFF 0
#define YES 1
#define NO 0
#define set_tris_lcd(x) set_tris_c(0b00000000);set_tris_d(x) //CAMBIO: 0b00000000 por 0b10000000
#define set_lcd_defaults(x) set_tris_lcd(0xFF);LCD.w_bar=1;LCD.r_bar=1;LCD.cd=1;LCD.reset=1 //CAMBIO:RESET
#define glcd_WriteCmd0(x) glcd_WriteByte(1,x)
#define DispScn(x) glcd_WriteCmd2(TextHome+240*x,0x80) //CAMBIO: 0x80 por 0x40
#define LCDTxtAdr(s,x,y) 0x780+(240*s)+(AreaSet_T*y)+x
#define LCDSetPtr 0x24
/////////////////////////////////////////////////
//FS=0, 5x7 char in 8x8 field, 30char/line, 240 char total,graphic pics 8pixels/address, 0x780 grh addresses
//FS=1, 5x7 char in 6x8 field, 40char/line, 320 char total,graphic pics 6pixels/address, 0xA00 grh addresses
// - - - - 64K RAM - - - - 0 to 0xFFFF
// 0 grh home
// ...
// grh end (right before txt home)
// 0x780----(screen 0) or 0xA00 Txt home depends on FS
// 0x870----(screen 1) adding 240 for each screen
// 0x960----(screen 2)
// 0xA50----(screen 3)
//////////////////////////////////////////////
const int1 LCDFont = 0;//FS pin has internal pull-up. FS=1 unless grounded
const int8 LCDField = 8+(!LCDFont*2); //CAMBIO:8 POR 6 //FS=1 then field=6. FS=0 then field=8
const int8 LCDCharWidth = GLCD_COL /LCDField;
const int16 CharPerScn= LCDCharWidth*16; //CAMBIO: 16 por 8 //number of characters on a screen
const int16 GraphicsHome=0x0000; //RAM area where graphics is held
const int8 AreaSet_G= 30+(LCDFont*10); //how many bytes before a new line
const int16 TextHome = (GLCD_COL/LCDField)*128; //CAMBIO: 128 por 64//text comes right after graphics area
const int8 AreaSet_T= 30+(LCDFont*10); //how many bytes before a new line. 30 or 40
//////////////////////////////////////////////////////////////////
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 position
const int8 LCDSetCursorSize=0xA0; //Number of lines in the 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 LCDMaxBusyCount = 4;//will try count-1 times before giving up
//#include <stdlibm.h> //CAMBIO: lo puse yo
struct lcd_pin_def
{
BOOLEAN fs1; // C0
BOOLEAN md2; // C1
BOOLEAN reset; // C2
BOOLEAN ce; // C3
BOOLEAN w_bar; // C4 Write bar active low
BOOLEAN r_bar; // C5 Read bar active low
BOOLEAN cd; // C6 Command/Data BCR 1=command 0=data
BOOLEAN unusedC7; // C7
//BOOLEAN unusedC4; // C4
//BOOLEAN unusedC5; // C5
//BOOLEAN unusedC6; // C6
//BOOLEAN unusedC7; // C7
// int data : 8; // D=Data bus
};
struct lcd_pin_def LCD;
struct lcd_pin_def1
{
int data:8;
};
struct lcd_pin_def1 LCD1;
#byte LCD = 0x07 //CAMBIO //note: no semicolin 5=A0 on a 16F877A
//int data[8];
#byte LCD1 = 0x08
//#use fast_io(C)
//#use fast_io(D)
//#byte LCD = 0xF82 //note: no semicolin 5=A0 on a 16F877A
#bit LCDSTA0 = 0x8.0 //CAMBIO: he cambiado las proximas direcciones
#bit LCDSTA1 = 0x8.1
#bit LCDSTA2 = 0x8.2
#bit LCDSTA3 = 0x8.3
//---------------- Prototypes--------------------
//void glcd_FontSelect(int1 fs);
glcd_WriteByte(int1 cd, BYTE data);
glcd_WriteByteAuto(BYTE data);
BYTE glcd_ReadByte();
BYTE glcd_ReadByteAuto();
glcd_WriteCmd1(BYTE data, BYTE cmd);
glcd_WriteCmd2(int16 data, BYTE cmd);
glcd_pixel(int16 x,int16 y,int1 color);
glcd_clr(int16 location, int16 size);
void glcd_CpyScn(unsigned int16 ptr1,unsigned int16 ptr2);
//***************************************************//
// INICIALIZACION //
//***************************************************//
void glcd_init(int1 mode)
{
//fprintf(DEBUG,"LCD init\n\r");
set_lcd_defaults();
//reset
//LCD.w_bar=0; // preform a reset. When w_bar=0 & r_bar=0 then reset_bar=0
//LCD.r_bar=0; // preform a reset.
LCD.reset=0; //reset
delay_ms(1); // delay 1ms minimo,CAMBIO:yo pongo 2 por ejemplo
LCD.reset=1;
LCD.fs1=0;
LCD.md2=0;
LCD.ce=0;
//LCD.w_bar=1; // run
//LCD.r_bar=1; //
//Set up the graphics and text areas
glcd_WriteCmd2(TextHome,0x40); //set text home
glcd_WriteCmd2(AreaSet_T,0x41); //set text area
glcd_WriteCmd2(GraphicsHome,0x42);//set graphics home
glcd_WriteCmd2(AreaSet_G,0x43); //set graphics area
//cursor
glcd_WriteCmd0(LCDSetCursorSize | (0x01-1));//1 line cursor
glcd_WriteCmd2(0x0000,LCDSetCursorPtr);//0x yy xx , cursor position
//modes
glcd_WriteCmd0(LCDModeSet | LCDMode_XOR);
//glcd_WriteCmd0(LCDDispMode | LCDDisp_TXT |LCDDisp_BLK | LCDDisp_CUR);
glcd_WriteCmd0(LCDDispMode | LCDDisp_TXT);
//offset register
glcd_WriteCmd2(0x0002,0x22);//offset register=0x0002
//Clear all RAM of LCD
glcd_clr(0x0000,0xFFFF);//Clear all of RAM
//fprintf(DEBUG,"LCD init DONE.\n\r");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Copys a screen(CharPerScn bytes) from ptr2 to ptr1
// Inputs: ptr1 ptr2
// Ouputs:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_CpyScn(unsigned int16 ptr1,unsigned int16 ptr2)
{
int8 x;
int8 temp_array[128]; //CAMBIO
////fprintf(DEBUG,"ptr1=%lx ptr2=%lx\n\r",ptr1,ptr2);
//read data and put in array
glcd_WriteCmd2(ptr2,LCDSetPtr);
glcd_WriteCmd0(AutoModeRead);
for (x=0;x<CharPerScn;x++)
{
temp_array[x]=glcd_ReadByteAuto();
////fprintf(DEBUG,"0x%lx<-0x%x ",ptr2+x,temp_array[x]);
}
glcd_WriteCmd0(AutoModeReset);
//write data from array
glcd_WriteCmd2(ptr1,LCDSetPtr);
glcd_WriteCmd0(AutoModeWrite);
for (x=0;x<CharPerScn;x++)
{
glcd_WriteByteAuto(temp_array[x]);
////fprintf(DEBUG,"0x%x->0x%lx ",temp_array[x],ptr1+x);
}
glcd_WriteCmd0(AutoModeReset);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Writes a byte of data from the current location
// Inputs: cd 1=command 0=data BYTE data
// Ouputs: Int1 1=success 0=failure
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_WriteByte(int1 cd, BYTE data)
{
set_lcd_defaults();
LCD.r_bar=0; // Read
while(!LCDSTA0 && !LCDSTA1) //CAMBIO:&& por || //wait till both are one
;
////fprintf(DEBUG,".");
LCD.r_bar=1; // Release
// if(cd==0) {//fprintf(DEBUG,"D=%lx ",data);}
// if(cd==1) {//fprintf(DEBUG,"C=%lx ",data);}
set_tris_lcd(0x00); //All outputs
LCD.cd=cd; //Command/Data bar
LCD1.data=data;
LCD.w_bar=0; //write
set_lcd_defaults();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Writes continuous bytes of data from the current location
// Inputs: BYTE data
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_WriteByteAuto(BYTE data)
{
set_lcd_defaults();
LCD.r_bar=0; // Read
while(!LCDSTA3) //wait till STA3 is one
;
////fprintf(DEBUG,".");
LCD.r_bar=1; // Release
set_tris_lcd(0x00); //All outputs
LCD.cd=0; //This is always data, cd=0
LCD1.data=data; //Put data on data bus
LCD.w_bar=0; //write
set_lcd_defaults();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Reads continuous bytes of data from the current location, and inc
// Ouputs: Data byte read
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
BYTE glcd_ReadByteAuto(void)
{
int8 data;
set_lcd_defaults();
LCD.r_bar=0; // Read
while(!LCDSTA2) //wait till STA2 is one
;
////fprintf(DEBUG,".");
LCD.r_bar=1; // Release
set_tris_lcd(0xff); // All inputs
LCD.cd=0; // This is always data, cd=0
LCD.r_bar=0; // Read
data=LCD1.data; // Read data bus
LCD.r_bar=1; // Release
set_lcd_defaults();
return (data); //Return status
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Writes a one byte of data and a command
// Inputs: BYTE data BYTE cmd
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_WriteCmd1(BYTE data, BYTE cmd)
{
glcd_WriteByte(0,data);
glcd_WriteCmd0(cmd);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Writes a two data byte command
// Inputs: int16 data BYTE cmd
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_WriteCmd2(int16 data, BYTE cmd)
{
int8 lcddata;
// glcd_WriteByte(0,data & 0xFF);
// glcd_WriteByte(0,data>>8);
// glcd_WriteCmd0(cmd);
// - - - - - - - - - - - - data - - - - - - - - -
set_lcd_defaults();
lcddata=data & 0xFF;
LCD.r_bar=0; // Read
while(!LCDSTA0 && !LCDSTA1) //CAMBIO:&& por || //wai t till both are one
;
LCD.r_bar=1; // Release
set_tris_lcd(0x00); //All outputs
LCD.cd=0; //Command/Data bar
LCD1.data=lcddata;
LCD.w_bar=0; //write
// - - - - - - - - - - - - data - - - - - - - - -
set_lcd_defaults();
lcddata=data>>8;
LCD.r_bar=0; // Read
while(!LCDSTA0 && !LCDSTA1) //CAMBIO:&& por || //wait till both are one
;
LCD.r_bar=1; // Release
set_tris_lcd(0x00); //All outputs
LCD.cd=0; //Command/Data bar
LCD1.data=lcddata;
LCD.w_bar=0; //write
// - - - - - - - - - - - - command- - - - - - - -
set_lcd_defaults();
LCD.r_bar=0; // Read
while(!LCDSTA0 && !LCDSTA1) //CAMBIO:&& por || //wait till both are one
;
LCD.r_bar=1; // Release
set_tris_lcd(0x00); //All outputs
LCD.cd=1; //Command/Data bar
LCD1.data=cmd;
LCD.w_bar=0; //write
set_lcd_defaults();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Clears LCD RAM
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_clr(int16 location,int16 size)
{
////fprintf(DEBUG,"loc=%lu size=%lu\n\r",location,size);
glcd_WriteCmd2(location,LCDSetPtr);
glcd_WriteCmd0(AutoModeWrite);
for (;size;size--)
{
glcd_WriteByteAuto(0x00);//clear ram
}
glcd_WriteCmd0(AutoModeReset);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Reads a byte of data from the current location
// Ouputs: A byte of data read from the LCD
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
BYTE glcd_ReadByte()
{
int8 data=0;
//do a read and don't inc command
glcd_WriteCmd0(0xc5);
//- - - - - - - - - - -
set_lcd_defaults();
LCD.r_bar=0; // Read
while(!LCDSTA0 && !LCDSTA1) //CAMBIO:&& por || //wait till both are one
;
////fprintf(DEBUG,".");
LCD.r_bar=1; // Release
LCD.cd=0; // Command/Data bar
LCD.r_bar=0; // Read
data=LCD1.data; // Latch data
LCD.r_bar=1; // Release
set_lcd_defaults();
////fprintf(DEBUG,"-0x%x-",data);
return(data); //Return the read data
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Sends data to LCD
// Ouputs: A byte of data read from the LCD
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_putc( char c) {
////fprintf(DEBUG,"P=0x%x ",c);
switch (c) {
// case '\f' : lcd_send_byte(0,1);
// delay_ms(2);
// break;
// case '\n' : lcd_gotoxy(1,2); break;
// case '\b' : lcd_send_byte(0,0x10); break;
default : glcd_WriteCmd1(c-0x20,0xc0);break;//Write to LCD autoinc
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// 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
// Output: 1 if coordinate out of range, 0 if in range
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
glcd_pixel(int16 x,int16 y, int1 color)
{
int8 r=0,c=0;
c=color;//converting booean to an int8
if (x>=GLCD_COL)
{
bit_set(ERRORS,5);//ERRORS=bit 5. LCD x range exceeded
return (FALSE);
}
if (y>=GLCD_ROW)
{
bit_set(ERRORS,6);//ERRORS=bit 6. LCD y range exceeded
return (FALSE);
}
r=fmod(x,8);
glcd_WriteCmd2(GraphicsHome+(y*30+(x/8)),LCDSetPtr);
glcd_WriteCmd0(0xf0|(c<<3) |(7-r));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Draw a line on a graphic LCD using Bresenham's
// line drawing algorithm
// Inputs: (x1, y1) - the start coordinate
// (x2, y2) - the end coordinate
// color - ON or OFF
// Dependencies: glcd_pixel()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_line(int x1, int y1, int x2, int y2, int1 color)
{
signed int x, y, addx, addy, dx, dy;
signed long P;
int i;
dx = abs((signed int)(x2 - x1));
dy = abs((signed int)(y2 - y1));
x = x1;
y = y1;
if(x1 > x2)
addx = -1;
else
addx = 1;
if(y1 > y2)
addy = -1;
else
addy = 1;
if(dx >= dy)
{
P = 2*dy - dx;
for(i=0; i<=dx; ++i)
{
glcd_pixel(x, y, color);
if(P < 0)
{
P += 2*dy;
x += addx;
}
else
{
P += 2*dy - 2*dx;
x += addx;
y += addy;
}
}
}
else
{
P = 2*dx - dy;
for(i=0; i<=dy; ++i)
{
glcd_pixel(x, y, color);
if(P < 0)
{
P += 2*dx;
y += addy;
}
else
{
P += 2*dx - 2*dy;
x += addx;
y += addy;
}
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Draw a rectangle on a graphic LCD
// Inputs: (x1, y1) - the start coordinate
// (x2, y2) - the end coordinate
// fill - YES or NO
// color - ON or OFF
// Dependencies: glcd_pixel(), glcd_line()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_rect(int x1, int y1, int x2, int y2, int fill, int1 color)
{
if(fill)
{
int y, ymax; // Find the y min and max
if(y1 < y2)
{
y = y1;
ymax = y2;
}
else
{
y = y2;
ymax = y1;
}
for(; y<=ymax; ++y) // Draw lines to fill the rectangle
glcd_line(x1, y, x2, y, color);
}
else
{
glcd_line(x1, y1, x2, y1, color); // Draw the 4 sides
glcd_line(x1, y2, x2, y2, color);
glcd_line(x1, y1, x1, y2, color);
glcd_line(x2, y1, x2, y2, color);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Draw a bar (wide line) on a graphic LCD
// Inputs: (x1, y1) - the start coordinate
// (x2, y2) - the end coordinate
// width - The number of pixels wide
// color - ON or OFF
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_bar(int x1, int y1, int x2, int y2, int width, int1 color)
{
signed int x, y, addx, addy, j;
signed long P, dx, dy, c1, c2;
int i;
dx = abs((signed int)(x2 - x1));
dy = abs((signed int)(y2 - y1));
x = x1;
y = y1;
c1 = -dx*x1 - dy*y1;
c2 = -dx*x2 - dy*y2;
if(x1 > x2)
{
addx = -1;
c1 = -dx*x2 - dy*y2;
c2 = -dx*x1 - dy*y1;
}
else
addx = 1;
if(y1 > y2)
{
addy = -1;
c1 = -dx*x2 - dy*y2;
c2 = -dx*x1 - dy*y1;
}
else
addy = 1;
if(dx >= dy)
{
P = 2*dy - dx;
for(i=0; i<=dx; ++i)
{
for(j=-(width/2); j<width/2+width%2; ++j)
{
if(dx*x+dy*(y+j)+c1 >= 0 && dx*x+dy*(y+j)+c2 <=0)
glcd_pixel(x, y+j, color);
}
if(P < 0)
{
P += 2*dy;
x += addx;
}
else
{
P += 2*dy - 2*dx;
x += addx;
y += addy;
}
}
}
else
{
P = 2*dx - dy;
for(i=0; i<=dy; ++i)
{
if(P < 0)
{
P += 2*dx;
y += addy;
}
else
{
P += 2*dx - 2*dy;
x += addx;
y += addy;
}
for(j=-(width/2); j<width/2+width%2; ++j)
{
if(dx*x+dy*(y+j)+c1 >= 0 && dx*x+dy*(y+j)+c2 <=0)
glcd_pixel(x+j, y, color);
}
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Draw a circle on a graphic LCD
// Inputs: (x,y) - the center of the circle
// radius - the radius of the circle
// fill - YES or NO
// color - ON or OFF
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_circle(int x, int y, int radius, int1 fill, int1 color)
{
signed int a, b, P;
a = 0;
b = radius;
P = 1 - radius;
do
{
if(fill)
{
glcd_line(x-a, y+b, x+a, y+b, color);
glcd_line(x-a, y-b, x+a, y-b, color);
glcd_line(x-b, y+a, x+b, y+a, color);
glcd_line(x-b, y-a, x+b, y-a, color);
}
else
{
glcd_pixel(a+x, b+y, color);
glcd_pixel(b+x, a+y, color);
glcd_pixel(x-a, b+y, color);
glcd_pixel(x-b, a+y, color);
glcd_pixel(b+x, y-a, color);
glcd_pixel(a+x, y-b, color);
glcd_pixel(x-a, y-b, color);
glcd_pixel(x-b, y-a, color);
}
if(P < 0)
P+= 3 + 2*a++;
else
P+= 5 + 2*(a++ - b--);
} while(a <= b);
}
//////////////////////////////////////////////////////////////////
const BYTE TEXT[51][5] ={ 0x00, 0x00, 0x00, 0x00, 0x00, // SPACE
0x00, 0x00, 0x5F, 0x00, 0x00, // !
0x00, 0x03, 0x00, 0x03, 0x00, // "
0x14, 0x3E, 0x14, 0x3E, 0x14, // #
0x24, 0x2A, 0x7F, 0x2A, 0x12, // $
0x43, 0x33, 0x08, 0x66, 0x61, // %
0x36, 0x49, 0x55, 0x22, 0x50, // &
0x00, 0x05, 0x03, 0x00, 0x00, // '
0x00, 0x1C, 0x22, 0x41, 0x00, // (
0x00, 0x41, 0x22, 0x1C, 0x00, // )
0x14, 0x08, 0x3E, 0x08, 0x14, // *
0x08, 0x08, 0x3E, 0x08, 0x08, // +
0x00, 0x50, 0x30, 0x00, 0x00, // ,
0x08, 0x08, 0x08, 0x08, 0x08, // -
0x00, 0x60, 0x60, 0x00, 0x00, // .
0x20, 0x10, 0x08, 0x04, 0x02, // /
0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
0x04, 0x02, 0x7F, 0x00, 0x00, // 1
0x42, 0x61, 0x51, 0x49, 0x46, // 2
0x22, 0x41, 0x49, 0x49, 0x36, // 3
0x18, 0x14, 0x12, 0x7F, 0x10, // 4
0x27, 0x45, 0x45, 0x45, 0x39, // 5
0x3E, 0x49, 0x49, 0x49, 0x32, // 6
0x01, 0x01, 0x71, 0x09, 0x07, // 7
0x36, 0x49, 0x49, 0x49, 0x36, // 8
0x26, 0x49, 0x49, 0x49, 0x3E, // 9
0x00, 0x36, 0x36, 0x00, 0x00, // :
0x00, 0x56, 0x36, 0x00, 0x00, // ;
0x08, 0x14, 0x22, 0x41, 0x00, // <
0x14, 0x14, 0x14, 0x14, 0x14, // =
0x00, 0x41, 0x22, 0x14, 0x08, // >
0x02, 0x01, 0x51, 0x09, 0x06, // ?
0x3E, 0x41, 0x59, 0x55, 0x5E, // @
0x7E, 0x09, 0x09, 0x09, 0x7E, // A
0x7F, 0x49, 0x49, 0x49, 0x36, // B
0x3E, 0x41, 0x41, 0x41, 0x22, // C
0x7F, 0x41, 0x41, 0x41, 0x3E, // D
0x7F, 0x49, 0x49, 0x49, 0x41, // E
0x7F, 0x09, 0x09, 0x09, 0x01, // F
0x3E, 0x41, 0x41, 0x49, 0x3A, // G
0x7F, 0x08, 0x08, 0x08, 0x7F, // H
0x00, 0x41, 0x7F, 0x41, 0x00, // I
0x30, 0x40, 0x40, 0x40, 0x3F, // J
0x7F, 0x08, 0x14, 0x22, 0x41, // K
0x7F, 0x40, 0x40, 0x40, 0x40, // L
0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
0x7F, 0x02, 0x04, 0x08, 0x7F, // N
0x3E, 0x41, 0x41, 0x41, 0x3E, // O
0x7F, 0x09, 0x09, 0x09, 0x06, // P
0x1E, 0x21, 0x21, 0x21, 0x5E, // Q
0x7F, 0x09, 0x09, 0x09, 0x76};// R
const BYTE TEXT2[44][5]={ 0x26, 0x49, 0x49, 0x49, 0x32, // S
0x01, 0x01, 0x7F, 0x01, 0x01, // T
0x3F, 0x40, 0x40, 0x40, 0x3F, // U
0x1F, 0x20, 0x40, 0x20, 0x1F, // V
0x7F, 0x20, 0x10, 0x20, 0x7F, // W
0x41, 0x22, 0x1C, 0x22, 0x41, // X
0x07, 0x08, 0x70, 0x08, 0x07, // Y
0x61, 0x51, 0x49, 0x45, 0x43, // Z
0x00, 0x7F, 0x41, 0x00, 0x00, // [
0x02, 0x04, 0x08, 0x10, 0x20, // \
0x00, 0x00, 0x41, 0x7F, 0x00, // ]
0x04, 0x02, 0x01, 0x02, 0x04, // ^
0x40, 0x40, 0x40, 0x40, 0x40, // _
0x00, 0x01, 0x02, 0x04, 0x00, // `
0x20, 0x54, 0x54, 0x54, 0x78, // a
0x7F, 0x44, 0x44, 0x44, 0x38, // b
0x38, 0x44, 0x44, 0x44, 0x44, // c
0x38, 0x44, 0x44, 0x44, 0x7F, // d
0x38, 0x54, 0x54, 0x54, 0x18, // e
0x04, 0x04, 0x7E, 0x05, 0x05, // f
0x08, 0x54, 0x54, 0x54, 0x3C, // g
0x7F, 0x08, 0x04, 0x04, 0x78, // h
0x00, 0x44, 0x7D, 0x40, 0x00, // i
0x20, 0x40, 0x44, 0x3D, 0x00, // j
0x7F, 0x10, 0x28, 0x44, 0x00, // k
0x00, 0x41, 0x7F, 0x40, 0x00, // l
0x7C, 0x04, 0x78, 0x04, 0x78, // m
0x7C, 0x08, 0x04, 0x04, 0x78, // n
0x38, 0x44, 0x44, 0x44, 0x38, // o
0x7C, 0x14, 0x14, 0x14, 0x08, // p
0x08, 0x14, 0x14, 0x14, 0x7C, // q
0x00, 0x7C, 0x08, 0x04, 0x04, // r
0x48, 0x54, 0x54, 0x54, 0x20, // s
0x04, 0x04, 0x3F, 0x44, 0x44, // t
0x3C, 0x40, 0x40, 0x20, 0x7C, // u
0x1C, 0x20, 0x40, 0x20, 0x1C, // v
0x3C, 0x40, 0x30, 0x40, 0x3C, // w
0x44, 0x28, 0x10, 0x28, 0x44, // x
0x0C, 0x50, 0x50, 0x50, 0x3C, // y
0x44, 0x64, 0x54, 0x4C, 0x44, // z
0x00, 0x08, 0x36, 0x41, 0x41, // {
0x00, 0x00, 0x7F, 0x00, 0x00, // |
0x41, 0x41, 0x36, 0x08, 0x00, // }
0x02, 0x01, 0x02, 0x04, 0x02};// ~
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose: Write text on a graphic LCD
// Inputs: (x,y) - The upper left coordinate of the first letter
// textptr - A pointer to an array of text to display
// size - The size of the text: 1 = 5x7, 2 = 10x14, ...
// color - ON or OFF
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_text57(int x, int y, char* textptr, int size, int1 color)
{
const BYTE bytes_per_char=5;
int i, j, k, l, m; // Loop counters
BYTE pixelData[bytes_per_char]; // Stores character data
for(i=0; textptr[i] != '\0'; ++i, ++x) // Loop through the passed string
{
if(textptr[i] < 'S') //falta un = // Checks if the letter is in the first or second array
memcpy(pixelData, TEXT[textptr[i]-' '], bytes_per_char);
else if(textptr[i] <= '~') // Check if the letter is in the second array
memcpy(pixelData, TEXT2[textptr[i]-'S'], bytes_per_char);
else
memcpy(pixelData, TEXT[0], bytes_per_char); // Default to space
if(x+5*size >= GLCD_COL) // Performs character wrapping
{
x = 0; // Set x at far left position
y += 7*size + 1; // Set y at next position down
}
for(j=0; j<bytes_per_char; ++j, x+=size) // 5 bytes per character
{
for(k=0; k<7*size; ++k) // Loop through the vertical pixels
{
if(bit_test(pixelData[j], k)) // Check if the pixel should be set
{
for(l=0; l<size; ++l) // The next two loops change the
{ // character's size
for(m=0; m<size; ++m)
{
glcd_pixel(x+m, y+k*size+l, color); // Draws the pixel
}
}
}
}
}
}
}
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//// Purpose: Fill the LCD screen with the passed in color.
//// Works much faster than drawing a rectangle to fill the screen
//// Inputs: ON - turn all the pixels on
//// OFF - turn all the pixels off
//// Dependencies: glcd_WriteByte()
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//void glcd_fillScreen(int1 color)
//{
// int line_num, column;
// // Loop through the lines
// //fprintf(DEBUG,"Fill screen with %d\n\r",color);
// for(line_num = 0; line_num < 8; ++line_num)
// {
// glcd_WriteByte(0, 0xB0+line_num);
// glcd_WriteByte(0, 0x10);
// glcd_WriteByte(0, 0x00);
// // Loop through the horline_numzontal sectline_numons
// for(column = 0; column < 128; ++column)
// {
// glcd_WriteByte(1, 0xFF*color); // Turn all pixels on or off
// }
// }
//
//}
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//// Purpose: Selects a font and sets up areas
//// Ouputs: A bit that is applied to the FS(font select) pin
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//void glcd_FontSelect(int1 fs) {
// LCD.fs=fs;
// switch (fs)
// {
// case 1:
// glcd_WriteCmd2(TextHome,0x40);
// glcd_WriteCmd2(AreaSet_T,0x41);
// glcd_WriteCmd2(GraphicsHome,0x42);
// glcd_WriteCmd2(AreaSet_G,0x43);
// break;
// default:
// glcd_WriteCmd1(c-0x20,0xc0);
// break;
// }
//}
////////////////////////////////JUNK YARD ////////////////////////////////////
////////////////////////////////JUNK YARD ////////////////////////////////////
////////////////////////////////JUNK YARD ////////////////////////////////////
////// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
////// Purpose: Reads status of LCD
////// Ouputs: Returns 1=busy 0=not busy
////// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
////int1 glcd_notbusy()
////{
//// BYTE data,count=0; // Stores the data read from the LCD
//// do
//// {
//// set_tris_lcd(0xFF) ; // Port D inputs
//// LCD.cd=1; //Instruction
//// LCD.r_bar=0; //Read
//// LCD.w_bar=1; //not write
//// data=LCD.data;
//// LCD.r_bar=1; //Release Read
//// set_tris_lcd(0xFF);//Port D tristate
//// ++count;
////// //fprintf(DEBUG,"count=%U\r",count);
//// if (count>3){return(0);}
//// }while (!bit_test(data,1) || !bit_test (data,0) );//til bit0 and bit1==1
//// return (1); //Return status
////} |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|