Dernière mise à jour le 13/03/16

Présentation


L’Afficheur électronique présenté dans cette article permet via une interface développé en C# sous Visual Studio d’écrire le nom de mon site “DJelectro71.com” sur un écran LCD 2×16 caractères à l’aide d’un clavier virtuelle, vous y trouverez l’exemple dans le prototype un peu plus bas qui a été entierrement développé et testé dans l’environnement MikroPascal sur platine EasyPic 7 . Le but était d’arriver à envoyer une chaine de caractères via le port USB afin que le logiciel du PIC 18F4550 puisse faire tout le travail pour décoder et d’envoyer directement les valeurs reçus sur l’afficheur LCD. Vous pourrez aborder la partie programmation un peu plus bas.

Schéma


Le schéma ci-dessous n’a rien de bien compliquer il suffit de raccorder l’écran LCD 2×16 sur les bonnes broches du PIC 18F4550.

Afficheur UsbHid 001

Programmation de l’interface


Pour que cela fonctionne il faut bien sûr mettre en place le driver disponible sur ce lien usbhiddriver

Programmation en C# Visual Studio


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using USBHIDDRIVER; // à placer dans Visual Studio en C#

namespace Afficheur_UsbHid_001
{
    public partial class Form1 : Form
    {
        int iStr=0;   
        USBHIDDRIVER.USBInterface usb = new USBHIDDRIVER.USBInterface("vid_1234", "pid_0001");
 
        public Form1()
        {
            InitializeComponent();
            usb.enableUsbBufferEvent(new System.EventHandler(myEventCatcher));
        }
        public void myEventCatcher(object sender, System.EventArgs e)
        {        
            if (USBHIDDRIVER.USBInterface.usbBuffer.Count > 0)
            {
                byte[] currentRecord = null;
                int counter = 0;
                while ((byte[])USBHIDDRIVER.USBInterface.usbBuffer[counter] == null)
                {
                    lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                    {
                        USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                    }
                }
                currentRecord = (byte[])USBHIDDRIVER.USBInterface.usbBuffer[0];
                lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                {
                    USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                }
                usb.stopRead();
            }
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        }
        public void Write_Data()
        {
            byte[] Buffer = new byte[64];
            if (iStr==1)
            {
                Buffer[iStr] = 0x44; // D
            }
            else
                if (iStr==2)
                {
                    Buffer[iStr] = 0x4A; //J
                }
                else
                    if (iStr == 3)
                    {
                        Buffer[iStr] = 0x65; //e
                    }
                    else
                        if (iStr == 4)
                        {
                            Buffer[iStr] = 0x6C; //l
                        }
                        else
                            if (iStr == 5)
                            {
                                Buffer[iStr] = 0x63; //c
                            }
                            else
                                if (iStr == 6)
                                {
                                    Buffer[iStr] = 0x74; //t
                                }
                                else
                                    if (iStr == 7)
                                    {
                                        Buffer[iStr] = 0x72; //r
                                    }
                                    else
                                        if (iStr == 8)
                                        {
                                            Buffer[iStr] = 0x6f; //o
                                        }
                                        else
                                            if (iStr == 9)
                                            {
                                                Buffer[iStr] = 0x37; //7
                                            }
                                            else
                                                if (iStr == 10)
                                                {
                                                    Buffer[iStr] = 0x31; //1
                                                }
                                                else
                                                    if (iStr == 11)
                                                    {
                                                        Buffer[iStr] = 0x2E; //.
                                                    }
                                                    else
                                                        if (iStr == 12)
                                                        {
                                                            Buffer[iStr] = 0x6D; //m
                                                        }
                                                        else
                                                            if (iStr == 13)
                                                            {
                                                                Buffer[iStr] = 0x01; //clear
                                                          }
            if (usb.write(Buffer)) // écriture dans le Buffer
            {
            }
        }

        private void Lettre_D_Click(object sender, EventArgs e)
        {                                
            iStr=1;   
            Write_Data();
        }

        private void Num_7_Click(object sender, EventArgs e)
        {
            iStr = 9;
            Write_Data();
        }

        private void Lettre_e_Click(object sender, EventArgs e)
        {
            iStr = 3;
            Write_Data();
        }

        private void lettre_t_Click(object sender, EventArgs e)
        {
            iStr = 6;
            Write_Data();
        }

        private void Num_1_Click(object sender, EventArgs e)
        {
            iStr = 10;
            Write_Data();
        }

        private void Lettre_l_Click(object sender, EventArgs e)
        {
            iStr = 4;
            Write_Data();
        }

        private void Lettre_c_Click(object sender, EventArgs e)
        {
            iStr = 5;
            Write_Data();
        }

        private void Lettre_o_Click(object sender, EventArgs e)
        {
            iStr = 8;
            Write_Data();
        }

        private void Lettre_r_Click(object sender, EventArgs e)
        {
            iStr = 7;
            Write_Data();
        }

        private void Lettre_J_Click(object sender, EventArgs e)
        {
            
            iStr = 2;
            Write_Data();
        }

        private void Dot_Click(object sender, EventArgs e)
        {
            iStr = 11;
            Write_Data();
        }

        private void Lettre_m_Click(object sender, EventArgs e)
        {
            iStr = 12;
            Write_Data();
        }

        private void Clear_Click(object sender, EventArgs e)
        {
            iStr = 13;
            Write_Data();
        }
    }
}   

Logiciel du PIC


 program Afficheur_UsbHid_001;
  var
  ReadBuff: array[64] of byte; absolute 0x500;
  WriteBuff: array[64] of byte; absolute 0x500;
  i:byte;
  iValueColomnLcd:byte;
  ConverCharByte:byte;
  LCD_RS : sbit at RB0_bit;
  LCD_EN : sbit at RB1_bit;
  LCD_D4 : sbit at RB2_bit;
  LCD_D5 : sbit at RB3_bit;
  LCD_D6 : sbit at RB4_bit;
  LCD_D7 : sbit at RB5_bit;
  LCD_RS_Direction : sbit at TRISB0_bit;
  LCD_EN_Direction : sbit at TRISB1_bit;
  LCD_D4_Direction : sbit at TRISB2_bit;
  LCD_D5_Direction : sbit at TRISB3_bit;
  LCD_D6_Direction : sbit at TRISB4_bit;
  LCD_D7_Direction : sbit at TRISB5_bit;
  procedure Main_Init;
    begin
     TRISB:=%00000000;
     LATB:=$00;
     Lcd_Init;
     Lcd_Cmd(_LCD_CURSOR_OFF)
    end;
  procedure Interrupt;
   begin
   USB_Interrupt_Proc;
   end;
  procedure Write_LCD;
   begin
   if (HID_Read()<>0) then
    begin
    for i:=0 to 63 do
      begin
      if (ReadBuff[i]<>0) then      
         begin
          ConverCharByte:=Chr(readBuff[i]);
          inc(iValueColomnLcd); //incrémente les conlonnes du LCD 
          Lcd_Chr(1,iValueColomnLcd,ConverCharByte); // converti la valeur lue en un caractère 

          begin
           if (ReadBuff[i]=1) then 
            begin
             iValueColomnLcd:=0;
             Lcd_Cmd(_LCD_CLEAR) ; // on efface l'écran LCD
            end;
          end;
        end;
      end;
    end;
  end;
   Begin
    Main_Init;
    HID_Enable(@Readbuff,@WriteBuff);
    While true do
     begin
     Write_LCd;
     end;
   end.

Prototype


Aucun, mais vous pouvez essayer l’interface Afficheur UsbHid 001, à vous de rentrer le programme en MikroPascal dans votre PIC et de créer le Vid/Pid

Proto_1

Juste une petite photo pour le plaisir des yeux…

Historiques


13/03/16
– Première mise à disposition