Module LCD HD44780

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Module LCD HD44780

Message par Flype »

Je vous fais part d'un petit délire, dernièrement.

Je me suis acheté un petit écran LCD (sur Adafruit.com, très bon site de matos type Arduino)
Ce petit écran est branché en USB sur mon ordinateur portable sous Windows.

Je partage cette modeste expérience pour ceux qui voudrait jouer un peu avec ce type de périphériques (vraiment pas très cher).

http://www.adafruit.com/products/782

Image

J'ai installé le pilote qui va bien - voir ici :

https://learn.adafruit.com/usb-plus-ser ... /downloads

Ensuite, je vous partage une include qui facilite beaucoup la programmabilité du LCD via PureBasic :

Code : Tout sélectionner

;=======================================================
;== Description: HD44780 compatible RGB Character LCD
;== Filename: HD44780.pbi
;== Author: flype, 2015
;=======================================================

DeclareModule LCD
  
  ; CONSTANTS
  
  Enumeration 0
    #LCD_AUTOSCROLL_ON    = $51
    #LCD_AUTOSCROLL_OFF   = $52
    #LCD_BRIGHTNESS       = $98
    #LCD_BRIGHTNESS2      = $99
    #LCD_COLOR            = $D0
    #LCD_COMMAND          = $FE
    #LCD_CONTRAST         = $50
    #LCD_CONTRAST2        = $91
    #LCD_CURSOR_HOME      = $48
    #LCD_CURSOR_BACK      = $4C
    #LCD_CURSOR_FORWARD   = $4D
    #LCD_CURSOR_POSITION  = $47
    #LCD_CURSOR_ON        = $53
    #LCD_CURSOR_OFF       = $54
    #LCD_CUSTOM_CHAR      = $4E
    #LCD_CUSTOM_CHAR_LOAD = $C0
    #LCD_CUSTOM_CHAR_SAVE = $C1
    #LCD_DISPLAY_CLEAR    = $58
    #LCD_DISPLAY_ON       = $42
    #LCD_DISPLAY_OFF      = $46
    #LCD_SIZE             = $D1
    #LCD_SPLASH_SCREEN    = $40
    #LCD_UNDERLINE_ON     = $4A
    #LCD_UNDERLINE_OFF    = $4B
  EndEnumeration
  
  ; FUNCTIONS
  
  Declare AutoScroll(OnOff)
  Declare Blink(OnOff)
  Declare Brightness(Value.b)
  Declare Clear()
  Declare Close()
  Declare Color(Value.l)
  Declare Contrast(Value.b)
  Declare Display(OnOff)
  Declare Home()
  Declare Open(Name.s)
  Declare Position(Column.b, Row.b)
  Declare Write(Text.s)
  Declare WriteAt(Column.b, Row.b, Text.s)
  
EndDeclareModule

;=======================================================

