📄 lcd.c
字号:
#include "includes.h"
char cCursorX;
char cCursorY;
char cCursorDeltaY;
char cCursorSelect;
char cCursorMaxPos;
//显示光标,光标位置由全局变量cCursorX,cCursorY指定c
void ShowCursor()
{
B_AL = cCursorX;
B_BL = cCursorY;
B_CL = 0x21;
LCM1();
}
//设置下一个操作的显存地址,以字节为单位
void SetLcmAddr(char x,char y,char TxtArea)
{
unsigned int addr;
addr = y*0x20 + x;
if(TxtArea)
{
addr += 0x1000;
}
B_AL = addr & 0xff;
B_BL = addr >> 8;
B_CL = 0x24;
LCM1();
}
//向lcm中写入一个字节的数据,且LCM的数据指针自动增加
void LcmWriteByte(unsigned char c)
{
B_BL = c;
B_CL = 0xC0;
LCM11();
}
/*
//设置CGRAM首址,字符发生器的地址
void SetCGRAMAddr(unsigned int addr)
{
}
//设置文本区首地址
void SetTextAddr(unsigned int addr)
{
}
//设置图形区首地址
void SetGraphicAddr(unsigned int addr)
{
}
*/
void LcmInit()
{
//隐藏光标
cCursorX = 127;
cCursorY = 31;
ShowCursor();
//设置CGRAM首址,0x3400
B_AL = 0x6;
B_BL = 0;
B_CL = 0x22;
LCM1();
//设置文本区首地址,0x1000
B_AL = 0x00;
B_BL = 0x10;
B_CL = 0x40;
LCM1();
//设置文本区宽度
B_AL = 0x20;
B_BL = 0;
B_CL = 0x41;
LCM1();
//设置图形区首地址,0x0000
B_AL = 0;
B_BL = 0;
B_CL = 0x42;
LCM1();
//设置图形区宽度
B_AL = 0x20;
B_BL = 0;
B_CL = 0x43;
LCM1();
//邋设置文本区与图形区“或”操作
B_CL = 0x80;
LCM12();
//使能光标、文本、图形显示
B_CL = 0x9F;
LCM12();
//设置光标形状
B_CL = 0xA7;
LCM12();
}
//画水平线
void LineHorizontal(unsigned char x1,unsigned char x2,unsigned char y)
{
char head;
unsigned char n;
unsigned char c;
SetLcmAddr( x1>>3, y,0);
head = x1%8;
n = x2 - x1;
if(n >= 8)
{
if(head)
{
c = (1<<(8-head)) - 1;
LcmWriteByte(c);
n -= 8-head;
}
while(n >= 8)
{
LcmWriteByte(0xff);
n -= 8;
}
}
if(n > 0)
{
c = 256 - (1 << (8-n));
LcmWriteByte(c);
}
}
//清除一条水平线
void ClearLineHorizontal(unsigned char x1,unsigned char x2,unsigned char y)
{
char head;
unsigned char n;
SetLcmAddr( x1>>3, y,0);
head = x1%8;
n = x2 - x1;
if(n >= 8)
{
if(head)
{
LcmWriteByte(0);
n -= 8-head;
}
while(n >= 8)
{
LcmWriteByte(0);
n -= 8;
}
}
if(n > 0)
{
LcmWriteByte(0);
}
}
//画竖直线
void LineVertical(unsigned char x,unsigned char y1,unsigned char y2)
{
unsigned char c;
c = (unsigned char)0x80 >> (x%8);
while(y1<=y2)
{
SetLcmAddr(x>>3, y1, 0);
LcmWriteByte(c);
y1++;
}
}
//画矩形,需要知道左上角坐标与矩形的宽高
void DrawRect(unsigned char x,unsigned char y,unsigned char width,unsigned char height)
{
LineVertical(x, y, y+height);
LineVertical( x+width,y, y+height);
LineHorizontal(x, x+width, y);
LineHorizontal(x, x+width, y+height);
}
//清除一个矩形区域
void ClearRect(unsigned char x,unsigned char y,unsigned char width,unsigned char height,char TxtArea)
{
while(height--)
{
ClearLineHorizontal(x, x+width,y++);
}
}
void ClearScreen()
{
LcmInit();
CLR_LCMRAM();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -