平时我们使用lcd1602显示屏显示很少的数据,但是屏幕接线却非常多,有点浪费IO资源。
然后我们就来整一个595驱动1602
接线方法
使用的是1602的4线模式这样1个595就够了
595_1602.h
#include "main.h"
#include "stm32l0xx_hal.h"
#define sdi(x) HAL_GPIO_WritePin(SDI_GPIO_Port,SDI_Pin,x)
#define laod(x) HAL_GPIO_WritePin(LAOD_GPIO_Port,LAOD_Pin,x)
#define sclk(x) HAL_GPIO_WritePin(SCLK_GPIO_Port,SCLK_Pin,x)
#define lcd_e 0x40 //接到595输出端的第n位是x
#define lcd_rw 0x20
#define lcd_rs 0x10
void LCD1602_Init(void);
void LCD1602_Show_Str(char y, char x, char *str);
595_1602.c
#include "595_1602.h"
void send595(char a)
{
char b,c;
c=a;
for(b=0;b<8;b++)
{
if((c<>4;
a=b&0x0f;
a|=lcd_e;
send595(a);
a&=~lcd_e;
send595(a);
b=cmd;
a=b&0x0f;
a|=lcd_e;
send595(a);
a&=~lcd_e;
send595(a);
}
void LCD1602_Write_Dat(char dat)
{
char a,b;
b=dat>>4;
a=b&0x0f;
a|=lcd_e;
a|=lcd_rs;
send595(a);
a&=~lcd_e;
send595(a);
b=dat;
a=b&0x0f;
a|=lcd_e;
a|=lcd_rs;
send595(a);
a&=~lcd_e;
send595(a);
}
void LCD1602_Init(void)
{
send595(0);
HAL_Delay(100);
LCD1602_Write_Cmd(0x28);
HAL_Delay(100);
LCD1602_Write_Cmd(0x0C);
LCD1602_Write_Cmd(0x06);
LCD1602_Write_Cmd(0x01);
HAL_Delay(100);
}
void LCD1602_Set_Cursor(char x, char y)
{
char addr;
if (y == 0)
addr = 0x00 + x;
else
addr = 0x40 + x;
LCD1602_Write_Cmd(addr | 0x80);
}
void LCD1602_Show_Str(char y, char x, char *str)
{
LCD1602_Set_Cursor(x, y);
while(*str != '')
{
LCD1602_Write_Dat(*str++);
}
}