📄 lcd.c
字号:
#ifndef _LCD_C_
#define _LCD_C_
#include "c8051f000.h"
#include "typedef.h"
#include "lcd.h"
#include "chinese.h"
void LCM_INIT(void) //*LCM 初始化
{
/*
LCM_INIT_DIR |= LCM_RST + LCM_PSB; //定义输出端口
LCM_INST_DIR |= LCM_E + LCM_RW + LCM_RS; //定义输出端口
LCM_INIT_OUT |= LCM_PSB; //设置为并行输出
LCM_INIT_OUT |= LCM_RST; //LCM复位
*/
LCM_PSB = 1;
LCM_RST = 1;
// *LCM初始化
LCM_WRITE_INST(LCM_CLS);
LCM_WRITE_INST(LCM_FUNCTION_BASE);
LCM_WRITE_INST(LCM_ORIGIN);
LCM_WRITE_INST(LCM_CURSOR_SETUP);
LCM_WRITE_INST(LCM_CURSOR + LCM_CURSOR_ALL);
LCM_WRITE_INST(LCM_CLS);
LCM_WRITE_INST(LCM_DDRAM);
fTurnOnLCDBackLight();
}
void LCM_WRITE_INST(unsigned char _code) //*写指令实现
{
char s = 1;
while(s)
{
if (LCM_READ_BF())
s = TRUE;
else
{
/*
LCM_INST_OUT &= ~LCM_RW; // 写指令 RW = L, RS = L;
LCM_INST_OUT &= ~LCM_RS;
LCM_DATA_DIR |= LCM_ALL_DB; //数据端口初始化
LCM_DATA_OUT = _code; //写代码
LCM_INST_OUT |= LCM_E; //开启写指令
LCM_DELAY_100US();
LCM_INST_OUT &= ~LCM_E; //关闭写指令
LCM_INST_OUT |= LCM_RW; //复位
LCM_INST_OUT |= LCM_RS;
*/
LCM_RW = 0;
LCM_RS = 0;
LCM_DATA = _code;
LCM_E = 1;
LCM_DELAY_100US();
LCM_E = 0;
LCM_RW =1;
LCM_RS =1;
s = FALSE;
}
}
}
void LCM_WRITE_DATA(unsigned char _data) //*写数据实现
{
char s = 1;
while(s)
{
if (LCM_READ_BF())
s = TRUE;
else
{
/*
LCM_INST_OUT &= ~LCM_RW; //写数据 RW = L, RS = H;
LCM_INST_OUT |= LCM_RS;
LCM_DATA_DIR |= LCM_ALL_DB; //数据端口初始化
LCM_DATA_OUT = _data; //写数据
LCM_INST_OUT |= LCM_E; //开启写数据
LCM_DELAY_100US();
LCM_INST_OUT &= ~LCM_E; //关闭写数据
*/
LCM_RW = 0;
LCM_RS = 1;
LCM_DATA = _data;
LCM_E = 1;
LCM_DELAY_100US();
LCM_E = 0;
s = FALSE;
}
}
}
unsigned int LCM_READ_DATA(void) //*读数据实现 (!!未测试)
{
unsigned int _io_data;
/*
LCM_INST_OUT |= LCM_RW; //读数据 RW = H, RS = H;
LCM_INST_OUT |= LCM_RS;
LCM_DATA_DIR &= ~LCM_ALL_DB; //数据端口初始化
LCM_INST_OUT |= LCM_E; //开启读数据
LCM_DELAY_100US();
LCM_INST_OUT &= ~LCM_E; //关闭读数据
_io_data = LCM_DATA_IN;
*/
LCM_RW = 1;
LCM_RS = 1;
LCM_E = 1;
LCM_DELAY_100US();
_io_data = LCM_DATA;
LCM_E = 0;
return _io_data; //完成读数据,返回数据
}
char LCM_READ_BF(void)//*读忙标志
{
bit k;
// LCM_INST_OUT |= LCM_RW; //读数据 RW = H, RS = L;
LCM_RW = 1;
// LCM_INST_OUT &= ~LCM_RS;
LCM_RS = 0;
// LCM_DATA_DIR &= ~LCM_ALL_DB;
// LCM_INST_OUT |= LCM_E; //开启读标志
LCM_E = 1;
LCM_DELAY_100US();
k = LCM_BUSY;
// LCM_INST_OUT &= ~LCM_E; //关闭读数据
LCM_E = 0;
if (k) return TRUE; else return FALSE;
}
void LCM_DELAY_100US(void) //*100 us
{
unsigned int j;
for(j=0;j<_DELAY_100US;j++);
}
void LCM_fresh(void)
{
unsigned char i;
LCM_WRITE_INST(LCM_DDRAM);
for(i=0;i<=0x0f;i++)
LCM_WRITE_DATA(LCMDisplayBuffer1[i]);
for(i=0;i<=0x0f;i++)
LCM_WRITE_DATA(LCMDisplayBuffer2[i]);
for(i=0;i<=0x0f;i++)
LCM_WRITE_DATA(LCMDisplayBuffer3[i]);
for(i=0;i<=0x0f;i++)
LCM_WRITE_DATA(LCMDisplayBuffer4[i]);
}
void fShowWelcome(void)
{
unsigned char i;
LCM_WRITE_INST(LCM_DDRAM);
//clear display buffer
for(i=0;i<=0x0f;i++)
{
LCMDisplayBuffer1[i] = 0x20;
LCMDisplayBuffer2[i] = 0x20;
LCMDisplayBuffer3[i] = 0x20;
LCMDisplayBuffer4[i] = 0x20;
}
//copy chinese characters to display buffers.
XDATA_ptr = Memu_Welcome1;
for(i=0;i<=0x0f;i++)
LCMDisplayBuffer1[i] = *XDATA_ptr++;
XDATA_ptr = Memu_Welcome2;
for(i=0;i<=0x0f;i++)
LCMDisplayBuffer2[i] = *XDATA_ptr++;
//fresh the buffer for display.
LCM_fresh();
}
void fShowResult(void)
{
unsigned char i;
LCM_WRITE_INST(LCM_CLS);
//clear display buffer
for(i=0;i<=0x0f;i++)
{
LCMDisplayBuffer1[i] = 0x20;
LCMDisplayBuffer2[i] = 0x20;
LCMDisplayBuffer3[i] = 0x20;
LCMDisplayBuffer4[i] = 0x20;
}
//copy chinese characters to display buffers.
XDATA_ptr = Memu_Resistor1;
for(i=0;i<=0x0f;i++)
LCMDisplayBuffer1[i] = *XDATA_ptr++;
XDATA_ptr = Memu_Resistor2;
for(i=0;i<=0x0f;i++)
LCMDisplayBuffer3[i] = *XDATA_ptr++;
XDATA_ptr = Memu_Resistor3;
for(i=0;i<=0x0f;i++)
LCMDisplayBuffer2[i] = *XDATA_ptr++;
XDATA_ptr = Memu_Resistor4;
for(i=0;i<=0x0f;i++)
LCMDisplayBuffer4[i] = *XDATA_ptr++;
//fresh the buffer for display.
LCM_fresh();
}
void fDisplayResult(unsigned char vLine,unsigned int vIntData)
{
xdata unsigned char vOffAddress,vAddress;
unsigned char j;
switch (vLine)
{
case 1: vOffAddress = 0x05;break;
case 2: vOffAddress = 0x15;break;
case 3: vOffAddress = 0x25;break;
case 4: vOffAddress = 0x35;break;
}
vAddress = LCM_DDRAM+vOffAddress;
LCM_WRITE_INST(vAddress);
// if(vIntData<10000)
{
LCM_WRITE_DATA(0x20);
LCM_WRITE_DATA(0x20);
vAddress =vAddress - 2;
}
vAddress =vAddress - 1;
LCM_WRITE_INST(vAddress);
j = vIntData/10000;
LCM_WRITE_DATA(Number_Table[j]);
vIntData = vIntData-j*10000;
j = vIntData/1000;
LCM_WRITE_DATA(Number_Table[j]);
vIntData = vIntData-j*1000;
j = vIntData/100;
LCM_WRITE_DATA(Number_Table[j]);
vIntData = vIntData-j*100;
j = vIntData/10;
LCM_WRITE_DATA(Number_Table[j]);
vIntData = vIntData-j*10;
j = vIntData;
LCM_WRITE_DATA(Number_Table[j]);
}
void fDisplayBlank(unsigned char Blank)
{
unsigned char i;
for(i=1;i<=Blank;i++)
LCM_WRITE_DATA(0x20);
}
void fDisplayNumber(unsigned int Number)
{
unsigned char Alfa[5];
unsigned char i,j;
for(i=0;i<5;i++)
{
Alfa[i] = Number%10;
Number /= 10;
}
for(i=5;i>0;i--)
if(Alfa[i])
{
break;
}
else
{
LCM_WRITE_DATA(0x20);
}
for(j= i;j>0;j--)
{
LCM_WRITE_DATA( Alfa[j]);
}
}
void fDisplayCharacter(void)
{
while(1)
if(*XDATA_ptr == "\n")
LCM_WRITE_DATA(*XDATA_ptr++);
}
void fChangeLine(unsigned char Line)
{
xdata unsigned char vOffAddress;
switch (Line)
{
case 1: vOffAddress = 0x00;break;
case 2: vOffAddress = 0x20;break;
case 3: vOffAddress = 0x10;break;
case 4: vOffAddress = 0x30;break;
}
LCM_WRITE_INST(LCM_DDRAM+vOffAddress);
}
void fClearScreen(void)
{
LCM_WRITE_INST(LCM_CLS);
}
void fInitialChinese(void)
{
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -