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

Présentation


Le montage électronique présenté ci-dessous, est une amélioration de l’afficheur Afficheur UsbHid 001 qui celui-ci utilise un clavier virtuelle, alors que l’afficheur UsbHid 002 utilise le clavier uniquement. Oui! plus besoin de cliquer sur le clavier virtuelle avec la souris puisque si vous utilisé un clavier c’est encore mieux et plus rapide.

Schéma


Afficheur UsbHid 002

Programmation de l’interface


Driver UsbHid

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_002
{
    public partial class Form1 : Form
    {
        USBHIDDRIVER.USBInterface usb = new USBHIDDRIVER.USBInterface("vid_1234", "pid_0001");// à créer depuis le logiciel MikroPascal
        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 pression sur le bouton envoie les données au PIC 18F4550 ===============//
        private void Send_Click(object sender, EventArgs e)
        {
            bSend = true; 
            Write_data();             
        }

        // =============== La procédure Write_date, permet de gérer le mode "Send" ou "Clear" ===============//
        private void Write_data()
        {
         // La variable booléenne est vraie tant que le bouton "Clear" n'a pas été appuyé
            if (bSend == true)
            {
        //lorsqu'on écrit dans la textbox1, la phrase est intégrée dans une chaîne de caractère nommée "inputString"
                string inputSring = textBox1.Text.ToString();

        // Ensuite on converti la chaîne de caractère présente dans "inpuString" en ASCII en décomposant chaque lettre en Byte via "GetByte
                byte[] bArray = Encoding.ASCII.GetBytes(inputSring);

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

            else

          // La variable booléenne est fausse lorsque le bouton "Clear" a été appuyé
                if (bSend == false)
                {
                    for (iCountBuffer = 0; iCountBuffer < 63; iCountBuffer++)// 
                        Buffer[iCountBuffer] = 0x01; 
                        textBox1.Text = ""; // on efface la textbox

          // Lorsque la boucle à compter jusqu'à 63 on remet la variable booléenne à l'état vraie afin d'envoyer de nouveau des messages
                    if (iCountBuffer==63)
                    {
                        bSend = true; // état de la variable vraie
                        i = 0; // on remet l'incrémentation à zéro pour recommencer le cycle
                    }

                }

        // =============== Chaque pression sur le bouton efface les données du PIC 18F4550 ===============//
            if (usb.write(Buffer)) // écriture dans le Buffer
            {

            }
        }               

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

Logiciel du PIC


  program Afficheur_UsbHid_002;
  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]);
             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;
        end;
     end;

  Begin
   Main_Init;
   HID_Enable(@Readbuff,@WriteBuff);
   While true do
     begin
      Write_LCd;
     end;
   end.

prototype


Aucun mais le fichier Afficheur UsbHid 002
Non testé sur platine EasyPic mais les résultats donne déjà un bon aperçu.

Proto_1

Historiques


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