Ingo Electronics


stellaris launchpad.  16x2 LCD using shift register 74HC595

Panaudojus postūmio registrą 74HC595, LCD 16x2 ekranėlį prie mikrokontrolerio galima prijungti vos keliais laidais.

Žemiau pateikta schema kaip tai padaryti:

lcd_595

Mikroschema 74HC595 ir 10k paderinimo potenciometras sumontuojamas atskiroje PCB plokštelėje tokio pat dydžio kaip ir 16x2 LCD ekranėlis, po to jas sujungiant.

PCB plokštės projektą Proteus formatu galima parsisiūsti iš čia LCD_595.rar

arba pasidaryti pagal norimus parametrus.




Šiam projektui reikalingi du papildomi failai.
Darome taip: StellarisWare direktorijoje sukuriame naują aplanką kurį galime pavadinti kaip tik norima, Pvz. MyLib

Į naujai sukurtą aplanką įkeliame LCD funkcijų bibliotekos du failus: LCD_16x2_595_lib.c ir LCD_16x2_595_lib.h

Sekantis etapas CSS projekto direktorijoje sukuriame naują aplanką kurį taip pat galime pavadinti kaip tik norime, pvz. user_lib

Naujas aplankas CCS projekto direktorijoje sukuriamas taip:
File->New->Folder----Folder name: --- įrašome pavadinimą  -----Finish

Toliau galimi du variantai:
1. Jeigu LCD pajungimo vietos nekeisime ir mikrokontroleris dirbs 50Mhz, t.y nustatymai paliekami pagal nutylėjimą (default),
    tuomet užtenka tik nurodyti kelią (link'ą)  iki reikiamo c failo:
    -  Su dešiniu pelės klavišu pasirenkame Add Files.. susirandame anksčiau sukurtą MyLib aplanką ir jame pažymim failą LCD_16x2_595_lib.c  spaudžiam Open  atsidariusiame lange pažymime Link to files , spaudžiam OK .

Projekto direktorijoje atsiranda naujas failas su nedidele rodikle, rodyklė reiškia kad tai yra nuoroda į failą.
Šį naujai atsiradusį failą pelės pagalba nutempiame į anksčiau projekto direktorijoje sukurtą aplanką user_lib
Tuom lcd failų bibliotekos įkėlimas baigiamas, programos kode nurodome #include "MyLib/LCD_16x2_595_lib.h", reikia atkreipti dėmesį, kad yra nurodoma direktorija MyLib, o ne user_lib.
Turime gauti vaizdą kaip parodyta pav.:

Capture15

2. Jeigu LCD prijungimo vietą prie mikrokontrolerio norime pakeisti arba mikrokontroleris dirbs kitokiu, ne 50Mhz dažniu, tuomet patartina į projekto direktorija įkelti pilnas reikiamų failų kopijas, šiuo atveju reikalinga įkelti abu c ir h failus.
   - Su dešiniu pelės klavišu pasirenkame Add Files... susirandame anksčiau sukurtą MyLib aplanką, jame pasižymim abu failus LCD_16x2_595_lib.c ir LCD_16x2_595_lib.h spaudžiam Open atsidariusiame lange pažymime Copy files, spaudžiam OK .
Abu failai (šių failų kopijos) atsiranda projekto direktorijoje, kuriuos pelės pagalba nutempiame į anksčiau projekto direktorijoje sukurtą aplanką user_lib
Dabar atsidarius šiuos failus iš projekto direktorijos, galime juos redaguoti, orginalūs failai esantys MyLib  išliks nepakitę.
Tačiau dabar programos kode, nurodome #include "user_lib/LCD_16x2_595_lib.h" , atkreipdami dėmesį, į tai kad yra nurodoma user_lib, o ne MyLib.
Turime gauti vaizdą kaip parodyta pav.:

Capture16

P.S Svarbu!!!  abiem atvejais, jeigu kompiliatorius meta klaidą, arba kodas neveikia taip kaip priklauso, kartais gali tekti nuimti arba uždėti varnelę ir kompiliaciją atlikti dar kartą:
Properties->Build->Advanced Options->Language Options > Enable Support for GCC extensions (--gcc)bb

LCD_16x2_595_lib.h ir LCD_16x2_595_lib.c  galima parsisiusti iš čia:   Link

Pagal default dabar LCD pajungimo pinai yra tokie:

Enable         PB0
DATA           PB1
CLOCK         PB5

Norint LCD ekranėlį prijungti prie kitų kontaktų, reikės  LCD_16x2_595_lib.h faile pakeisti žemiau esančius raudonai pažymėtus nustatymus:
 
//LCD pins definition
#define  lcd_syst_ctl       
SYSCTL_PERIPH_GPIOB
#define  lcd_port             
GPIO_PORTB_BASE
#define  Enable                 
GPIO_PIN_0
#define  DATA                   
GPIO_PIN_1
#define  CLOCK                 
GPIO_PIN_5 


Rašant programos kodą, pirmiausia įvedamos dvi žemiau esančios funkijos:

LCD_595_Init();
LCD_16x2_595_init();

Likusiomis žemiau parodytomis funkcijomis programos kode galima naudoti savo nuožiūra:

Lcd_595_Chr_Cp(unsigned char c);    //Prints character on Lcd at current cursor position.
Lcd_595_Cmd(unsigned char c);         //Sends command to Lcd.
Lcd_595_text_Cp(char *StrData);      //Prints text on Lcd at current cursor position.
Lcd_595_Chr(char row, char column, char out_char);     //Prints character on Lcd at specified position.
Lcd_595_text(char row, char column, char *text);         //Prints text on Lcd starting from specified position.


//Programos kodo, naudojant 16x2 LCD su 74HC595, pavyzdys:
//Programos kodas veikia kai mikrokontrolerio taktinis dažnis yra 50Mhz
//kitu atveju LCD_16x2_595_lib.h pakeisti laiko išlaikymus.
//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_sysctl.h"
#include "inc/hw_gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"

#include "driverlib/stdlib.h" //for ltoa(..);

#include "MyLib/LCD_16x2_595_lib.h"

char buf[3];

signed int numer;
unsigned int shift;
//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

void main() {

    // Setup the system clock to run at 50 Mhz from PLL with crystal reference
        SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

        GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_6);

        GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00);

            LCD_16x2_595_init();

            LCD_595_Init();

            Lcd_595_Cmd(LCD_CURSOR_OFF);

            Lcd_595_text(1,1,"Mikroelektronika");

            for(shift=0;shift<6;shift++)

            SysCtlDelay(5000000);


        while(1){

            numer = 20;

            do
            {
            ltoa(numer, buf);
            Lcd_595_Cmd(LCD_CLEAR);
            Lcd_595_text(1,8,buf);
            numer--;
            SysCtlDelay(5000000);
            }
            while(numer>=0);

            Lcd_595_Cmd(LCD_CLEAR);

            Lcd_595_text(1,16,"STELLARIS LAUNCHPAD");

            Lcd_595_Cmd(SHIFT_ON);

            for(shift=0;shift<78;shift++) {Lcd_595_Cmd(SHIFT_RIGHT);SysCtlDelay(4000000);}

            Lcd_595_Cmd(SHIFT_OFF);

            Lcd_595_Cmd(LCD_CLEAR);

}

}
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''