Recherche librairie driver LCD ST7920 [Forums - HC908 et S08]
Recherche librairie driver LCD ST7920 [Forums - HC908 et S08]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



« 1 (2) 3 »


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
08/11/2007 20:51
De Lauzerville
Messages: 286
Hors Ligne
Ok, j'y suis arrivé, mais j'ai massacré le code d’origine. (repose en paix). Mais je suis un peu décu par la lenteur de l'affichage. Je vais voir si je peux améliorer ça.

Posté le : 14/04/2016 17:31
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Bon attends. Je viens de voir sur la doc du ST7920 que les instructions et le mode de fonctionnement est très proche du ST7032.

Mon code n'est pas encore tout à fait abouti, mais je te le poste ici tout à l'heure. C'est que je voulais attendre qu'il soit clean.


Posté le : 14/04/2016 20:15
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
08/11/2007 20:51
De Lauzerville
Messages: 286
Hors Ligne
Merci dinastar.
J'ai un peu arrangé le mien, mais je ne suis pas un pro du C. Par contre, le tien ou le mien, ça serait peut être bien de le mettre sur ce forum, histoire d'aider un peu ceux qui n'ont pas choisi le microcontrôleur Aduineau.

Posté le : 14/04/2016 20:46
Le microcontroleur, ça fait peur comme une grosse pizza, on ne sait déjà pas par où commencer.
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
/********************************************************************************
     NAME                : ST7032i.h
    
     EXTENDED NAME       : ST7032i LCD driver I2C routines
    
     LAYER               : Hardware Abstraction Level
        
     DESCRIPTION         : This file contains the program code to set the 
                           ST7032i LCD
                           
     AUTHOR              : Dinastar

COMMENTS :

REVISIONS :
---------------------------------------------------------------------------------
DATE               VERSION   REVISOR   DESCRIPTION                
---------------------------------------------------------------------------------
07.03.2016         V1.0      Dinastar  Creation    
---------------------------------------------------------------------------------
                
*********************************************************************************/

#ifndef ST7032I_H_
#define ST7032I_H_

/********************************************************************************/
/*                  DECLARATIONS / DEFINITIONS                                     */
/********************************************************************************/

#define LCDadr                    0x7C
#define Comsend                    0x00
#define Datasend                0x40
#define Line1                    0x00
#define Line2                    0xC0



// commands
#define LCD_CLEARDISPLAY        0b00000001
#define LCD_RETURNHOME            0b00000010
#define LCD_ENTRYMODESET        0b00000100
#define LCD_DISPLAYCONTROL        0b00001000
#define LCD_CURSORSHIFT         0b00010000
#define LCD_FUNCTIONSET            0b00100000
#define LCD_SETCGRAMADDR        0b01000000
#define LCD_SETDDRAMADDR        0b10000000

#define LCD_EX_SETBIASOSC        0b00010000
#define LCD_EX_CONTRASTSETL        0b01110000
#define LCD_EX_POWICONCONTRASTH    0b01010000
#define LCD_EX_SETICONRAMADDR   0b01000000        // Set ICON RAM address
#define LCD_EX_FOLLOWERCONTROL  0b01100000        // Follower control


// flags for display entry mode
#define LCD_ENTRYRIGHT          0x00
#define LCD_ENTRYLEFT           0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00

// flags for display on/off control
#define LCD_DISPLAYON           0x04
#define LCD_DISPLAYOFF          0x00
#define LCD_CURSORON            0x02
#define LCD_CURSOROFF           0x00
#define LCD_BLINKON             0x01
#define LCD_BLINKOFF            0x00

// flags for display/cursor shift
#define LCD_DISPLAYMOVE         0x08
#define LCD_CURSORMOVE          0x00
#define LCD_MOVERIGHT           0x04
#define LCD_MOVELEFT            0x00

// flags for function set
#define LCD_8BITMODE            0x10
#define LCD_4BITMODE            0x00
#define LCD_2LINE               0x08
#define LCD_1LINE               0x00
#define LCD_5x10DOTS            0x04
#define LCD_5x8DOTS             0x00
#define LCD_EX_INSTRUCTION      0x01        // IS: instruction table select

// flags for Bias selection
#define LCD_BIAS_1_4            0x08        // bias will be 1/4
#define LCD_BIAS_1_5            0x00        // bias will be 1/5

// flags Power / ICON control / Contrast set(high byte)
#define LCD_ICON_ON             0x08        // ICON display on
#define LCD_ICON_OFF            0x00        // ICON display off
#define LCD_BOOST_ON            0x04        // booster circuit is turn on
#define LCD_BOOST_OFF           0x00        // booster circuit is turn off

// flags Internal OSC Frequency
#define LCD_OSC_122HZ           0x00        // 122Hz@3.0V / 120Hz@5.0V
#define LCD_OSC_131HZ           0x01        // 131Hz@3.0V / 133Hz@5.0V
#define LCD_OSC_144HZ           0x02        // 144Hz@3.0V / 149Hz@5.0V
#define LCD_OSC_161HZ           0x03        // 161Hz@3.0V / 167Hz@5.0V
#define LCD_OSC_183HZ           0x04        // 183Hz@3.0V / 192Hz@5.0V
#define LCD_OSC_221HZ           0x05        // 221Hz@3.0V / 227Hz@5.0V
#define LCD_OSC_274HZ           0x06        // 274Hz@3.0V / 277Hz@5.0V
#define LCD_OSC_347HZ           0x07        // 347Hz@3.0V / 347Hz@5.0V

// flags Follower control
#define LCD_FOLLOWER_ON         0x08        // internal follower circuit is turn on
#define LCD_FOLLOWER_OFF        0x00        // internal follower circuit is turn off
#define LCD_RAB_1_00            0x00        // 1+(Rb/Ra)=1.00
#define LCD_RAB_1_25            0x01        // 1+(Rb/Ra)=1.25
#define LCD_RAB_1_50            0x02        // 1+(Rb/Ra)=1.50
#define LCD_RAB_1_80            0x03        // 1+(Rb/Ra)=1.80
#define LCD_RAB_2_00            0x04        // 1+(Rb/Ra)=2.00
#define LCD_RAB_2_50            0x05        // 1+(Rb/Ra)=2.50
#define LCD_RAB_3_00            0x06        // 1+(Rb/Ra)=3.00
#define LCD_RAB_3_75            0x07        // 1+(Rb/Ra)=3.75





/* Function Prototypes */

void extend(void);
void data(U8 u8text);
void CursorON(void);
void CursorOFF(void);
void ClearDisplay(void);
//void Show(U8 *text);
void ShowX(U8 *text);
void ShowVal(U8 u8val);
void nextline(void);
void CGRAM (void);
void init_LCD(void);
void testLCD(void);


#endif /* ST7032I_H_ */


/********************************************************************************
     NAME                : ST7032i.h
    
     EXTENDED NAME       : ST7032i LCD driver I2C routines
    
     LAYER               : Hardware Abstraction Level
        
     DESCRIPTION         : This file contains the program code to set the 
                           ST7032i LCD
                           
     AUTHOR              : Dinastar

COMMENTS :

REVISIONS :
---------------------------------------------------------------------------------
DATE               VERSION   REVISOR   DESCRIPTION                
---------------------------------------------------------------------------------
07.03.2016         V1.0      Dinastar  Creation    
---------------------------------------------------------------------------------
                
*********************************************************************************/

/********************************************************************************/
/*                  DECLARATIONS / DEFINITIONS                                     */
/********************************************************************************/

/*** Platform Type Definitions ***/
#include "derivative.h"                                          /* include peripheral declarations */
#include "tdef.h"                                                /* Type definitions */
#include <HIDEF.h>                                               /* for EnableInterrupts macro */

/*** C Runtime Library Declarations ***/

/*** Family Declaration(s) ***/ 
#include "INIT_S08PA16.h"
#include "ST7032i.h"
#include "I2C.h"
#include "OWIRE.h"
#include "tempos.h"


/*** External Declaration(s) ***/  
                                                                          
/*** Local functions prototypes ***/

/*** Global variables ***/







/********************************************************************************/
/*                     PROGRAM CODE                                                */
/********************************************************************************/

void data(U8 u8text)
{
        
I2C_START();
        
I2C_OUT(LCDadr);
        
I2C_OUT(Datasend);
        
I2C_OUT(u8text);
        
dly1msU16(30);
        
I2C_STOP();
}

void CursorON(void)
{
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Comsend);
    
I2C_OUT(LCD_DISPLAYCONTROL LCD_DISPLAYON LCD_CURSORON LCD_BLINKON);
    
dly1msU16(30);
    
I2C_STOP();
}

void CursorOFF(void)
{
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Comsend);
    
I2C_OUT(LCD_DISPLAYCONTROL LCD_DISPLAYON);
    
I2C_STOP();
}

void ClearDisplay(void)
{
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Comsend);
    
I2C_OUT(LCD_CLEARDISPLAY);
    
I2C_STOP();
    
dly1msU16(2);
}

//Show X chars, max 16 !
void ShowX(U8 *text)
{
    
//U8 test = "";
    
U8 nd;
    
d=0x00;
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Datasend);
    for(
n=0;n<16;n++){
        
        if(*
text != '')        //Stop writing data when detecting end of array ''
        
{
        
I2C_OUT(*text);
        ++
text;
        }
    }
    
I2C_STOP();
}

void ShowVal(U8 u8val)
{
    
//U8 test = "";
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Datasend);
    
I2C_OUT(u8val);
    
I2C_STOP();
}
/*****************************************************/

void nextline(void)
{
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Comsend);
    
I2C_OUT(Line2);
    
I2C_STOP();
}
void CGRAM (void)
{
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Comsend);
    
I2C_OUT(0x38);        //go to instruction table 0
    
I2C_OUT(0x40);        //Set CGRAM address to 0x00
    
I2C_STOP();
    
//delay(10);
    
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Datasend);
    
I2C_OUT(0x00);        //write to first CGRAM address
    
I2C_OUT(0x1E);
    
I2C_OUT(0x18);
    
I2C_OUT(0x14);
    
I2C_OUT(0x12);
    
I2C_OUT(0x01);
    
I2C_OUT(0x00);
    
I2C_OUT(0x00);        //8 bytes per character
    //continue writing to remaining CGRAM if desired
    
I2C_STOP();
}
/****************************************************
*           Initialization For ST7032i              *
*****************************************************/
void init_LCD(void
{
RST_LCD 1;
dly1msU16(50);
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Comsend);
    
I2C_OUT(LCD_FUNCTIONSET LCD_8BITMODE LCD_2LINE);                                    //function set
    
dly1usU8(30);
    
I2C_OUT(LCD_FUNCTIONSET LCD_8BITMODE LCD_2LINE LCD_EX_INSTRUCTION);                //function set
    
dly1usU8(30);
    
I2C_OUT(LCD_EX_SETBIASOSC LCD_OSC_183HZ);                                                //Internal OSC frequency adjustment
    
dly1usU8(30);
    
I2C_OUT(LCD_EX_CONTRASTSETL 0x08);                                                    //Contrast set
    
dly1usU8(30);
    
I2C_OUT(LCD_EX_POWICONCONTRASTH LCD_ICON_ON LCD_BOOST_ON 0x02);                    //Power/ICON/Contrast control
    
dly1usU8(30);
    
I2C_OUT(LCD_EX_FOLLOWERCONTROL LCD_FOLLOWER_ON LCD_RAB_1_25 LCD_RAB_2_00);        //Follower control
    
dly1msU16(200);                                                                            //for power stable
    
I2C_OUT(LCD_DISPLAYCONTROL LCD_DISPLAYON);                                            //DISPLAY ON
    
dly1usU8(30);
    
I2C_OUT(LCD_CLEARDISPLAY);                                                                //CLEAR DISPLAY
    
dly1msU16(2);
//I2C_OUT(0x06);                //ENTRY MODE SET
    
I2C_STOP();
dly1usU8(30);                                                                            //CURSOR MOVES TO RIGHT

//CGRAM();            //define CGRAM

/*I2C_START();
I2C_OUT(Slave);
I2C_OUT(Comsend);
I2C_OUT(0x39);        
I2C_OUT(0x01);        //go back Home
I2C_STOP();
dly1usU8(10);*/
}

Posté le : 14/04/2016 20:46
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
08/11/2007 20:51
De Lauzerville
Messages: 286
Hors Ligne
..

Posté le : 14/04/2016 20:47
Le microcontroleur, ça fait peur comme une grosse pizza, on ne sait déjà pas par où commencer.
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Ci-dessus, mes fichier .h et .c.

Le .c est encore en travaux, toutes les fonction n'ont pas été créés ...

Si ça peut t'aider ...

Posté le : 14/04/2016 20:48
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
08/11/2007 20:51
De Lauzerville
Messages: 286
Hors Ligne
Regarde ça !

par contre, y a trois trucs que j'aimerai rajouter :
1 - faire le module qui affiche une image
2 - Changer la police (ça j'arrive pas à trouver comment faire, car je crois qu'il y a des polices en mémoire).
3 - Pour partager ce code, je n'ai pas réussi à mettre dans #define, directement les ports utilisés. J'ai dù les écrire à chaque fois que j'en ai eu besoin.

voici le .h Ca marche, c'est en parallèle 8 bits.



/*
* st7920.h
*
* Created on: Apr 19, 2013
* Author: Peter Barnes
*
* Use and distribute freely for non-commercial uses, but please
* include this file and my name if you distribute or post it. Enjoy!
* ----------------------------------------------------------------------
* ** Modifié par Philippe Ribaut pour un mc9s08AW**
*/

#ifndef ST7920_H_
#define ST7920_H_

//#include <stdlib.h>
//#include <avr/io.h>
//#include <avr/iom8.h>
//#include <avr/pgmspace.h>
//#include <avr/interrupt.h>
//#include <util/delay.h>

// define pins here


#define DATA_PORT PTAD
#define DATA_IN PTAD;
//#define COMMAND_PORT PTED
#define DATAPORT_DIR PTADD

#define LED_DIRECTION PTDDD_PTDDD1
#define COMMAND_DIR_RS PTEDD_PTEDD3
#define COMMAND_DIR_RW PTEDD_PTEDD2
#define COMMAND_DIR_E PTFDD_PTFDD6

#define RS PTED_PTED3; // PC0 binary equivalent of pin number
#define RW PTED_PTED2; // PC1
#define E PTFD_PTFD6; // PC2
//#define LED PTDD_PTDD1; // led
#define delay_time 80 // default settling time in uS after a command is sent



uint packed_number[4];
uint numbers[12][5] = { // a minimal 3x5 numeric font
{0x0e, 0x0a, 0x0a, 0x0a, 0x0e}, // 0
{0x04, 0x04, 0x04, 0x04, 0x04}, // 1
{0x0e, 0x02, 0x0e, 0x08, 0x0e}, // 2
{0x0e, 0x02, 0x0e, 0x02, 0x0e}, // 3
{0x0a, 0x0a, 0x0e, 0x02, 0x02}, // 4
{0x0e, 0x08, 0x0e, 0x02, 0x0e}, // 5
{0x0e, 0x08, 0x0e, 0x0a, 0x0e}, // 6
{0x0e, 0x02, 0x02, 0x02, 0x02}, // 7
{0x0e, 0x0a, 0x0e, 0x0a, 0x0e}, // 8
{0x0e, 0x0a, 0x0e, 0x02, 0x02}, // 9
{0x00, 0x00, 0x0e, 0x00, 0x00}, // -
{0x00, 0x00, 0x00, 0x00, 0x00} // (space)
};

void glcd_init();
void write_data(uint data);
void test_ports(void);
void glcd_enable(void);
void e_lo(void);
void e_hi(void);
void rs_lo(void);
void rs_hi(void);
void rw_lo(void);
void rw_hi(void);
void toggle_E(void);

