0% found this document useful (0 votes)
26 views

LCD595 C

The document contains code for initializing and controlling a LCD display module using a 74HC595 shift register. It includes functions for initializing the LCD, writing commands and data, setting the cursor position and writing strings of characters to the display.

Uploaded by

thanhtrong282004
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
26 views

LCD595 C

The document contains code for initializing and controlling a LCD display module using a 74HC595 shift register. It includes functions for initializing the LCD, writing commands and data, setting the cursor position and writing strings of characters to the display.

Uploaded by

thanhtrong282004
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 11

LCD595_22146431.

c
#include "main.h"

void LCD_74HC_put(uint8_t put) { //LCD-PUT


/*use to init lcd 4 bit ic 74hc595*/
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
for (int8_t i = 6; i >= 0; i--) {
HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, put & 1<<i);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
}
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
}
void LCD_init() {
/*put to datasheets*/
HAL_Delay(15);
LCD_74HC_put(0X18); //1
LCD_74HC_put(0X1C); //1
HAL_Delay(5);
LCD_74HC_put(0X18); //2
LCD_74HC_put(0X1C); //2
HAL_Delay(1);
LCD_74HC_put(0X18); //3
LCD_74HC_put(0X1C); //3
HAL_Delay(1);
LCD_74HC_put(0X10); //4
LCD_74HC_put(0X14); //4
HAL_Delay(1);
LCD_74HC_put(0X10); //5
LCD_74HC_put(0X14); //5
HAL_Delay(1);
LCD_74HC_put(0X40); //6
LCD_74HC_put(0X44); //6
HAL_Delay(1);
LCD_74HC_put(0X00); //7
LCD_74HC_put(0X04); //7
HAL_Delay(1);
LCD_74HC_put(0X40); //8
LCD_74HC_put(0X44); //8
HAL_Delay(1);
LCD_74HC_put(0X00); //9
LCD_74HC_put(0X04); //9
HAL_Delay(1);
LCD_74HC_put(0X08); //10
LCD_74HC_put(0X0C); //10
HAL_Delay(1);
LCD_74HC_put(0X00); //11
LCD_74HC_put(0X04); //11
HAL_Delay(1);
LCD_74HC_put(0X30); //12 - 38
LCD_74HC_put(0X34); //12 - 3c
HAL_Delay(1);
}

