📄 lcd.c
字号:
//********************** 使用 Lcd 硬件 工作 通信 ****************
#include "msp430x14x.h"
#include "main.h"
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from lcdshow.c
extern unsigned char g_chMainLcdProcess_Stat;
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
void LcdDrive(void);
unsigned char g_chLcdDrive_Stat;
unsigned char g_chLcdDriveBuf[33];
unsigned char g_chLcdDriveHead;
unsigned char g_chLcdDriveTail;
unsigned char g_chLcdDrive_50ms;
void WriteInstruction(unsigned char chData);
void WriteData(unsigned char chData);
void InitLcd(void);
void initBuf(void);
/**************************************
*功能: 初始化 。。。
*参数:
*返回:
*备注:
**************************************/
void initBuf(void)
{
unsigned char chI;
for(chI = 0; chI < 33; chI++)
{
g_chLcdDriveBuf[chI] = 0x20;//保证是空格
}
}
/**************************************
*功能: 处理LCD 显示驱动,负责把缓冲中的信息显示
*参数:
*返回:
*备注: 实时运行
**************************************/
void LcdDrive(void)
{
//忙吗?
//读忙状态子程序
P1OUT &= ~LCDrs;//CLR RS 指令
P2OUT |= LCDrw; //SETB RW
P3OUT |= LCDenb;//SETB E
//245
P5OUT &= ~LCDcs;//低 选通 该 片
//读数据
P4DIR = 0;
if(P4IN & BIT7)//BIT7=1 忙;=0 不忙
{//忙
//忙
P3OUT &= ~LCDenb;//CLR E
//245
P5OUT |= LCDcs;//高 关闭该片
return;
}
//不忙
P3OUT &= ~LCDenb;//CLR E
//245
P5OUT |= LCDcs;//高 关闭该片
switch(g_chLcdDrive_Stat)
{
case 0://
if(g_chLcdDriveTail == 32)
{//启动!
g_chLcdDrive_Stat = 1;//
}
break;
case 1://定光标位置 在第一行
//不忙
WriteInstruction(0x80);
//定光标位置 在第一行
g_chLcdDriveHead = 0;
g_chLcdDrive_Stat = 2;
break;
case 2://显示1----16
//不忙
if(g_chLcdDriveHead < 16)
{
//处理
g_chLcdDriveHead++;
//写数据 g_chLcdDriveBuf[g_chLcdDriveHead]
WriteData(g_chLcdDriveBuf[g_chLcdDriveHead]);
}
else
{
g_chLcdDrive_Stat = 3;
}
//显示1----16
break;
case 3://定光标位置 在第二行
//不忙
WriteInstruction(0x90);
//定光标位置 在第二行---没有信息要填空格!以便于驱动层的处理
g_chLcdDrive_Stat = 4;
break;
case 4://显示17----32
//不忙
if(g_chLcdDriveHead < 32)
{
//处理
g_chLcdDriveHead++;
//写数据 g_chLcdDriveBuf[g_chLcdDriveHead]
WriteData(g_chLcdDriveBuf[g_chLcdDriveHead]);
}
else
{
g_chLcdDrive_Stat = 5;
}
//显示16----31
break;
case 5://等待
//根据应用层 定义 等待的时间 1 s 3 s
if(g_chMainLcdProcess_Stat == 0)
{
if(g_chLcdDrive_50ms > 1)
{//等待 50--100 ms
g_chLcdDrive_Stat = 6;
}
}
else if((g_chMainLcdProcess_Stat > 10) && (g_chMainLcdProcess_Stat <= 20))
{
if(g_chLcdDrive_50ms > 1)
{//等待 50--100 ms
g_chLcdDrive_Stat = 6;
}
}
else if((g_chMainLcdProcess_Stat > 20) && (g_chMainLcdProcess_Stat < 120))
{
if(g_chLcdDrive_50ms > 40)
{//等待 2s
g_chLcdDrive_Stat = 6;
}
}
else
{
if(g_chLcdDrive_50ms > 80)
{//等待 1s
g_chLcdDrive_Stat = 6;
}
}
break;
case 6://等待后清理战场
//根据应用层 定义 等待的时间 1 s 3 s
g_chLcdDriveTail = 0;
g_chLcdDriveHead = 0;
g_chLcdDrive_Stat = 0;
g_chLcdDrive_50ms = 0;
initBuf();//全部为空格!
break;
default:
g_chLcdDrive_Stat = 0;
break;
}
}
void InitLcd(void)
{
//MOV A, #30H ;30---功能设定--基本指令操作--72 us
WriteInstruction(0x30);
initBuf();
//MOV A, #01H ;指令#01H为:清除屏幕文字,把地址指针指向00H单元--4.6 ms
WriteInstruction(0x01);
//延长时间
{
unsigned int i;
for(i = 0; i < 0xFFF; i++);
}
//MOV A, #06H ;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
WriteInstruction(0x06); //整体显示不移动
//延长时间
initBuf();
//MOV A, #0CH ;开显示,关游标
WriteInstruction(0x0C);
//延长时间
initBuf();
//MOV A, #01H ;DDRAM清零,DDRAM地址计数器到00H
WriteInstruction(0x01);
//延长时间
initBuf();
}
//;--------------------------------------
//;写数据子程序
//;----------------------------
void WriteData(unsigned char chData)
{
P1OUT |= LCDrs;//SETB RS --数据
P2OUT &= ~LCDrw; //CLR RW
P3OUT |= LCDenb;//SETB E
//245
P5OUT &= ~LCDcs;//低 选通 该 片
//写数据
P4DIR = 0xFF;
P4OUT = chData;
//延长时间
{
unsigned int i;
for(i = 0; i < 0x0F; i++);
}
P3OUT &= ~LCDenb;//CLR E
//245
P4OUT = 0xFF;
P5OUT |= LCDcs;//高 关闭该片
}
//;--------------------------------------
//;写指令子程序
//;----------------------------
void WriteInstruction(unsigned char chData)
{
P1OUT &= ~LCDrs;//CLR RS 指令
P2OUT &= ~LCDrw; //CLR RW
P3OUT |= LCDenb;//SETB E
//245
P5OUT &= ~LCDcs;//低 选通 该 片
//写数据
P4DIR = 0xFF;
P4OUT = chData;
//延长时间
{
unsigned int i;
for(i = 0; i < 0x0F; i++);
}
P3OUT &= ~LCDenb;//CLR E
//245
P4OUT = 0xFF;
P5OUT |= LCDcs;//高 关闭该片
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -