LCD595 C
LCD595 C
c
#include "main.h"
//----------------------------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);
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);
}