void cdisplay_clear(void);
void set_cgram_address(uint x, uint y);
void clcd_init();
void gotoxy(uint x, uint y);
void write_word(int x, int y, uint value);
void glcd_fill(uint value);
void write_wdata(uint data);
uint read_word(uint type);

void set_pixel(uint x, uint y);
void clr_pixel(uint x, uint y);
void write_number_xy(uint x, uint y, uint number);
void write_lnumber_xy(uint x, uint y, uint number);
void write_char(int x, int y, uint num_0, uint num_1, uint num_2, uint num_3);
void draw_vertical_line(int x, int y, int length);
void draw_horiz_line(int x, int y, int length);
void write_char_xy(uint x, uint y, uint number);
void write_gnumber_xy(uint x, uint y, uint number);

void _delay_us(uint tmp);

//int x = 0xffff;





void rs_hi()
{
PTED_PTED3=1 ;
_delay_us(delay_time);
}

uint read_word(uint type) // read data byte(type=1) or command register(type=0)
{
uint i, j = 0;
uint temp;
DATAPORT_DIR = 0x00; // set data port for input
DATA_PORT = 0x00;
e_lo();
if (type == 0)
{
rs_lo();
}
else
{
rs_hi();
}
rw_hi();
e_hi(); // toggle byte in
i = DATA_IN; // need I read this twice?
e_lo();

e_hi();
i = DATA_IN;
e_lo();
_delay_us(100);
e_hi();
j = DATA_IN;
e_lo();

temp = j;
temp = temp | (i << 8);

return(temp); // return byte read
}

void write_word(int x, int y, uint data) // x=0-7 (8 words per line), y=0-63, starting from top left
{
DATAPORT_DIR = 0xff; // set data port for output



e_lo();
rs_lo();
rw_lo();
// convert coordinates to weirdly-arranged 128x64 screen (the ST7920 is mapped for 256x32 displays).
if (y > 31)
{
y -= 32; // because there are only 31 addressable lines in the ST7920
x += 8; // so we overflow x (7 visible bytes per line) to reach the bottom half
}
x |= 0x80; // bit 7 signals that this is a data address write
y |= 0x80;
DATA_PORT = y; // Set vertical DDRAM address
toggle_E();
DATA_PORT = x; // Set horizontal DDRAM address
toggle_E();
rs_hi(); // signal for WRITE
DATA_PORT = (data >> 8); // Set horizontal DDRAM address
toggle_E();
DATA_PORT = data; // Set vertical DDRAM address
toggle_E();
}

void rs_lo()
{
PTED_PTED3=0; //
_delay_us(delay_time);
}

void rw_hi()
{
PTED_PTED2=1;
_delay_us(delay_time);
}

void rw_lo()
{
PTED_PTED2=0;
_delay_us(delay_time);
}

void e_hi()
{
PTFD_PTFD6=1;
_delay_us(delay_time);
}

void e_lo()
{
PTFD_PTFD6=0;
_delay_us(delay_time);
}

void toggle_E()
{
e_hi();
e_lo();
}

void clcd_init() // initialize as character display
{

PTBDD_PTBDD0=1;
PTBD_PTBD0=1;

PTBDD_PTBDD2=1;
_delay_us(50);
PTBD_PTBD2=1;
_delay_us(50);
PTBD_PTBD2=0;
_delay_us(50);
PTBD_PTBD2=1;
LED_DIRECTION=1;




DATAPORT_DIR = 0xff; // set data port for output
e_lo();
rs_lo();
rw_lo();
DATA_PORT = 0x30; // set 8-bit interface
toggle_E();
_delay_us(100);
DATA_PORT = 0x30; // set 8-bit interface, basic instruction set
toggle_E();
DATA_PORT = 0x0c; // display ON, cursor and blink OFF
toggle_E();
DATA_PORT = 0x01; // clear display, reset address
toggle_E();
DATA_PORT = 0x06; // display ON, no cursor
toggle_E();
PTDD_PTDD1=1;
}

void set_cgram_address(uint x, uint y)
{
e_lo();
rs_lo();
rw_lo();
DATAPORT_DIR = 0xff; // set data port for output
DATA_PORT = (0x40 | x);
toggle_E();
DATA_PORT = (0x40 | y);
toggle_E();
}

void glcd_enable(void) // start graphic mode
{
DATAPORT_DIR = 0xff;
e_lo();
rs_lo();
rw_lo();
DATA_PORT = 0x30; // set 8-bit interface
toggle_E();
_delay_us(100);
DATA_PORT = 0x36; // Repeat with graphics bit set to on.
toggle_E();
DATA_PORT = 0x0c; // display ON, cursor and blink OFF
toggle_E();
DATA_PORT = 0x01; // clear display, reset address
toggle_E();
DATA_PORT = 0x06; // display ON, no cursor
toggle_E();
}

void write_data(uint data)
{
DATAPORT_DIR = 0xff; // set data port for output
e_lo();
rs_hi();
rw_lo();
DATA_PORT = data; // write the byte to display at current address
toggle_E();
}

void write_wdata(uint data) // write a word at the current position
{
DATAPORT_DIR = 0xff; // set data port for output
e_lo();
rs_hi();
rw_lo();
DATA_PORT = (data >> 8); // write the byte to display at current address
toggle_E();
DATA_PORT = data;
toggle_E();
}

void test_ports(void)
{
int i;
DATAPORT_DIR = 0xff; // set data port for output
//COMMAND_DIR = 0xff; // command port as well
COMMAND_DIR_RS=1;
COMMAND_DIR_RW=1;
COMMAND_DIR_E =1;


for (i = 0; i < 30; ++i)
{
e_lo();
rs_lo();
rw_lo();
_delay_us(50000);
e_hi();
rs_hi();
rw_hi();
_delay_us(50000);
DATA_PORT = 0x00;
_delay_us(50000);
DATA_PORT = 0xff;
_delay_us(50000);
}
}

void cdisplay_clear(void)
{
DATAPORT_DIR = 0xff; // set data port for output
e_lo();
rs_lo();
rw_lo();
DATA_PORT = 0x01; // command to clear screen and reset address counter
toggle_E();
}

void gotoxy(uint x, uint y) // x=0-7, y=0-63 (for 128 x 64 display)
{
DATAPORT_DIR = 0xff; // set data port for output
e_lo();
rs_lo();
rw_lo();
// convert coordinates to weirdly-arranged 128x64 screen (the ST7920 is mapped for 256x32 displays).
if (y > 31)
{
y -= 32; // because there are only 31 addressable lines in the ST7920
x += 8; // so we overflow x (7 visible bytes per line) to reach the bottom half
}
x |= 0x80; // bit 7 signals that this is a data address write
y |= 0x80;
DATA_PORT = y; // Set vertical DDRAM address
toggle_E();
DATA_PORT = x; // Set horizontal DDRAM address
toggle_E();;
}

void glcd_fill(uint value) // fill with (value; e.g., a 4-digit hex number). Zero clears the screen.
{
uint i, j;
for (i = 0; i < 64; i++)
{
for (j = 0; j < 8; j++)
{
write_word(j, i, value);
}
}
}

void wait(void) // wait for busy flag to clear
{
int i = 0;
while (i == 1)
{
i = read_busy_flag();
}
}

void set_pixel(uint x, uint y)
{
uint x_wd, x_pixel;
uint temp;
uint dot = 0x8000; // this will be rotated into it's correct position in the word
x_wd = x / 16; // find address of word with our pixel (x; 0-7)
x_pixel = x - (x_wd * 16); // get the modulo remainder; that's our pixel's position in the word
gotoxy(x_wd, y);
temp = read_word(1); // read word from screen at that position
temp = (temp | (dot >> x_pixel)); // convert x_pixel into a bit position, 0-16
write_word(x_wd, y, temp);
}

void clr_pixel(uint x, uint y)
{
uint x_wd, x_pixel;
uint temp;
uint dot = 0x7fff; // this will be rotated into it's correct position in the word
x_wd = x / 16; // find address of word with our pixel (x; 0-7)
x_pixel = x - (x_wd * 16); // get the modulo remainder; that's our pixel's position in the word
gotoxy(x_wd, y);
temp = read_word(1); // read word from screen at that position
temp = (temp & (dot >> x_pixel)); // convert x_pixel into a bit position, 0-16
write_word(x_wd, y, temp);
}

void write_number_xy(uint x, uint y, uint number) // write single digit on word boundary (x=0-7)
{
uint i=0;
uint temp = 0;
for (i = 0; i < 5; i++)
{
temp = numbers[number][i];
temp = temp << 12;
write_word(x, (y + i), temp);
}
}

void write_lnumber_xy(uint x, uint y, uint number) // write a 1-4 digit number on a word boundary (0-7)
{
uint j[4]; // the individual digits, from left to right
if (number > 999)
{
j[0] = number / 1000;
number = number - (1000 * j[0]);
}
else
{
j[0] = 0x0b; // blank first zero if present
}

if (number > 99)
{
j[1] = number / 100;
number = number - (100 * j[1]);
}
else
{
j[1] = 0;
}

if (number > 9)
{
j[2] = number / 10;
number = number - (10 * j[2]);
}
else
{
j[2] = 0;
}
j[3] = number; // at this point j[] has 4 separate decimal digits

write_char(x, y, j[0], j[1], j[2], j[3]);

}

void write_char(int x, int y, uint num_0, uint num_1, uint num_2, uint num_3) // write 4-digit number on word boundary
{
int j;
uint temp = 0;
uint packed_number[5];
for (j = 0; j < 5; j++)
{
temp = (numbers[num_0][j]);
temp = temp << 4;
temp |= (numbers[num_1][j]);
temp = temp << 4;
temp |= (numbers[num_2][j]);
temp = temp << 4;
temp |= (numbers[num_3][j]);
packed_number[j] = temp;
}
for (j = 0; j < 5; j++)
{
write_word (x,y+j, packed_number[j]);
}
}

void draw_vertical_line(int x, int y, int length)
{
int i;
for (i=0; i<length; i++)
{
set_pixel(x, y);
x++;
}
}

void draw_horiz_line(int x, int y, int length)
{
int i;
for (i=0; i<length; i++)
{
set_pixel(x, y);
y++;
}

}

void write_char_xy(uint x, uint y, uint number) // write a digit anywhere using set_pixel. Slower, but flexible for placement on the screen
{
uint h, i, j, l, m = x;
uint k = 0x08;
h=0;
for (i=0; i<5; i++)
{
l = (numbers[number][h]);
for (j = 0; j < 3; j++)
{
if (l & k)
{
set_pixel(m, y);
}
m++;
k /=2;
}
h++;
y++;
m=x;
k=0x08;
}
}

void write_gnumber_xy(uint x, uint y, uint number) // write a 1-4 digit number on any x-y pixel
{
uint j[4]; // the individual digits, from left to right
if (number > 999)
{
j[0] = number / 1000;
number = number - (1000 * j[0]);
}
else
{
j[0] = 0x0b; // blank first zero if present
}

if (number > 99)
{
j[1] = number / 100;
number = number - (100 * j[1]);
}
else
{
j[1] = 0;
}

if (number > 9)
{
j[2] = number / 10;
number = number - (10 * j[2]);
}
else
{
j[2] = 0;
}
j[3] = number; // at this point j[] has 4 separate decimal digits

write_char_xy(x, y, j[0]);
x=x+4;
write_char_xy(x, y, j[1]);
x=x+4;
write_char_xy(x, y, j[2]);
x=x+4;
write_char_xy(x, y, j[3]);
}

void _delay_us(uint tmp){
int i=0 ;
while (tmp>0){
tmp--;
for (i = 0; i < 2; ++i) {
//wait ;
};
}
}

#endif /* ST7920_H_ */





Posté le : 14/04/2016 21:03

Edité par Asterix sur 15/04/2016 06:36:52
Edité par Asterix sur 15/04/2016 06:37:34
Le microcontroleur, ça fait peur comme une grosse pizza, on ne sait déjà pas par où commencer.
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
08/11/2007 20:51
De Lauzerville
Messages: 286
Hors Ligne
Le C pour essai : sur un mc9s08

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "st7920phil.h"

