📄 lcd.c
字号:
/***********************************************************************************/
#include "Lcd.h"
#include "CharModeLib.h"
/***********************************************************************************/
/***********************************************************************************/
void LCD_WriteLeftIns(unsigned char command) /*写左半屏命令*/
{
while ((LCD_READ_LEFT_INS & 0x90) != 0);
LCD_WRITE_LEFT_INS = command;
}
/***********************************************************************************/
void LCD_WriteRightIns(unsigned char command)
{
while ((LCD_READ_RIGHT_INS & 0x90) != 0);
LCD_WRITE_RIGHT_INS = command;
}
/***********************************************************************************/
void LCD_WriteData(void) /*写数据*/
{
if (LCD_StrData.List_Y < 64)
{
while( (LCD_READ_LEFT_INS & 0x90) != 0 );
LCD_WRITE_LEFT_DATA = LCD_StrData.WriteData;
}
else
{
while( (LCD_READ_RIGHT_INS & 0x90) != 0 );
LCD_WRITE_RIGHT_DATA = LCD_StrData.WriteData;
}
}
/***********************************************************************************/
void LCD_SetXY(void) /*设置X、Y指针*/
{
if (LCD_StrData.List_Y < 64)
{
LCD_WriteLeftIns(0xB8 + LCD_StrData.Page_X / 8);/*设置X页地址*/
LCD_WriteLeftIns(0x40 + LCD_StrData.List_Y); /*设置Y横向地址*/
}
else
{
LCD_WriteRightIns(0xB8 + LCD_StrData.Page_X / 8);
LCD_WriteRightIns(0x40 + (LCD_StrData.List_Y - 64));
}
}
/***********************************************************************************/
void LCD_Clear(void) /*清屏*/
{
for (LCD_StrData.Page_X=0; LCD_StrData.Page_X != 64; LCD_StrData.Page_X += 8)
{
LCD_StrData.List_Y = 0;
LCD_SetXY();
for ( ; LCD_StrData.List_Y != 64; LCD_StrData.List_Y++)
{
while( (LCD_READ_LEFT_INS & 0x90) != 0 );
LCD_WRITE_LEFT_DATA = 0;
}
LCD_SetXY();
for ( ; LCD_StrData.List_Y != 128; LCD_StrData.List_Y++)
{
while( (LCD_READ_RIGHT_INS & 0x90) != 0 );
LCD_WRITE_RIGHT_DATA = 0;
}
}
}
/***********************************************************************************/
void LCD_DispInput(unsigned char x, unsigned char y, unsigned char opp_bit, enum Character *string_pt)
{
enum Character offset_addr;
unsigned char i;
unsigned short mode_addr;
i=0;
offset_addr = *string_pt;
while (offset_addr != CHARACTER_END)
{
if (i!=opp_bit)
{
mode_addr = &CharMode + (unsigned short)offset_addr * 16;
LCD_WriteGraph(x, y, 16, 8, CHAR_DISP, (unsigned char code *)mode_addr);
}
else
{
mode_addr = &CharMode + (unsigned short)offset_addr * 16;
LCD_WriteGraph(x, y, 16, 8, CHAR_OPP, (unsigned char code *)mode_addr);
}
y += 8;
string_pt++;
offset_addr = *string_pt;
i++;
}
}
/***********************************************************************************/
void LCD_WriteString(unsigned char x, unsigned char y, unsigned char opp, enum Character *string_pt)
{ /*写字符串,格式为8×15、15×15,可以反显写,string_pt为字符串字符的机内码地址*/
enum Character offset_addr;
unsigned short mode_addr;
offset_addr = *string_pt;
while (offset_addr != CHARACTER_END)
{
if (offset_addr>ASC_END)
{
mode_addr = &CharMode + (unsigned short)(ASC_END+1)*16+(unsigned short)(offset_addr-ASC_END-1)*30;
LCD_WriteGraph(x, y, 16, 15, opp, (unsigned char code *)mode_addr);
LCD_WriteGraph(x, y+15, 16, 1, opp, (unsigned char code *)(&CharMode + (unsigned short)ASC_SPACE*16));
y += 16;
}
else
{
mode_addr = &CharMode + (unsigned short)offset_addr * 16;
LCD_WriteGraph(x, y, 16, 8, opp, (unsigned char code *)mode_addr);
y += 8;
}
string_pt++;
offset_addr = *string_pt;
}
}
/***********************************************************************************/
void LCD_WriteGraph(unsigned char x, unsigned char y,
unsigned char height, unsigned char width, unsigned char opp,
unsigned char code *buf_pt)
{ /*写一个图形,x、y、height、width、opp、buf_pt*/
unsigned char i, j;
unsigned char list_num, page_num; /*页数、列数*/
LCD_StrData.Page_X = x; /*显示地址为任意值*/
LCD_StrData.List_Y = y;
list_num = width; /*显示模块的宽是任意的*/
page_num = height / 8; /*height必须为8的倍数,不支持高度不为8倍数的显示模块*/
for (j=page_num; j != 0; j--)
{
LCD_SetXY();
for (i=list_num; i != 0; i--)
{
LCD_StrData.WriteData = (*buf_pt) ^ opp;
buf_pt++;
LCD_WriteData();
LCD_StrData.List_Y++;
if (LCD_StrData.List_Y == 64) /*跨页,调整X、Y地址*/
{
LCD_SetXY();
}
}
LCD_StrData.List_Y = LCD_StrData.List_Y - list_num;
LCD_StrData.Page_X = LCD_StrData.Page_X + 8;
}
}
/***********************************************************************************/
void LCD_OnOFF(unsigned char status) /*开关LCD显示*/
{
unsigned char cmd;
if (status == 0)
{
cmd = 0x3E;
BackLight = 1;
}
else
{
cmd = 0x3F;
BackLight = 0; /*开背光*/
}
LCD_WriteLeftIns ( cmd );
LCD_WriteRightIns ( cmd );
}
/***********************************************************************************/
void LCD_Initialize(void) /*初始化LCD的Z地址、清屏、开显示*/
{
LCD_WriteLeftIns ( 0xC0 ); // set Z address to zero
LCD_WriteRightIns ( 0xC0 ); // set Z address to zero
LCD_Clear(); // Clear Screen
LCD_OnOFF(1);
}
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -