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