Module LCD
  
  ;=====================================================
  ;== GLOBALS
  ;=====================================================
  
  Global port = 0
  
  ;=====================================================
  ;== PRIVATES
  ;=====================================================
  
  Procedure SendByte(Value.b)
    WriteSerialPortData(port, @Value, 1)
  EndProcedure
  
  Procedure SendCommand(Value.b)
    SendByte(#LCD_COMMAND)
    SendByte(Value)
  EndProcedure
  
  Procedure SendString(Text.s)
    WriteSerialPortString(port, Text, #PB_Ascii)
  EndProcedure
  
  ;=====================================================
  ;== PUBLICS
  ;=====================================================
  
  Procedure AutoScroll(OnOff)
    If OnOff
      SendCommand(#LCD_AUTOSCROLL_ON)
    Else
      SendCommand(#LCD_AUTOSCROLL_OFF)
    EndIf
  EndProcedure
  
  Procedure Blink(OnOff)
    If OnOff
      SendCommand(#LCD_CURSOR_ON)
    Else
      SendCommand(#LCD_CURSOR_OFF)
    EndIf
  EndProcedure
  
  Procedure Brightness(Value.b)
    SendCommand(#LCD_BRIGHTNESS)
    SendByte(Value)
  EndProcedure
  
  Procedure Clear()
    SendCommand(#LCD_DISPLAY_CLEAR)
  EndProcedure
  
  Procedure Close()
    CloseSerialPort(port)
  EndProcedure
  
  Procedure Color(Value.l)
    SendCommand(#LCD_COLOR)
    SendByte(Red(Value))
    SendByte(Green(Value))
    SendByte(Blue(Value))
  EndProcedure
  
  Procedure Contrast(Value.b)
    SendCommand(#LCD_CONTRAST)
    SendByte(Value)
  EndProcedure
  
  Procedure Display(OnOff)
    If OnOff
      SendCommand(#LCD_DISPLAY_ON)
      SendByte(0)
    Else
      SendCommand(#LCD_DISPLAY_OFF)
    EndIf
  EndProcedure
  
  Procedure Home()
    SendCommand(#LCD_CURSOR_HOME)
  EndProcedure
  
  Procedure Open(Name.s)
    port = OpenSerialPort(#PB_Any,Name,9600,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,1024,1024)
    ProcedureReturn port
  EndProcedure
  
  Procedure Position(Column.b, Row.b)
    SendCommand(#LCD_CURSOR_POSITION)
    SendByte(Column)
    SendByte(Row)
  EndProcedure
  
  Procedure Write(Text.s)
    SendString(Text)
  EndProcedure
  
  Procedure WriteAt(Column.b, Row.b, Text.s)
    LCD::Position(Column, Row)
    SendString(Text)
  EndProcedure
  
EndModule

;=======================================================
Une horloge de base !

Image

Code : Tout sélectionner

IncludeFile "HD44780.pbi"

If LCD::Open("COM3")
  LCD::Display(#True)
  LCD::Color(#Red)
  LCD::Home()
  LCD::Clear()
  If OpenWindow(0, 10, 10, 100, 50, "LCD")
    Repeat
      LCD::WriteAt(4, 1, FormatDate("%dd/%mm/%yyyy", Date()))
      LCD::WriteAt(5, 2, FormatDate("%hh:%ii:%ss", Date()))
    Until WaitWindowEvent(1000) = #PB_Event_CloseWindow
    CloseWindow(0)
  EndIf
  LCD::Display(#False)
  LCD::Close()
EndIf
Un petit player de modules :

Image

Code : Tout sélectionner

IncludeFile "HD44780.pbi"

Global exit.l = #False

InitSound()

;=======================================================

Procedure update(music)
  
  Protected row, pos, startdate = Date()
  Protected fileName.s  = "AmigaModules\ProjectX_intro.mod"
  Protected filePart.s  = GetFilePart(fileName)
  Protected filePartLen = Len(fileName)
  Protected scrollIndex = 1
  
  If LoadMusic(0, fileName)
    PlayMusic(0)
    fileName = ReplaceString(fileName, ":", "_")
    fileName = ReplaceString(fileName, "/", "_")
    fileName = ReplaceString(fileName, "\", "_")
    LCD::WriteAt(1, 2, "000/000")
    While exit = #False
      LCD::WriteAt(1, 1, LSet(Mid(fileName, scrollIndex, filePartLen - scrollIndex), 16, " "))
      LCD::WriteAt(9, 2, FormatDate("%hh:%ii:%ss", Date()-startdate))
      If pos <> GetMusicPosition(music)
        LCD::WriteAt(1, 2, RSet(Str(pos), 3, "0"))
        pos = GetMusicPosition(music)
      EndIf
      If row <> GetMusicRow(music)
        LCD::WriteAt(5, 2, RSet(Str(row), 3, "0"))
        row = GetMusicRow(music)
      EndIf
      Delay(200)
      scrollIndex + 1
      If scrollIndex > filePartLen
        scrollIndex = 1
      EndIf
    Wend
  EndIf
  
EndProcedure

;=======================================================

If LCD::Open("COM3")
  LCD::Display(#True)
  LCD::Color(#Blue)
  LCD::Home()
  LCD::Clear()
  If OpenWindow(0, 10, 10, 100, 50, "LCD")
    Thread0 = CreateThread(@update(), 0)
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    CloseWindow(0)
    exit = #True
  EndIf
  WaitThread(Thread0)
  LCD::Display(#False)
  LCD::Close()
EndIf
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Module LCD HD44780

Message par Flype »

En associant çà au module OpenWeatherAPI, çà me fera un nouveau petit jouet :mrgreen:
Image
Mesa
Messages : 1098
Inscription : mer. 14/sept./2011 16:59

Re: Module LCD HD44780

Message par Mesa »

Génial, je vais peut-être me laisser tenter...

M.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Module LCD HD44780

Message par G-Rom »

il est autonome ton module USB ? si non , autant le faire avec un duino , non ?
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Module LCD HD44780

Message par Flype »

Le module n'est pas autonome, càd qu'il n'a pas sa propre alim.
Il est alimenté par USB ou port série. Il y a les 2 connectiques. J'ai testé les 2 et c'est ok.

J'ai également essayé avec un Arduino UNO et MEGA en port série (RS232) en C Arduino, c'est très intéressant aussi.
Mon objectif est tout autre, brancher ca sur mon Amiga 1200, en interne, et intégrer le LCD à la coque, et ainsi programmer le LCD via le Motorola 68020.
Mais c'est aussi utile sur un PC pour des applications pro type caisse enregistreuse avec affichage des prix sur LCD, c'est courant.

Enfin, c'est là qu'on peut regretter que PureBasic n'ai pas de portage ARM pour le brancher sur un Raspberry, les possibilités serait multipliées.
Le Raspberry permettrai de faire des solutions embarquées, avec à dispo plus de ressources qu'un Arduino (cpu, ram, disk, ethernet, hdmi, ...).

L'Arduino c'est génial (reprogrammer le microcontroler notamment) mais il faut y connecter quelques devices supplémentaires pour étendre les possibilités (ex: module wifi avec service REST).
Image
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Module LCD HD44780

Message par G-Rom »

quand je disait autonome, j'entendais "programmable", comme un arduino , tu lui colles une alim , et hop , plus besoin de la liaison serie pour fonctionné.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Module LCD HD44780

Message par Flype »

Bah donc, je redis, non, il n'est pas autonome, c'est un device qui a besoin d'être piloté par ce qu'on veut - du moment que l'hôte a une connexion RS232 ou USB. D'aillleurs, je ne connais pas de LCD autonome. Et puis autonome c'est bien mais c'est limité. Comment un LCD autonome (qui embarquerai son programme) pourrait communiquer avec l'extérieur ? Tout au plus, en autonome, on peut facilement faire une horloge de base, des petites anims types demos. Mais si on veut par exemple lui faire afficher la progression d'une lecture de musique, des infos cherchées sur internet (par ex météo) etc... il faut bien qu'il puisse communiquer avec d'autres ressources.
Image
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Module LCD HD44780

Message par G-Rom »

moi non plus, mais ton module usb aurais pu l'être ^^ d'ou ma question.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Module LCD HD44780

Message par Flype »

Pas de souci, je ne suis pas moi-même super au courant des modules électroniques dispo sur le marché, il y en a des milliers...

En tout cas, je voulais juste vous faire part d'une include qui pourrait permettre aux gens de comprendre comment programmer en PureBasic avec le Port Série, et ainsi comprendre que (à chaque fois c'est la même logique) il faut envoyer des séquences de codes. Dans mon ancien travail, j'avais comme çà par exemple programmé en PureBasic le pilotage - via des séquences de bytes - d'impression de tickets de caisse (avec logo etc...) sur des imprimantes TMH6000 ou la lecture de piste CMC7 des chèques pour vérifier si c'est un chèque volé etc... (d'ailleurs dans ce cas la communication est bidirectionnelle alors que pour le LCD la communication est unidirectionnelle).

Image
Image
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Module LCD HD44780

Message par G-Rom »

j'ai eu ce "petit" kit de capteurs pour l'arduino sur Amazon de sunfounder : http://www.amazon.fr/dp/B00D9MZYFM/ref= ... nkCode=df0
C'est vraiment pas mal , il y a même le lcd , vivement que PB soit portable sur l'embarqué :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Module LCD HD44780

Message par Flype »

G-Rom a écrit :Vivement que PB soit portable sur l'embarqué :D
+1(00)
Image
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Module LCD HD44780

Message par G-Rom »

non, des modules wifi, oui , tu peu même passer par des ondes radio / laser , etc...
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Module LCD HD44780

Message par MetalOS »

La future version de PB ne va pas permettre la compilation pour proco arm comme sue le Raspberry Pi ?
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Module LCD HD44780

Message par G-Rom »

en théorie oui. j'aimerais bien en tout cas.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Module LCD HD44780

Message par nico »

L'écran est très intéressant pour tester le port série, en effet, et ça permet de vérifier qu'il fonctionne toujours au cas où il serait intégré sur une carte.
en meme temps , il existe des ecrans Wifi non ?
Tu le mets sur une carte arduino, ensuite tu peux utiliser l'afficheur en ethernet, wifi et bluetooth.
Répondre