1 BeagleBone


P8

.

P9

.

PIN - numer pinu na złączu.
PROC - na procesorze
NAME - co po włączeniu co standardowo
MODE 0-7 - różne tryby pracy, jak widać tryb GPIO w trybie 7
na P8 mamy możliwość 44 GPIO  (piny 1-2 uzmiemnienie)
na P9 mamy możliwość 23 GPIO, razem 67.


Opis GPIO

gpio1[6] - modul 1 , pin 6 w systemie (katalogu) widać to inaczej.

w katalogu /sys/class/gpio/  mamy liste katalogow numerowanych gpioXX gdzie XX to numer

aby przekonwertować sposób gpio1[6] na XX     1x32 + 6=38      XX=33

XX to nie software pins number tylko KERNEL!!

w katalogu    /sys/class/gpio/      mamy foldery gpioXX  które są kernel no

w katalogu /sys/kernel/debug/pinctrl/44e10800.pinmux mamy plik pins w którym są SOFTWARE
poniżej tabela excela do rozszyfrowania software pins numbers

Konfiguracja rejestrów PIN

konfiguracja MODE 0-7: conf_<module>_<pin>Register(offser=800h-A34h)


BASE_ADDRESS(of control module register) + 800h
gdzie
BASE_ADRESS(Control Module) = 0x44E1_0000

czyli pod adresem  0x44E1_0000 + 800 - mamy pin conf register

opis jego bitów:

0-2 (3 bity) - określają MODE0-7
3                 0 -pullup/pulldown ENABLED   1- DISABLED
4                 0 - pulldown select   1-pullup select
5                 0 - outputmode  1-INPUT mode (resetowany co 1h)
6                 0 - fast   1 slow

folder który koresponduje z tym rejestrem:

/sys/kernel/debug/pinctrl/44e10800.pinmux

jest w nim plik  pins

w jego zawartości dla kolejnych pinów mamy adresy i ich ustawienie powyższego rejestru.
wartosc 0000007 - oznacza że ustawiony jest mode7 (w 3 pierwszych bitach  7)

numery pinów (software pin number)są umowne, żeby znaleźć skorzystaj z tabeli:


mozna poprzez   cat pins |more  wyświetlić i posprawdzać czy ustawienia pinów zgadzają się z ustawieniami standardowymi.
Ustawienia standardowe mogą być pozmieniane podczas startu systemu (dts files w kernelu linuxa w katalogu linux4.4/arch/arm/boot/dts i plik w przypadku bbb o am335x)


W katalogu  /sys/kernel/debug/pinctrl/44e10800.pinmux

mamy też plik:  pinmux-pins

opis przypisania pinów do grup


posprawdzać grupy (wyraźniej) mozna też w pliku:

pingroups


Wbudowane LED

Dioda:   GPIO Signal   KERNEL_GPIO_no
USR0    GPIO1_21             53
USR1    GPIO1-22              54
USR2    GPIO1_23             55
USR3    GPIO1_24             56


sprawdzamy w katalogu  /sys/class/gpio/
nie ma katalogu gpio53

gdybyś chciał stworzyć taki katalog

#echo 53 > export

pliki w powstałym katalogu mogą sterować diodą (  echo 1 > value )

albo możesz wejść do katalogu /sys/class/leds/
i tam w katalogach zakonczonych na usr0-usr3 mamy pliki

sterowanie plikiem triger

echo "none" > triger     - wyłączy diodę


Kontrola z poziomu C: ( po prostu zapis do pliku w opisanym przed chwilą  folderze)

/*This function writes the tigger values for the given "led_no"
 * returns 0 if success, else -1 
 */
int write_trigger_values(uint8_t led_no, char *value)
{
 int fd,ret=0;
 char buf[SOME_BYTES];
 
 /* we are concatenating  2 strings and storing that in to 'buf'  */
 snprintf(buf,sizeof(buf),SYS_FS_LEDS_PATH "/beaglebone:green:usr%d/trigger",led_no);
 
 /* open the file in write mode */
 /*Returns the file descriptor for the new file. The file descriptor returned is always the smallest integer greater than zero that is still available. If a negative value is returned, then there was an error opening the file.*/
 fd = open(buf, O_WRONLY );
 if (fd <= 0) {
  perror(" write trigger error\n");
  return -1;
 }
 
 /* Write the 'value' in to the file designated by 'fd' */
 /*Returns the number of bytes that were written. 
   If value is negative, then the system call returned an error.
 */
 ret = write(fd, (void*)value, strlen(value) );
 if ( ret <= 0)
 {
  printf("trigger value write error\n");
  return -1;
 }
 
 return 0;

}
.


Wcześniej można sprawdzić czy value się zgadza z dostępnymi opcjami(pobierane z opcji arg pliku)

void process_trigger_values( char *value)
{ 
 if( ! (strcmp(value, "timer") && strcmp(value, "heartbeat") && \
   strcmp(value, "none") && strcmp(value, "oneshot") && \
   strcmp(value, "default-on") ) )
 {
   write_trigger_values(USR_LED_NUMBER,value);
 }
 else /* default: */
 {
  printf("Invalid value\n");
  printf("valid trigger values : heartbeat,timer,none,oneshot,default-on\n");
 }


}


definiujemy:

#define SYS_FS_LEDS_PATH "/sys/class/leds"

//#define SYS_FS_ "/sys/class/leds/beaglebone:green:usr3"

#define USR_LED_NUMBER 3
#define SOME_BYTES 100


i wywołujemy funkcję w main z argumentem podanym za nazwą pliku

process_trigger_values(argv[2]);



Wyświetlacz 7 elementowy 

przykład kodu

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
/*==================================================================================
BBB_expansion_header_P8_pins           GPIO number            7Seg Display segment
===================================================================================
P8.7                                   GPIO_66                     a
P8.8                                   GPIO_67                     b
P8.9                                   GPIO_69                     c
P8.10                                  GPIO_68                     h //decimal point
P8.11                                  GPIO_45                     d
P8.12                                  GPIO_44                     e
P8.14                                  GPIO_26                     f
P8.16                                  GPIO_46                     g
=================================================================================== */

#define GPIO_66     66
#define GPIO_67     67
#define GPIO_69     69
#define GPIO_68     68
#define GPIO_45     45
#define GPIO_44     44
#define GPIO_26     26
#define GPIO_46     46


#define GPIO_66_P8_7_SEGA       GPIO_66
#define GPIO_67_P8_8_SEGB       GPIO_67
#define GPIO_69_P8_9_SEGC       GPIO_69
#define GPIO_68_P8_10_DP        GPIO_68
#define GPIO_45_P8_11_SEGD      GPIO_45
#define GPIO_44_P8_12_SEGE      GPIO_44
#define GPIO_26_P8_14_SEGF      GPIO_26
#define GPIO_46_P8_16_SEGG      GPIO_46



#define HIGH_VALUE    1
#define LOW_VALUE     0

#define GPIO_DIR_OUT        HIGH_VALUE
#define GPIO_DIR_IN         LOW_VALUE

#define GPIO_LOW_VALUE      LOW_VALUE
#define GPIO_HIGH_VALUE     HIGH_VALUE

#define SEGMENT_ON          0
#define SEGMENT_OFF         1


/* This is the path corresponds to GPIOs in the 'sys' directory */
#define SYS_GPIO_PATH   "/sys/class/gpio"
#define SOME_BYTES    100


/*
 *  GPIO configure direction
 *  dir_value : 1 means 'out' , 0 means "in"
 */
int gpio_configure_dir(uint32_t gpio_num, uint8_t dir_value)
{
    int fd;
    char buf[SOME_BYTES];

    snprintf(buf, sizeof(buf), SYS_GPIO_PATH "/gpio%d/direction", gpio_num);

    fd = open(buf, O_WRONLY);
    if (fd < 0) {
        perror("gpio direction configure\n");
        return fd;
    }

    if (dir_value)
        write(fd, "out", 4); //3+1  +1 for NULL character
    else
        write(fd, "in", 3);

    close(fd);
    return 0;
}

/*
 *  GPIO write value
 *  out_value : can be either 0 or 1
 */
int gpio_write_value(uint32_t gpio_num, uint8_t out_value)
{
    int fd;
    char buf[SOME_BYTES];

    snprintf(buf, sizeof(buf), SYS_GPIO_PATH "/gpio%d/value", gpio_num);

    fd = open(buf, O_WRONLY);
    if (fd < 0) {
        perror("gpio write value\n");
        return fd;
    }

    if (out_value)
        write(fd, "1", 2);
    else
        write(fd, "0", 2);

    close(fd);
    return 0;
}



/* This function initializes all the gpios for this application
*/
int initialize_all_gpios(void)
{
 /*  we are driving the leds , so,
  * 1. first make the gpio which drives the led to output mode , that means set the direction as "out"
  * 2. then write the value "0" to turn off all the leds or segments.
  */

    gpio_configure_dir(GPIO_66,GPIO_DIR_OUT);
    gpio_write_value(GPIO_66, GPIO_LOW_VALUE );

    gpio_configure_dir(GPIO_67,GPIO_DIR_OUT);
    gpio_write_value(GPIO_67, GPIO_LOW_VALUE );

    gpio_configure_dir(GPIO_69,GPIO_DIR_OUT);
    gpio_write_value(GPIO_69, GPIO_LOW_VALUE );

    gpio_configure_dir(GPIO_68,GPIO_DIR_OUT);
    gpio_write_value(GPIO_68, GPIO_LOW_VALUE );

    gpio_configure_dir(GPIO_45,GPIO_DIR_OUT);
    gpio_write_value(GPIO_45, GPIO_LOW_VALUE );

    gpio_configure_dir(GPIO_44,GPIO_DIR_OUT);
    gpio_write_value(GPIO_44, GPIO_LOW_VALUE );

    gpio_configure_dir(GPIO_26,GPIO_DIR_OUT);
    gpio_write_value(GPIO_26, GPIO_LOW_VALUE );

    gpio_configure_dir(GPIO_46,GPIO_DIR_OUT);
    gpio_write_value(GPIO_46, GPIO_LOW_VALUE );

    return 0;

}

/* This function displays number on the 7segment display */
void Write_number_to_7segdisplay(uint8_t numberToDisplay)
{

    switch (numberToDisplay){

    case 0:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_ON);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_ON);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_ON);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_OFF);
    break;

    case 1:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_OFF);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_OFF);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_OFF);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_OFF);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_OFF);
    break;

    case 2:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_OFF);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_ON);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_ON);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_OFF);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_ON);
    break;

    case 3:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_ON);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_OFF);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_OFF);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_ON);
    break;

    case 4:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_OFF);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_OFF);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_OFF);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_ON);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_ON);
    break;

    case 5:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_OFF);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_ON);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_OFF);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_ON);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_ON);
    break;

    case 6:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_OFF);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_ON);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_ON);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_ON);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_ON);
    break;

    case 7:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_OFF);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_OFF);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_OFF);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_OFF);
    break;

    case 8:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_ON);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_ON);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_ON);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_ON);
    break;

    case 9:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_ON);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_ON);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_ON);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_ON);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_OFF);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_ON);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_ON);
    break;

    case 10:
        gpio_write_value(GPIO_66_P8_7_SEGA, SEGMENT_OFF);
        gpio_write_value(GPIO_67_P8_8_SEGB, SEGMENT_OFF);
        gpio_write_value(GPIO_69_P8_9_SEGC, SEGMENT_OFF);
        gpio_write_value(GPIO_45_P8_11_SEGD, SEGMENT_OFF);
        gpio_write_value(GPIO_44_P8_12_SEGE, SEGMENT_OFF);
        gpio_write_value(GPIO_26_P8_14_SEGF, SEGMENT_OFF);
        gpio_write_value(GPIO_46_P8_16_SEGG, SEGMENT_OFF);
    break;
    }



}

/* implements the up counting from 0 to 9 */
void start_upcounting(int delay_value_ms)
{
    uint8_t i =0;

    if ( initialize_all_gpios() < 0)
    {
        printf("Error: GPIO init failed !\n");
    }
    else
    {
        printf("UP COUNTING.......\n");
        while(1)
       {

            for(i=0;i<10;i++)
            {
                Write_number_to_7segdisplay(i);
                /*suspend execution for microsecond intervals*/
                usleep(delay_value_ms * 1000); //converting ms to micro
            }

       }

    }

}

/* implements the down counting from 9 to 0 */
void start_downcounting(int delay_value_ms)
{
    int i=9;
    if ( initialize_all_gpios() < 0)
    {
        printf("Error: GPIO init failed !\n");
    }
    else
    {
        printf("DOWN COUNTING.......\n");
        while(1)
       {
            for(i=9;i >= 0 ;i--)
            {
                Write_number_to_7segdisplay(i);
                /*suspend execution for microsecond intervals*/
                usleep(delay_value_ms * 1000); //converting ms to micro
            }
       }
    }
}



int main(int argc, char *argv[]) {

    printf("Application for up/down/ counter on 7 seg display\n");

    if ( argc != 3 ) /* argc should be 3 for correct execution */
    {

        printf( "usage: %s <direction> <delay>\n", argv[0] );
        printf( "valid direction : up, down\n");
        printf ("recommended delay range in ms : 0 to 1000\n");
    }
    else
    {
     /* convert the 'delay' value , which argv[2]  in to integer */
        int delay_value = atoi(argv[2]);

        /* argc is correct , lets check argv */
        if (! strcmp(argv[1], "up") )
        {
            start_upcounting(delay_value);
        }
        else if (strcmp(argv[1], "down") == 0)
        {
            start_downcounting(delay_value);
        }


        else /* default: */
        {
            printf("Invalid direction values\n");
            printf( "valid direction values : up, down\n");
        }
    }
}


