📄 lcd.c
字号:
///*********显示4*4键盘的数字************//
//************宏定义********************//
//*********显示4*4键盘的数字************//
//************宏定义********************//
typedef unsigned char uchar;
typedef unsigned int uint;
void WaitForEnable(void);
#include <msp430x16x.h>
#define DataDir P4DIR
#define DATAPORT P4OUT
#define Busy 0x80
#define CtrlDir P3DIR
#define CLR_RS P3OUT &=~BIT0; //RS=P3.0 命令
#define SET_RS P3OUT |=BIT0;
#define CLR_RW P3OUT &=~BIT1; //RW=P3.1 写操作
#define SET_RW P3OUT |=BIT1;
#define CLR_EN P3OUT &=~BIT2; //EN=P3.2
#define SET_EN P3OUT |=BIT2;
/*******************************************
函数名称:LcdWriteCommand
功 能:向液晶模块写入命令
参 数:cmd--命令,
chk--是否判忙的标志,1:判忙,0:不判
返回值 :无
********************************************/
void LcdWriteCommand(uchar cmd,uchar chk)
{
if (chk) WaitForEnable(); // 检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DATAPORT = cmd; //将命令字写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/***********************************************
函数名称: LcdWriteData
功 能: 向液晶显示的当前地址写入数据
参 数: data--显示字符数据
返回值 : 无
***********************************************/
void LcdWriteData(uchar data)
{
WaitForEnable(); //等液晶不忙
SET_RS;
CLR_RW;
_NOP();
DATAPORT=data; //将显示数据写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/***********************************************
函数名称: WaitforEnable
功 能: 等待液晶模块完成内部操作
参 数: 无
返回值 : 无
***********************************************/
void WaitForEnable(void)
{
P4DIR &=0x00; //将P4口切换为输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
while((P4IN & Busy)!=0); //检测忙标志
CLR_EN;
P4DIR|=0XFF; //将p4口切换为输出状态
}
/***********************************************
函数名称: Delay5ms
功 能: 延时约5ms
参 数: 无
返回值 : 无
***********************************************/
void Delay5ms(void)
{
uint i=40000;
while(i!=0)
{
i--;
}
}
/*************************************************
函数名称: LocateXY
功 能: 向液晶输入显示字符位置的坐标信息
参 数: X--位置的列坐标
Y--未知的行坐标
返回值 : 无
***********************************************/
void LocateXY(uchar x,uchar y)
{
uchar temp;
temp=x&0x0f; //为保证地址传入的正确性 屏蔽不需要的高位
y &=0x01;
if(y) temp|=0x40; //如果在第二行
temp |=0x80;
LcdWriteCommand(temp,1);
}
/***********************************************
函数名称: LedReset
功 能: 对LED模块进行复位操作
参 数: 无
返回值 : 无
***********************************************/
void LcdReset(void)
{
CtrlDir |= 0x07; //控制线端口设为输出状态
DataDir = 0xFF; //数据端口设为输出状态
LcdWriteCommand(0x38, 0); //规定的复位操作
LcdWriteCommand(0x38, 0);
LcdWriteCommand(0x38, 0);
LcdWriteCommand(0x38, 1); //显示模式设置
LcdWriteCommand(0x08, 1); //显示关闭
LcdWriteCommand(0x01, 1); //显示清屏
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁
}
/*******************************************
函数名称:Disp1Char
功 能:在某个位置显示一个字符
参 数:x--位置的列坐标
y--位置的行坐标
data--显示的字符数据
返回值 :无
********************************************/
void Disp1Char(uchar x,uchar y,uchar data)
{
LocateXY( x, y );
LcdWriteData( data );
}
/***********************************************
函数名称: DispNChar
功 能: 让液晶从某个位置起连续显示N个字符
参 数: X--位置的列坐标
Y--未知的行坐标
n--字符个数
ptr--指向字符存放位置的指针
返回值 : 无
***********************************************/
void DispNChar(uchar x,uchar y,uchar n,uchar *ptr)
{
uchar i;
for (i=0;i<n;i++)
{
Disp1Char(x++,y,ptr[i]);
if (x==0x0f)
{
x=0;
y^=1;
}
}
}
/***********************************************
函数名称:DispStr
功 能:让液晶从某个位置起连续显示一个字符串
参 数:x--位置的列坐标
y--位置的行坐标
ptr--指向字符串存放位置的指针
返回值 :无
***********************************************/
void DispStr(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uchar i,n = 0;
temp = ptr;
while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
for (i=0;i<n;i++)
{
Disp1Char(x++,y,temp[i]);
if (x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -