dernière mise à jour le 03/04/16

Présentation


Ce nouveau montage permet d’écrire via un clavier raccorder sur le port USB d’écrire sur les deux lignes de l’afficheur LCD 2×16 caractères. je vous laisse vous plonger dans les lignes de codes situées ci-dessous

Schéma



Afficheur UsbHid 003

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.Windows.Forms;
using USBHIDDRIVER;


namespace Afficheur_UsbHid_003
{
    public partial class Form1 : Form
    {
       
        USBHIDDRIVER.USBInterface usb = new USBHIDDRIVER.USBInterface("vid_1234", "pid_0001");
        byte[] Buffer = new byte[64];
        int i = 0; // on commence à zéro c'est mieux!!  
        int i2 = 0;
        bool bSend = true; // la variable booléen est vérifiée l'envois des données est en service
        bool bSend2 = true; 
        bool bClear = false;
        Int iCountBuffer;

        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)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }


  // =============== Chaque préssions sur le bouton envoies les données au PIC 18F4550 sur la 1ere ligne de l'afficheur LCD===============//
        private void Send_Click(object sender, EventArgs e)
        {
            bSend = true;
            bSend2 = false;
            Write_data();                
            
        }


  // =============== Chaque préssions sur le bouton envoies les données au PIC 18F4550 sur la 2ème ligne de l'afficheur LCD===============//
        private void send2_Click(object sender, EventArgs e)
        {
            bSend2 = true;
            bSend = false;
            Write_data();                
            

        }
 // =============== La procédure Write_date, permet de gérer le mode "send" ou "clear" ===============//
        private void Write_data()
        {

//===========================ECRITURE 1er LIGNE SUR L'AFFICHEUR LCD===================================================//
// La variable booléen est vrai tant que le bouton "Clear" n'a pas été appuyé
            if (bSend == true)
            {
 //lorsqu'on écrit dans la textbox1, la phase est intégré dans une chaine de caractère nommé "inputString"
                string inputSring = textBox1.Text.ToString();

// Ensuite on converti la chaine de caractère présente dans "inpuString" en ASCII en décomposant chaques lettre en décimal
                byte[] bArray = Encoding.ASCII.GetBytes(inputSring);

 // il est possible ensuite de parcourir un tableau de façon séquentielle et en lecture seule  grâçe à l'instruction "foreach"
                foreach (byte bElements in bArray)
                {
                   
                    i++; //chaque fois que l'instruction récupère un seul caractère dans une chaine "inputstring" on incrémente le Buffer          
                    Buffer[i] = bElements; // on intègre le caractère récupérer dans le buffer
                }

                if (i==32) // La ligne du haut compte de 0 à 32 Bytes et arrivé à 32 on remet à zéro
                {
                    i = 0; 
                }

            }
 //===========================ECRITURE 2ème LIGNE SUR L'AFFICHEUR LCD===================================================//

 // La variable booléen est vrai tant que le bouton "Clear" n'a pas été appuyé
            if (bSend2 == true)
            {
 //lorsqu'on écrit dans la textbox1, la phase est intégré dans une chaine de caractère nommé "inputString"
                string inputSring2 = textBox2.Text.ToString();            

// Ensuite on converti la chaine de caractère présente dans "inpuString" en ASCII en décomposant chaque lettre en décimal
                byte[] bArray2 = Encoding.ASCII.GetBytes(inputSring2);
 // il est possible ensuite de parcourir un tableau de façon séquentielle et en lecture seule  grâçe à l'instruction "foreach"
                foreach (byte bElements2 in bArray2)
                {
                    i2++; //chaque fois que l'instruction récupère un seul caractère dans une chaine "inputstring" on incrémente le Buffer          
                    Buffer[i2+32] = bElements2; // on intègre le caractère récupéré dans le Buffer
                }      
               
                if (i2==63) // La ligne du bas compte de 32 à 63 et arrivée à 63 on remet à zéro
                {
                    i2 = 0;
                }

            }

// La variable booléen est vrai tant que le bouton "Clear" n'a pas été appuyé

            else

//===========================ON EFFACE L'AFFICHEUR LCD===================================================//

// La variable booléen est fausse lorsque le bouton "Clear" a  été appuyé
                if (bClear == true)
                {
                    for (iCountBuffer = 0; iCountBuffer < 63; iCountBuffer++)// 
                        Buffer[iCountBuffer] = 0x01; 
                        textBox1.Text = ""; // on efface la textbox
                        textBox2.Text = ""; // on efface la textbox
                 
// Lorsque la boucle à comptée jusqu'à 63 on remet la variable boolléen à l'état vrai afin d'envoyer de nouveau des messages
                    if (iCountBuffer==63)
                    {
                        bSend = true;  // on passe la variable à l'état faux 
                        bSend2 = true;  // on passe la variable à l'état faux 
                        bClear = false;  // on passe la variable à l'état faux 
                        i = 0; // on remet l'incrémentation à zéro pour recommencer le cycle
                        i2 = 0; // on remet l'incrémentation à zéro pour recommencer le cycle
               
                    }

                }

           

            if (usb.write(Buffer)) // écriture dans le Buffer
            {

            }
        }
               

        private void Clear_Click(object sender, EventArgs e)
        {
            
            bClear = true;  // on passe la variable à l'état faux      
            bSend = false;  // on passe la variable à l'état faux 
            bSend2 = false;  // on passe la variable à l'état faux  
           
            Write_data(); // on exécute la procédure Write_data()

        }
               
    }
}

Logiciel du PIC


program Afficheur_UsbHid_003;
 var
 ReadBuff: array[64] of byte; absolute 0x500;
 WriteBuff: array[64] of byte; absolute 0x500;
 i, i2:byte;
 iValueColomnLcd, iValueColomnLcd2:byte;

ConverCharByte, ConverCharByte2: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 32 do //On compte de 0 à 32 pour la ligne du haut 
       begin
        if (ReadBuff[i]<>0) then
           begin
             ConverCharByte:=Chr(ReadBuff[i]);
             Lcd_Chr(1,i,ConverCharByte);
             ReadBuff[i]:=0;
           end;

           begin
             if (ReadBuff[i]=1) then
               begin
                 iValueColomnLcd:=0;
                 Lcd_Cmd(_LCD_CLEAR);
               end;
           end;
       end;

   for i2:=32 to 63 do // On compte de 32 à 63 pour la ligne du bas 
      begin
        if (ReadBuff[i2]<>0) then
        begin
         ConverCharByte2:=Chr(ReadBuff[i2]);
         Lcd_Chr(2,(i2-32),ConverCharByte2);
         ReadBuff[i2]:=0;
        end;
      begin
        if (ReadBuff[i2]=1) then
        begin
         iValueColomnLcd2:=0;
         Lcd_Cmd(_LCD_CLEAR);
        end;
      end;
    end;
  end;
 end;
  Begin
   Main_Init;
   HID_Enable(@Readbuff,@WriteBuff);
   While true do
    begin
     Write_LCd;
    end;
  end.

Prototype


Pas de prototype mais le petit fichier qui va avec Afficheur UsbHid 003

Historiques


03/04/16
– Ajout schéma et modification de la console ainsi que la programmation C#
19/03/16
– Première mise à disposition