LCD 16x2 hd44780u

Opis pinów:


Podłączenie
BBB_                    GPIO number     16x2 LCD pin      Purpose
===========================================================================================================
P8.7                             GPIO_66          4(RS)           Register selection (Character vs. Command)
P8.8                             GPIO_67          5(RW)           Read/write
P8.9                             GPIO_69          6(EN)           Enable
P8.10                            GPIO_68          11(D4)          Data line 4
P8.11                            GPIO_45          12(D5)          Data line 5
P8.12                            GPIO_44          13(D6)          Data line 6
P8.14                            GPIO_26          14(D7)          Data line 7
P8.16                            GPIO_46          15(BKLTA)       Backlight anode(+)
P9.15                            GPIO_48          16(BKLTK)       Backlight cathode(-)

P9.0                              ----            1(VSS/GND)      Ground

P9.7                              ----            2(sys_VDD +5V)  +5V supply


Instrukcje:

Clear display - czyści ekran
Return Home - powraca kursor, nie czysci pamieci
Entry Mode - kierunek kursowa i/d=1 powieksza  i/d=0 pomniejsza adres ddram po wpisaniu znaku
                    S- obraca lcd, S=1 kursor stoi, tekst sie przesuwa, gdy 0 normalnie
                    przykład:   Link
Display on/off control - D - 1 działa 0-nie działa
                                       C- 1 kursor widoczny  0- nie widoczny
                                       B -1 literka mruga jak se pojawia
Cursor or display shift  S/C -1 wyswietlacz shift  0- cursor move
                                      R/l - 1  w prawo    0  - w lewo
Funcion set - ustawiamy szerokość interfejsu i fonty
                                      DL - długość danych 1 - 8 bitów   0  -  4 bity
                                      N- długośc linii   1  - dwie linie   0 - jedna linia
                                      F - fonty  1 - 5x10     0  - 5x8
BF = 1   wewnętrzne przetwarzanie
BF =0    akceptuje intrukcje
AC - można odczytać zawartość pamięci



Clear Dysplay (RS -0 czyli tryb instrukcji RW - 0 czyli ZAPIS, db7-1 na 0  DB0 na 1)
czyści treść ekranu

żeby wyczyścić korzystamy z definiowanych wartości

#define LCD_CMD_CLEAR_DISPLAY  0x01    /co daje 00000001

i z funkcji:

void lcd_send_command(uint8_t command)
{
/*RS: Is a Register Select Control signal.
When this signal is '1' = It accepts data to be displayed.
When this signal is '0' = It accepts instructions (COMAND MODE) for
the LCD like setting font, cursor position etc. */

    //first make RS=0
    gpio_write_value(GPIO_66_P8_7_RS_4,COMMAND_MODE);

    //first send the msb

    uint8_t command_msb = ((command >> 4) & 0X0f ); // d7 d6 d5 d4
//przesuwamy o 4 bity i & 0x0f (czyli b1111) co sprawia ze mamy wartosc
//tylko w pierwszych 4 bitach i to wpisujemy do d4-d7

    gpio_write_value(LCD_DATABIT4,(command_msb & ( 1 << 0) ));
    gpio_write_value(LCD_DATABIT5,(command_msb & ( 1 << 1) ));
    gpio_write_value(LCD_DATABIT6,(command_msb & ( 1 << 2) ));
    gpio_write_value(LCD_DATABIT7,(command_msb & ( 1 << 3) ));

    lcd_enable();

    //now send the lsb

    uint8_t command_lsb = (( command & 0x0f )); // d3 d2 d1 d0

    gpio_write_value(LCD_DATABIT4,(command_lsb & ( 1 << 0) ));
    gpio_write_value(LCD_DATABIT5,(command_lsb & ( 1 << 1) ));
    gpio_write_value(LCD_DATABIT6,(command_lsb & ( 1 << 2) ));
    gpio_write_value(LCD_DATABIT7,(command_lsb & ( 1 << 3) ));

    lcd_enable();

}


//call this function in order to make LCD latch the data lines in to its internal registers.
void lcd_enable(void)
{
    gpio_write_value(GPIO_69_P8_9_EN_6,LCD_ENABLE);
    usleep(2 * 1000); //2ms delay
    gpio_write_value(GPIO_69_P8_9_EN_6,LCD_DISABLE);

}