//----------------------------rs rw e mode
#define lcd 0x0
#define rs 0x4
#define rw 0x2
#define E 0x1
//---------------------------mode set dispkay
#define clear_display 0x1
#define return_home 0x2
#define entry_ms 0x7
//--control
#define display_ctr 0x8
#define display_ON 0x4
#define cursor 0x2
#define blink 0x1
//--shift
#define cur_dis_shift 0x10
#define cursor_move 0x0
#define dis_shift 0x8
#define right 0x4
#define left 0x0
//--funtion set
#define funtion 0x20
#define set_8bits 0x10
#define set_4bits 0x0
#define line_2 0x8
#define line_1 0x0
#define dots_5x10 0x4
#define dots_5x9 0x0
//-------------------------set dd/cg ram address
#define CG 0x40
#define DD 0x80
//--------------------------write data
/*dung nhu de port cac chan D7 den D4
chia lam 2 phan port D7-D4 truoc
sau do port chan RS RW E theo define ben tren*/
/*--port chan D7 - D4--*/
void LCD_putD(uint8_t put) {
for (int8_t i = 3; i >= 0; i--) {
HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, put & 1<<i);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
}
}
/*port chan lock RS RW E*/
void LCD_clock(uint8_t CMD) {
for (int8_t i = 0; i < 3; i++){
HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, CMD & 1<<i);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
}
}
/*ham khoi tao funtion cac chuc nang : clear, return home, cursor,...*/
/*dich 4 bite dungf data nhu 8 bite nhung chia doi dich 2 lan
lan 1 dich tu D7-D4
lan 2 dich tu D3-D0
data dich lay tu datasheet*/
void LCD_mode_set(uint8_t hex) { //LCD CMD- LCD PUT
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
/*check bite xem co bao nhieu bite phong truong hop bite it hon 4 thi khong bi dich
nham*/
uint8_t firt = hex >> 4 ;
/*neu dich sang 4 bit ma firt = hex tuc data co 4 bit thoi nen dich vao
se cho dich lan dau tien la 0x0 la du lieu D7-D4 datasheet
sau do dich data cu vao D3-D0 theo datasheet*/
if ( firt == hex) {
LCD_putD(0x0); //data dich - D theo datasheet
LCD_clock(0x0); //sung rs rw E
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
LCD_putD(0x0); //data giu nguyen
LCD_clock(E); // moi lan phai co xung E
HAL_Delay(1);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);

LCD_putD(firt);
LCD_clock(0x0);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
LCD_putD(firt);
LCD_clock(E);
HAL_Delay(1);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
}
else {
/*neu bit nhieu hon 4 bite thi tach bit thanh 2 nua
phan 1 - firt la bite tu D7-D4
phan 2 - second la bite tu D3-D0*/
uint8_t firt = hex >> 4 ;
uint8_t second = hex & 0XF;
//-----------
LCD_putD(firt);
LCD_clock(0x0);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
LCD_putD(firt);
LCD_clock(E);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
//-----------
LCD_putD(second);
LCD_clock(0x0);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
LCD_putD(second);
LCD_clock(E);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
}
}
void set_address(uint8_t add){ // dd/gc | address chu y -- LCD CMD
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
//dinh nghia set DDRam hay CGRam- theo set funtion
uint8_t firt = add >> 4 ;
uint8_t second = add & 0XF;
//-----------
LCD_putD(firt);
LCD_clock(0x0);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
LCD_putD(firt);
LCD_clock(E);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
//-----------
LCD_putD(second);
LCD_clock(0x0);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
LCD_putD(second);
LCD_clock(E);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
}
/*ghi data ra man hinh theo DDRam/CGRam*/
void write(uint8_t wr){//chu y
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);

uint8_t firt = wr >> 4 ;


if ( firt == wr) {
LCD_putD(0x0);
LCD_clock(rs);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
LCD_putD(0x0);
LCD_clock(rs | E);
HAL_Delay(1);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);

LCD_putD(firt);
LCD_clock(rs);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
LCD_putD(firt);
LCD_clock(rs | E);
HAL_Delay(1);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
}
else {
uint8_t firt = wr >> 4 ;
uint8_t second = wr & 0XF;
//-----------
LCD_putD(firt);
LCD_clock(rs);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
LCD_putD(firt);
LCD_clock(rs | E);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
//-----------
LCD_putD(second);
LCD_clock(rs);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
LCD_putD(second);
LCD_clock(rs | E);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LAT_GPIO_Port, LAT_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
}
}
void LCD_gotoXY(int8_t X, int8_t Y){
uint8_t loc[2][16]={{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
0XB, 0XC, 0XD, 0XE, 0XF},
{0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0X4B,
0X4C, 0X4D, 0X4E, 0X4F}
};
set_address(DD | loc[Y][X]);
}
void lcd_put_str(uint8_t *s){
int8_t i = 0;
while(s[i] != NULL){
write(s[i]);
i++;
}
}
void LCD_CGinit(uint8_t CGcode[], uint8_t pos){
uint8_t address[8]={0x0, 0x8, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38};
for ( int8_t i = 0; i < 8; i++) {
LCD_mode_set(0x40 | address[pos] | i );
write(CGcode[i]);
// put_cha(CGcode[i]);
}
}
/**/
void LCD_CGprint(uint8_t X, uint8_t Y,uint8_t pos){
LCD_mode_set(lcd | return_home);
LCD_mode_set(0x80);
LCD_gotoXY(X, Y);
write(pos);
}

You might also like