Problem z wyświetlaniem Tekstu na GLCD ze sterownikiem ST7565 mam już za sobą. Wszystko działa bez zarzutu, z wyjątkiem próby załadowania BitMapy na LCD.
Poniżej przedstawiam fragmenty bibliotek w której są komendy do wyświetlania Obrazu:
LCD_ST7565.h
//-----------------------------------------------------------------------
// LCD_DisplayPicture
// Picture Size: Hight*Weight
//-----------------------------------------------------------------------
uint8_t LCD_DisplayPicture(char *Picture, uint8_t adrPage, uint8_t adrColumn,uint8_t Weight, uint8_t Hight);
void LCD_Draw_Pixel(uint8_t Xpos,uint8_t Ypos,uint8_t Color);
void XY_Goto5_7(uint8_t adrPage, uint8_t adrColumn); // Coursor XY_Goto
void XY_Goto8_16(uint8_t adrPage, uint8_t adrColumn); // Coursor XY_Goto
void disp_set_pixel(uint8_t x, uint8_t y, uint8_t pixel_status);
void disp_clear_dont_refresh();
void lcd_spi_write(unsigned char hexwrite); //SPI Init starten
void dogm_reset(void); // Display Reset
void lcd_set_cs(uint8_t enable); // set Display cs
void lcd_set_a0(uint8_t type); // set Display a0
void delay_s(uint8_t sec); // Delay
void disp_init(void); //Display EA DOGM128-6 Init und Clear
void LCD_DisplayChar5_7(uint8_t Dig);
void LCD_DisplayChar8_16(uint8_t Dig);
void LCD_DisplayOnOff(uint8_t On);
void LCD_PowerControl(uint8_t Power);
void LCD_SetStartLine(uint8_t LineStart);
void LCD_SetPageAddress(uint8_t Page);
void LCD_SetColumnAddress(uint8_t Column);
void LCD_CLR_PICTURE(uint8_t Data);
void LCD_CLR(void);
uint8_t xy_adrColumn;
uint8_t xy_adrPage;
fragmenty LCD_ST7565.c
//-----------------------------------------------------------------------------
// LCD:Clear picture.
//-----------------------------------------------------------------------------
void LCD_CLR_PICTURE(uint8_t Data)
{
uint8_t adrPage, adrLaw;
for(adrPage = 0; adrPage < MAX_PAGE; adrPage++)
{
LCD_SetPageAddress(adrPage);
LCD_SetColumnAddress(0);
for(adrLaw = 0; adrLaw < MAX_COLUMN; adrLaw++)
{
dogm_core_data(Data);
}
}
}
void LCD_CLR(void)
{
uint8_t adrPage, adrLaw, Data;
Data = 0;
for(adrPage = 0; adrPage < MAX_PAGE; adrPage++)
{
LCD_SetPageAddress(adrPage);
LCD_SetColumnAddress(0);
for(adrLaw = 0; adrLaw < MAX_COLUMN; adrLaw++)
{
dogm_core_data(Data);
}
}
}
.
.
.
//-----------------------------------------------------------------------
// LCD_DisplayPicture
// Picture Size: Hight*Weight
//-----------------------------------------------------------------------
uint8_t LCD_DisplayPicture(char *Picture, uint8_t adrPage, uint8_t adrColumn,uint8_t Weight, uint8_t Hight)
{
uint8_t *dptr; // dptr_adderss for Dig code.
uint8_t i, j;
if((adrPage+Hight)>MAX_PAGE) return FALSE;
if((adrColumn+Weight)>MAX_COLUMN) return FALSE;
dptr = (uint8_t *)Picture;
for(i=0; i<Hight; i++)
{
LCD_SetPageAddress(adrPage+i);
LCD_SetColumnAddress(adrColumn);
for(j=0; j<Weight; j++)
{
dogm_core_data(pgm_read_byte(dptr));
}
}
return TRUE;
}
oraz cały main.c
#include "global.h"
#include "main.h"
typedef enum {LCD_DATA, LCD_CMD} lcd_type_t;
#include "dogm-core.h"
#include "LCD_ST7565.h"
#include "rprintf.h"
#include "Obraz.h"
void lcd_spi_write(unsigned char hexwrite) //SPI Init
{
delay_us(1);
SPDR = hexwrite; // Daten nach Sender und starten
// while(!(SPSR & (1<<SPIF))); // warte bis Bit 1: fertig
loop_until_bit_is_set(SPSR, SPIF); // warte bis Bit 1: fertig
delay_us(1);
hexwrite = SPDR; // SPIF wider 0 (Pseudolesen)
}
void lcd_set_a0(uint8_t type)
{
if (type) cbi(LCD_DOGM_PORT, LCD_DOGM_A0); // Command (LCD_CMD) // Reg Select: 0 => Instruction Reg (w)
else sbi(LCD_DOGM_PORT, LCD_DOGM_A0); // Data (LCD_DATA) // Reg Select: 1 => Data Reg (w)
}
void lcd_set_cs(uint8_t enable)
{
if (enable) cbi(LCD_DOGM_PORT, LCD_DOGM_CSB); // DOGM select = LOW
else sbi(LCD_DOGM_PORT, LCD_DOGM_CSB); // DOGM deselect = HIGH
}
int main(void)
{
RES_PORT |= (1<<RES_BIT);
LCD_DOGM_DPORT = 0xff; // set output
LCD_DOGM_PORT = 0xff; // clear LEDS
sbi(DDRC,7);
SPCR = (1 << SPE) | (1 << MSTR) | (1<<SPR0); // SPI Master
InitDelay();
dogm_core_set_remore(&(lcd_spi_write), &(lcd_set_a0), &(lcd_set_cs), &(delay_us)); //SPI Init
rprintfInit(LCD_DisplayChar5_7); // define output function for 5x7 char size
Delay(1000); //Inicialization 100ms Default delay is 100us
disp_init();
LCD_DisplayPicture(Obraz, 0, 0,128, 64);
while (1)
{
}
}
void delay_us(u32 time_us)
{
u32 i;
if (time_us < 1 ) time_us = 1;
for (i=0; i < time_us*2; i++) {};
}
Cała procedura jaką wykonuję:
- Rysunek czarnym pędzlem w Paint'cie zapisuję jako JPG.
- Zapisany Rysunek otwieram programem LCD Assistant, lub microLCD, i w nim przerabiam, JPG na plik w którym znajdują się kody w postaci 16-stkowej np."0x9f"
- Zmieniam rozszerzenie na xxx.h i dodaję bibliotekę do Header Files w AVR Studio 4 oraz dodaję do main'a
#include xxx.h - Próbuję wywołać BitMape za pomocą
LCD_DisplayPicture(Obraz, 0, 0,128, 64); Lecz na LCD'ku nie ma nic...
Jeśli ktoś wie jak rozwiązać mój problem, będę bardzo wdzięczny za każdą podpowiedź...
Z góry dziękuję i Pozdrawiam.
![[AtMega 32] [C] Problem z Bitmapą do GLCD ST7565 [AtMega 32] [C] Problem z Bitmapą do GLCD ST7565](https://img339.imageshack.us/img339/3058/1003755k.jpg)
![[AtMega 32] [C] Problem z Bitmapą do GLCD ST7565 [AtMega 32] [C] Problem z Bitmapą do GLCD ST7565](https://img210.imageshack.us/img210/2871/1003756t.jpg)
![[AtMega 32] [C] Problem z Bitmapą do GLCD ST7565 [AtMega 32] [C] Problem z Bitmapą do GLCD ST7565](https://img217.imageshack.us/img217/8105/1003754.jpg)