#ifdef __cplusplus
extern "C"
#endif
void MCU_init(void); /* Device initialization function declaration */

void main(void) {
int ii;
int jj;
int kk;
char string1[16] = " ST7920 ";
char string3[16] = " Peter Barnes ";
char string2[16] = "Mode PARALLELE ";
char string4[16] = "Philippe RIBAUT ";
int i=0;
int j=0;
int k=0;


MCU_init(); /* call Device Initialization */

/* include your code here */

DATAPORT_DIR = 0xff; // set DATAPORT to output
DATA_PORT = 0x00; // set outputs to 0 initially
//COMMAND_DIR = 0x07; // set command port to output
//COMMAND_PORT = 0x00; // set outputs to 0 initially
COMMAND_DIR_RS=1;
COMMAND_DIR_RW=1;
COMMAND_DIR_E=1;
PTED_PTED3=0;
PTED_PTED2=0;
PTFD_PTFD6=0;




clcd_init(); // initialize as character display
cdisplay_clear(); // clear character screen and reset address to 0
// set_cgram_address(0, 0);
for (ii = 0; ii < 16; ++ii) {
write_data(string1[ii]);
}
for (ii = 0; ii < 16; ++ii) {
write_data(string2[ii]);
}
for (ii = 0; ii < 16; ++ii) {
write_data(string3[ii]);
}
for (ii = 0; ii < 16; ++ii) {
write_data(string4[ii]);
}
// write_lnumber_xy(20, 20, 92);


for (ii = 0; ii < 30; ++ii) { // TEMPO 5 s
_delay_us(30000);
}


cdisplay_clear();

glcd_enable();
glcd_fill(0x0000);

gotoxy(0,0); // read test; read from 0,0, write this to 4,32
i=read_word(1);
write_word(7, 63, i);





for (ii = 0; ii < 30; ++ii) { // TEMPO 5 s
_delay_us(30000);
}


_delay_us(1000);

//draw a graph with x and y axis
write_char_xy(7, 59, 0);
write_gnumber_xy(113, 59, 100);
write_char_xy(0, 0, 9); //
write_char_xy(0, 53, 0);

//****************
// _delay_ms(200);
draw_vertical_line(6,57,121);
draw_horiz_line(6, 0, 57);

// imitate a plot
k=32;
for (i=7; i<128; i++)
{
j=rand() % 3;
set_pixel(i, k);
if (j == 1)
{
k=k-1;
}
if (j > 1)
{
k=k+1;
}
}


//********


for(;;) {
/* __RESET_WATCHDOG(); by default, COP is disabled with device init. When enabling, also reset the watchdog. */
} /* loop forever */
/* please make sure that you never leave main */
}

Posté le : 14/04/2016 21:08
Le microcontroleur, ça fait peur comme une grosse pizza, on ne sait déjà pas par où commencer.
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
08/11/2007 20:51
De Lauzerville
Messages: 286
Hors Ligne
Désolé pour le post qui fait 10 pages.:

Le port data est le port A
Le RW sur le port E2
Le RS sur le port E3
Le E sur le port F6

Le PSB sur D1 mais peut être directement branché sur le +5v
Le reset sur D2, mais facultatif il semble.

Posté le : 14/04/2016 21:16
Le microcontroleur, ça fait peur comme une grosse pizza, on ne sait déjà pas par où commencer.
Transférer la contribution vers d'autres applications Transférer


Re: Recherche librairie driver LCD ST7920
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
RE,

Bien sûr, il faut partager chacune de nos expériences dans les articles. Je le ferai lorsque tout sera au point.

Si tu peux toujours éditer, peux tu mettres ton code entre les balise
[code]
[/code] stp ?

Pour tes defines, je crois qu'il y a des trucs qui vont pas. Des underscore pas au bon endroit et surtout, des ; ou des : en fin de ligne define !?

Posté le : 14/04/2016 22:36
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
« 1 (2) 3 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Recherche librairie driver LCD ST7920 [Forums - HC908 et S08]