LCD 1622
程序员文章站
2022-03-05 11:35:59
...
应用三 便携式甲醛检测仪(下)— HT1622
ht1622应用笔记
tm1622
LCD_HT1622_16SegLcd_demo_driver.ino
HT1622.cpp
段码液晶屏的偏压有几种,有什么区别?
段式液晶程序设计技巧
注意使用芯片的控制信号的高低电平限制:
HT1622 (如果要使用3.3V信号控制,需要电平转换,控制口使用OD输出,外接5V上拉电阻) ⬇⬇⬇⬇⬇⬇
TM1622 (可以使用3.3V控制信号控制) ⬇⬇⬇⬇⬇⬇
SEG口波形⬇⬇⬇⬇⬇⬇
COM1口波形⬇⬇⬇⬇⬇⬇
COM8口波形⬇⬇⬇⬇⬇⬇
头文件
#ifndef _LCD1622_H_
#define _LCD1622_H_
#include "main.h"
#define SYSDIS 0X00 //0000_0000_X 关闭系统振荡器和LCD偏压发生器
#define SYSEN 0X01 //0000_0001_X 打开系统振荡器
#define LCDOFF 0X02 //0000_0010_X 关闭LCD
#define LCDON 0X03 //0000_0011_X 打开LCD
#define INRC 0X18 //0001_10XX_X 内部时钟
#define NORMAL 0XE3 //1110-0011-X 正常模式
//函数声明
void LCD1622Wr(uchar data,uchar cnt);
void LCD1622Wr_byte(uchar addr,uchar data);
void LCD1622Wr_AllData(uchar addr,uchar *p,uchar cnt);
void LCD1622Wr_cmd(uchar cmd);
void LCD1622_init();
void lcd_clr0(uint8_t Data);
void LCD1622_all_off(void);
extern uchar lcdnum[32];
#endif
特别说明:
LCD_RD_H;//如果使用了RD接口,在写入数据时,RD必须为高电平,否则无法写入数据(写入指令正常,写入显示数据不正常)
#include "lcd1622.h"
#include "gpio.h"
#include "tim.h"
/**
* @brief 数据写入时序
* @param Data为数据,cnt为传送数据位数,数据传送低位在前
* @retval none
* @notice 1622的写入地址是从高位开始写,数据是从低位开始写
在写入数据的时候要注意数组对应的寄存器位;
*/
void LCD1622Wr(uchar data,uchar cnt)
{
uchar i;
for(i=0;i<cnt;i++)
{
HAL_Delay_US(10);
LCD_WR_L;
HAL_Delay_US(10);
if(data&0x80)
LCD_DATA_H;
else
LCD_DATA_L;
HAL_Delay_US(10);
LCD_WR_H;
HAL_Delay_US(10);
data <<= 1;
}
}
/**
* @brief LCD1622在指定地址写入数据函数
* @param addr为写入初始地址,dat为写入数据
* @retval none
* @notice LCD1622的数据为4位,并且是低位开始写,注意写入方向是高位开始写
*/
void LCD1622Wr_OneData(uchar addr,uchar data)
{
addr <<= 2;
data <<= 4;
LCD_CS_L;
LCD1622Wr(0xa0,3); //写入命令101
LCD1622Wr(addr,6); //写入地址
LCD1622Wr(data,4); //写入数据
LCD_CS_H;
HAL_Delay_US(5);
HAL_Delay_US(5);
}
/**
* @brief LCD1622连续写入方式函数
* @param addr为写入初始地址,dat为写入数据,cnt为写入数据总数(byte)
* @retval none
* @notice LCD1622的数据为4位,并且是低位开始写,注意写入方向是高位开始写
*/
void LCD1622Wr_AllData(uchar addr,uchar *p,uchar cnt)
{
uchar i,j;
addr <<= 2;
LCD_CS_L;
LCD1622Wr(0xa0,3); //写入命令
LCD1622Wr(addr,6); //写入地址
for(i=0;i<cnt;i++)
{
LCD1622Wr(*p,8); //写入数据
p++;
}
LCD_CS_H;
HAL_Delay_US(5);
}
void LCD1622_all_off(void)
{
uchar i;
uchar addr=0;
for(i=0;i<32;i++)
{
LCD1622Wr_OneData(addr,0);
addr+=1;
}
}
/********************************************************
函数名称:void Ht1622WrCmd(u8 Cmd)
功能描述: LCD1622命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无
说 明:写入命令标识位100
********************************************************/
/**
* @brief LCD1622命令写入函数
* @param cmd(命令后8位)
* @retval
* @notice
*/
void LCD1622Wr_cmd(uchar cmd)
{
LCD_CS_L;
HAL_Delay_US(5);
LCD1622Wr(0x80,3); //写入命令
LCD1622Wr(cmd,8); //写入控制命令
LCD1622Wr(0,1);//写入CMD最后1bit
LCD_CS_H;
HAL_Delay_US(5);
}
//LCD1622初始化
void LCD1622_init()
{
LCD_BK_H;
LCD_CS_H;
LCD_WR_H;
LCD_DATA_H;
LCD_RD_H;//如果使用了RD接口,在写入数据时,RD必须为高电平,否则无法写入数据(写入指令正常,写入显示数据不正常)
HAL_Delay_US(5);
HAL_Delay_US(5);
LCD1622Wr_cmd(SYSDIS); // 关振系统荡器和LCD偏压发生器
HAL_Delay_US(5);
LCD1622Wr_cmd(SYSEN); // 打开系统荡器和LCD偏压发生器
HAL_Delay_US(5);
LCD1622Wr_cmd(LCDOFF); // 关闭LCD显示
HAL_Delay_US(5);
LCD1622Wr_cmd(LCDON); // 打开LCD显示
HAL_Delay_US(5);
LCD1622Wr_cmd(INRC); //使用内部振荡器
HAL_Delay_US(5);
LCD1622Wr_cmd(NORMAL); //正常模式
}
//LCD数据刷新
uchar lcdnum[32];
//清0
void lcd_clr0(uint8_t Data)
{
uchar i;
for(i=0;i<32;i++)
{
lcdnum[i] = Data;
}
}
//LCD显示数据
const uchar NumTable1[] = {
0xee, //0 _a_
0x24, //1 f| |b
0xba, //2 _g_
0xb6, //3 e| |c afbg ecdx
0x74, //4 _d_
0xd6, //5
0xde, //6
0xa4, //7
0xfe, //8
0xf6, //9
0x00, //
};
const uchar NumTable2[] = {
0x77, //0 _a_
0x24, //1 f| |b
0x5d, //2 _g_
0x6d, //3 e| |c xdce gbfa
0x2e, //4 _d_
0x6b, //5
0x7b, //6
0x25, //7
0x7f, //8
0x6f, //9
0x00, //
};
const uchar NumTable3[] = {
0x77, //0 _a_
0x12, //1 f| |b
0x5d, //2 _g_
0x5b, //3 e| |c xafb gecd
0x3a, //4 _d_
0x6b, //5
0x6f, //6
0x52, //7
0x7f, //8
0x7b, //9
0x00, //
};
上一篇: EasyC++全局变量
下一篇: 缺钱吗?随便拿