int gpio_write_value(uint32_t gpio_num, uint8_t out_value)
{
    int fd;
    char buf[SOME_BYTES];

    snprintf(buf, sizeof(buf), SYS_GPIO_PATH "/gpio%d/value", gpio_num);

    fd = open(buf, O_WRONLY);
    if (fd < 0) {
        perror("gpio write value\n");
        return fd;
    }

    if (out_value)
        write(fd, "1", 2);
    else
        write(fd, "0", 2);

    close(fd);
    return 0;
}



zgodnie z tabelą mamy zdefiniowane wszystkie polecenia:
#define COMMAND_MODE         LOW_VALUE
#define USER_DATA_MODE           HIGH_VALUE

#define LCD_CMD_CLEAR_DISPLAY    0x01   //b00000001
#define LCD_CMD_RETURN_HOME      0x02   //b00000010

//----Entry mode set-----------------
#define LCD_CMD_ENTRY_MODESET    0X04   //b00000100
#define INC_CURSOR        ( 1 << 1) //b0010 czyli 0x04 | (1<<1) da 0110
#define DEC_CURSOR                     (LCD_CMD_ENTRY_MODESET & ~(INC_CURSOR))
                                           //koniunkcja z negacja wyzeruje 2 bit
#define ACCOMPANY_DISPLAY_SHIFT  ( 1 << 0)
#define DO_NOT_ACCOMPANY_DISPLAY_SHIFT  (LCD_CMD_ENTRY_MODESET & ~(ACCOMPANY_DISPLAY_SHIFT))

//======Display on/off-------------
#define LCD_CMD_DISPLAY_CURSOR_ONOFF_CONTROL  0x08   / czyli b00001000

#define DISPLAY_ON  (1 << 2)
#define DISPLAY_OFF (LCD_CMD_DISPLAY_CURSOR_ONOFF_CONTROL & ~(DISPLAY_ON))

#define CURSOR_ON    (1 << 1)
#define CURSOR_OFF  (LCD_CMD_DISPLAY_CURSOR_ONOFF_CONTROL & ~(CURSOR_ON))

#define BLINK_CURSOR_ON  (1 << 0)
#define BLINK_CURSOR_OFF (LCD_CMD_DISPLAY_CURSOR_ONOFF_CONTROL & ~(BLINK_CURSOR_ON))

//-------------kursor display shift------------
#define LCD_CMD_CURSOR_DISPLAY_SHIFT_CONTROL  0x10   /b00010000

#define DISPLAY_SHIFT     ( 1 << 3)
#define CURSOR_MOVE       (LCD_CMD_CURSOR_DISPLAY_SHIFT_CONTROL & ~(DISPLAY_SHIFT))

#define SHIFT_TO_RIGHT  ( 1 << 2)
#define SHIFT_TO_LEFT    (LCD_CMD_CURSOR_DISPLAY_SHIFT_CONTROL & ~(SHIFT_TO_RIGHT))

/*Sets interface data length (DL), number of display lines (N), and character font (F). */
#define LCD_CMD_FUNCTION_SET      0x20

#define DATA_LEN_8   ( 1 << 4)
#define DATA_LEN_4   (LCD_CMD_FUNCTION_SET & ~(DATA_LEN_8))
#define DISPLAY_2_LINES ( 1 << 3)
#define DISPLAY_1_LINE  (LCD_CMD_FUNCTION_SET & ~(DISPLAY_2_LINES))
#define MATRIX_5_X_10  ( 1 << 2)
#define MATRIX_5_X_8  (LCD_CMD_FUNCTION_SET & ~(MATRIX_5_X_10))

/*Sets CGRAM address. CGRAM data is sent and received after this setting. */
#define LCD_CMD_SET_CGRAM_ADDRESS     0x40

/* Sets DDRAM address. DDRAM data is sent and received after this setting. */
#define LCD_CMD_SET_DDRAM_ADDRESS     0x80

#define DDRAM_SECOND_LINE_BASE_ADDR         (LCD_CMD_SET_DDRAM_ADDRESS | 0x40 )
#define DDRAM_FIRST_LINE_BASE_ADDR          LCD_CMD_SET_DDRAM_ADDRESS

#define LCD_ENABLE 1
#define LCD_DISABLE 0

/* HD44780 CGRAM address start */
#define CGRAM_address_start 0x40

#define INS_WAIT_TIME ( 8 * 1000)

.

sekcja 22 film 126 w trakcie