📄 lcd_1602.h
字号:
/**************************Designed by 徐节涛************************************/
/******************************二院科协******************************************/
/********************************************************************************/
#ifndef LCD1602
#define LCD1602
#include <msp430x14x.H>
//#include <intrinsics.h>
#define BYTE unsigned char
#define WORD unsigned int
#define uchar unsigned char
#define uint unsigned int
/*DDRAM显示数据RAM, CGRAM字符生成RAM, AC用于DD和CGRAM地址的地址计数器*/
/////////////////////////////////////////////////////////////////////////////////////////
/* 液晶管脚连线 */
#define LCDRS BIT7 // 寄存器选择 1:数据;0:指令
#define LCDRW BIT6 // 读写操作选择 1:读;0:写
#define LCDE BIT5 // 使能信号 下降沿处理任务
#define DATAPORT P2OUT //更改指令控制位,则相应的数据或指令控制位要改变
#define COMMANDPORT P1OUT
#define DATADIRECTION P2DIR
#define COMMANDDIRECTION P1DIR
//////////////////////////////////////////////////////////////////////////////////////////
void LCDDelay(WORD count); // 时间延迟
void Wait(); // 等待函数
void WriteLCD(BYTE style, BYTE input); // 向LCD写入命令或数据
/* style取值 */
#define COMMAND 0x00 // 指令操作
#define DATA 0x80 // 数据操作
/* 衍生的函数 */
#define PutChar(x) WriteLCD(DATA,x) //宏定义
///////////////////////////////////////////////////////////////////////////////////////////
/*编译预处理函数*/
void PrintString(BYTE *s); // 显示字符串 s为指向字符串的指针
void ClearScreen(); // 清DDRAM和AC值
/*L L L L L L L H */
#define CLEAR_SCREEN 0x01 // 清屏.置AC为0
void BackHome();
/*L L L L L L H × */ //设DDRAM地址为零,显示回原位,DDRAM内容不变
#define HOMING 0x02 // 光标返回原点
void SetDisplay(BYTE DisplayMode); // 设置显示模式
/* L L L L H D C B */
#define SHOW 0x04 //D整体显示开关
#define HIDE 0x00 // default
#define CURSOR 0x02 //C光标显示开关
#define NO_CURSOR 0x00 // default
#define FLASH 0x01 //B光标闪动
#define NO_FLASH 0x00 // 光标不闪
void SetInput(BYTE InputMode); // 设置输入模式
/* L L L L L H I/D S */
#define AC_UP 0x02 //光标及地址自加
#define AC_DOWN 0x00 //光标及地址自减
#define MOVE 0x01 //画面可平移
#define NO_MOVE 0x00 //画面不可移动
/************************************************************************/
// void Move(BYTE object, BYTE direction); // 移动光标或屏幕
/* L L L H S/C R/L × × */
// #define CURSOR_MOVE 0x08 //S/C光标平移
// #define SCREEN_MOVE 0x00 //S/C画面平移
// #define LEFT 0x00 //R/L左移
// #define RIGHT 0x04 //R/L右移
/*************************************************************************/
void SetFunction(BYTE FUNCTION); // 功能设置
/* L L H DL N F × × */
#define EIGHT 0x10 // 8位数据接口
#define FOUR 0x00 // 4位数据接口
#define DOUBLE 0x08 // 两行显示
#define ALONE 0x00 // 一行显示
#define LARGE 0x04 // 5*10点阵显示
#define SMALL 0x00 // 5*7点阵显示
void GotoXY(BYTE X, BYTE Y); // 跳到LCD的某个坐标点
void LCD_Initial(); // 液晶初始化函数
/******************** 以下是具体的函数实现 *********************************/
/********************* 软件延时 1*m毫秒 ************************************/
void LCDDelay(WORD count)
{
uchar i, j, k;
for(k=count; k>0; k--)
for(i=2; i>0; i--)
for(j=248; j>0; j--);
}
/********************* 等待写操作结束函数 ***********************************/
void Wait() //建议不用,很不好用
{
uchar ntemp;
DATADIRECTION=0;
COMMANDPORT &= ~LCDRS;
COMMANDPORT |= LCDRW; _NOP();
COMMANDPORT |= LCDE; _NOP();
LCDDelay(10);
do
{
ntemp=P2IN; //
ntemp>>=7; // 读忙标志和AC码时,LCDE高电平
}
while(ntemp == 1); // 写操作忙,等待
COMMANDPORT |= ~LCDE;
DATADIRECTION=0XFF;
}
/**********************写命令或数据*******************************************/
void WriteLCD(uchar style, uchar input) // 向LCD写入命令或数据
{
if(style==0x00)
COMMANDPORT = style; //style:1:指令;0:数据
else COMMANDPORT |= style;
COMMANDPORT &= ~LCDRW; _NOP();
COMMANDPORT |= LCDE; _NOP(); // LCDE下降沿写入
DATAPORT = input; _NOP();
COMMANDPORT &= ~LCDE; _NOP();
LCDDelay(1);
// Wait(); //忙处理函数不好用
}
/***********************字符串处理函数*****************************************/
void PrintString(uchar *s)
{
while(*s != '\0')
{
WriteLCD(DATA, *s);
s++;
}
}
/************************指定位置固定整型数据显示*******显示起始位置固定*******/
void PrintInt(unsigned long int num)
{
unsigned char i=0,j=0,k,flag;
unsigned long int temp,temp1=1;
temp=num;
if(temp!=0)
{
while(temp!=0)
{
temp=temp/10;
i++;
}
temp=num;
for(j=i;j>1;j--)
{
for(k=j;k>1;k--)
{temp1=temp1*10;}
flag=temp/temp1;
temp=temp%temp1;
temp1=1;
WriteLCD(DATA,flag+'0');
}
WriteLCD(DATA,temp+'0');
}
else WriteLCD(DATA,temp+'0');
}
/*************************变化整型数据显示******显示结束位置固定***************/
void PrintIntUndefine(unsigned long int input)
{
unsigned char i=0,j=0,flag;
unsigned long int temp;
temp=input;
SetInput(AC_DOWN | NO_MOVE);
if(temp!=0)
{
while(temp!=0)
{
temp=temp/10;
i++;
}
temp=input;
for(j=i;j>1;j--)
{
flag=temp%10;
temp=temp/10;
WriteLCD(DATA,flag+'0');
}
WriteLCD(DATA,temp+'0');
}
else WriteLCD(DATA,temp+'0');
SetInput(AC_UP | NO_MOVE);
}
/************************清除RAM和地址数据*************************************/
void ClearScreen() // 清DDRAM和AC值
{
WriteLCD(COMMAND, CLEAR_SCREEN);
}
/************************光标复位**********************************************/
void BackHome() // AC=0,光标和画面回HOME位置
{
WriteLCD(COMMAND, HOMING);
}
/************************输入模式设置******************************************/
void SetInput(uchar InputMode) // 设置输入方式
{
WriteLCD(COMMAND, 0x04|InputMode);
}
/*************************显示设置*********************************************/
void SetDisplay(uchar DisplayMode) // 显示开关控制
{
WriteLCD(COMMAND, 0x08|DisplayMode);
}
/**************************光标、画面设置***************************************/
/*
void Move(BYTE object, BYTE direction) // 光标、画面移动,不影响DDRAM
{
if(object==CURSOR_MOVE)
WriteLCD(COMMAND,0x10|direction);
if(object==SCREEN_MOVE)
WriteLCD(COMMAND,0x18|direction);
}
*/
/***************************功能设置*********************************************/
void SetFunction(uchar FUNCTION) // 功能设置
{
WriteLCD(COMMAND, 0x20|FUNCTION);
}
/****************************显示地址设置****************************************/
void GotoXY(uchar X, uchar Y) // 跳到LCD的某个坐标点
{
if(Y == 0) // 第一行
WriteLCD(COMMAND, 0x80|X);
if(Y == 1) // 第二行
WriteLCD(COMMAND, 0x80|(X-0x40)); //加或减0x40一样
}
/****************************初始化函数******************************************/
/*初始化程序, 必须按照产品资料介绍的初始化过程进行*/
void LCD_Initial() // 液晶初始化函数
{
COMMANDDIRECTION=0XFF;
DATADIRECTION=0XFF;
COMMANDPORT=0X00;
DATAPORT=0X00;
LCDDelay(80);
SetFunction(EIGHT | DOUBLE | SMALL); // 8位数据口,两行显示,5*7点阵
LCDDelay(10);
SetFunction(EIGHT | DOUBLE | SMALL);
LCDDelay(10);
SetFunction(EIGHT | DOUBLE | SMALL);
SetDisplay(SHOW |NO_CURSOR | NO_FLASH); // 开显示,无光标
SetInput(AC_UP | NO_MOVE); // AC自动增一,画面不动
// Move(CURSOR_MOVE,RIGHT);
ClearScreen(); // 清屏
BackHome();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -