📄 lcd.c
字号:
#include "config.h"
TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];
/********************************/
/* 液晶初始化 */
/********************************/
void LCM_DispIni(void)
{
OS_ENTER_CRITICAL();
LCM_WrCommand(0x30);
delay1us(400);
LCM_WrCommand(0x30);
delay1us(400);
LCM_WrCommand(0x0c);
delay1us(400);
LCM_WrCommand(0x01);
delay1us(400);
LCM_WrCommand(0x06);
delay1us(400);
LCM_WrCommand(0x36);
delay1us(400);
OS_EXIT_CRITICAL();
}
void GUI_FillSCR(TCOLOR dat)
{
uint32 i,j;
for(i=0;i<GUI_LCM_YMAX;i++)
{
for(j=0;j<(GUI_LCM_XMAX/8);j++)
gui_disp_buf[i][j] = dat;
}
LCM_DispFill(dat);
}
void LCM_DispFill(uint8 dat)
{
uint32 i,j;
OS_ENTER_CRITICAL();
for(i=0;i<32;i++)
{
LCM_WrCommand(0x34);
LCM_WrCommand(0x80+i);
LCM_WrCommand(0x80);
for(j=0;j<8;j++)
{
LCM_WrData(dat);
LCM_WrData(dat);
delay1us(40);
}
}
LCM_WrCommand(0x34);
LCM_WrCommand(0x36);
delay1us(40);
OS_EXIT_CRITICAL();
}
/********************************/
/* 延时1us字程序 */
/********************************/
void delay1us(uint32 dly)
{
uint8 i;
for(;dly>0;dly--)
{
i=5;
while(i--);
}
}
/********************************/
/* 延时1ms字程序 */
/********************************/
void delay1ms(uint32 dly)
{
uint16 i;
for(;dly>0;dly--)
{
i=6000;
while(i--);
}
}
/********************************/
/* 检查液晶是否处于忙状态 */
/********************************/
void LCM_CheckBusy(void)
{
OS_ENTER_CRITICAL();
IODIR0 = ( IODIR0 | LCD_RW ) & (~LCD_XD);
IODIR1 = IODIR1 | LCD_E | LCD_A0;
IOCLR1 = LCD_A0;
IOSET0 = LCD_RW;
IOSET1 = LCD_E;
delay1us(1);
while(!(IOPIN0 & 0x00800000)==0);
IOCLR1 = LCD_E;
IODIR0 = IODIR0 | LCD_XD;
OS_EXIT_CRITICAL();
}
/********************************/
/* 从液晶读数据 */
/********************************/
uint8 LCM_RdData(void)
{
uint8 readata;
LCM_CheckBusy();
OS_ENTER_CRITICAL();
IODIR0 = ( IODIR0 | LCD_RW ) & (~LCD_XD);
IODIR1 = IODIR1 | LCD_E | LCD_A0;
IOSET0 = LCD_RW;
IOSET1 = LCD_E | LCD_A0;
delay1us(1);
readata=LCD_XDATA;
IOCLR1 = LCD_E;
delay1us(1);
IODIR0 = IODIR0 | LCD_XD; //SET DATA PORT OUT 1
OS_EXIT_CRITICAL();
return readata;
}
/********************************/
/* 向液晶写控制命令 */
/********************************/
void LCM_WrCommand(uint8 cmd) //write command to ST7920
{
LCM_CheckBusy();
OS_ENTER_CRITICAL();
IODIR0 = IODIR0 | LCD_RW |LCD_XD;
IODIR1 = IODIR1 | LCD_E | LCD_A0;
IOPIN0 = (IOPIN0 & (~LCD_XD)) | (cmd<<16);
IOCLR0 = LCD_RW;
IOCLR1 = LCD_A0;
IOSET1 = LCD_E;
delay1us(1);
IOCLR1 = LCD_E;
delay1us(1);
IOPIN0 = (IOPIN0 & (~LCD_XD)) | (0xff<<16);
OS_EXIT_CRITICAL();
}
/********************************/
/* 向液晶写入数据 */
/********************************/
void LCM_WrData(uint8 dat) //write data to ST7920
{
LCM_CheckBusy();
OS_ENTER_CRITICAL();
IODIR0 = IODIR0 | LCD_RW |LCD_XD;
IODIR1 = IODIR1 | LCD_E | LCD_A0;
IOPIN0 = (IOPIN0 & (~LCD_XD)) | (dat<<16);
IOCLR0 = LCD_RW;
IOSET1 = LCD_E | LCD_A0;
delay1us(1);
IOCLR1 = LCD_E;
delay1us(1);
IOPIN0 = (IOPIN0 & (~LCD_XD)) | (0xff<<16);
OS_EXIT_CRITICAL();
}
void LCM_WriteByte(uint8 x,uint8 y,uint8 wrdata)
{
//uint8 data;
x = x&0x7f;
y = y&0x1f;
gui_disp_buf[y][x>>3] = wrdata;
LCM_WrCommand(0x34);
LCM_WrCommand(0x80 + y);
LCM_WrCommand(0x80 + (x>>4));
if((x>>3)%2 == 1)
{
delay1us(40);
LCM_WrData(LCM_ReadByte(x-8,y));
delay1us(40);
LCM_WrData(wrdata);
delay1us(40);
}
else
{
delay1us(40);
LCM_WrData(wrdata);
delay1us(40);
LCM_WrData(LCM_ReadByte(x+8,y));
delay1us(40);
}
LCM_WrCommand(0x34);
LCM_WrCommand(0x36);
delay1us(40);
}
uint8 LCM_ReadByte(uint8 x,uint8 y)
{
x = x&0x7f;
y = y&0x1f;
x = x>>3;
return(gui_disp_buf[y][x]);
}
void GUI_Initialize(void)
{
LCM_DispIni();
GUI_FillSCR(0x00);
}
uint8 const DEC_HEX_TAB[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uint8 GUI_Point(uint8 x,uint8 y,TCOLOR color)
{
uint8 bak;
if(x>=GUI_LCM_XMAX)return(0);
if(y>=GUI_LCM_YMAX)return(0);
bak = LCM_ReadByte(x,y);
if(color == 0)
{
bak &= (~DEC_HEX_TAB[x & 0x07]);
}
else
{
bak |= DEC_HEX_TAB[x & 0x07];
}
LCM_WriteByte(x,y,bak);
return (1);
}
uint8 GUI_ReadPoint(uint8 x,uint8 y,TCOLOR *ret)
{
uint8 bak;
if(x>=GUI_LCM_XMAX)return(0);
if(y>=GUI_LCM_YMAX)return(0);
bak = LCM_ReadByte(x,y);
if((bak&(DEC_HEX_TAB[y&0x07])) == 0) *ret = 0x00;
else *ret = 0x01;
return(1);
}
void GUI_HLine(uint8 x0,uint8 y0,uint8 x1,TCOLOR color)
{
uint8 bak;
if(x0>x1)
{
bak = x1;
x1 = x0;
x0 = bak;
}
do
{
GUI_Point(x0,y0,color);
x0++;
}
while(x0<=x1);
}
void GUI_RLine(uint8 x0,uint8 y0,uint8 y1,TCOLOR color)
{
uint8 bak;
if(y0>y1)
{
bak = y1;
y1 = y0;
y0 = bak;
}
do
{
GUI_Point(x0,y0,color);
y0++;
}
while(y0<=y1);
}
/*****************************************/
/*在第line行,第addr个位置显示一个字符str*/
/* line = 1~2 addr = 1~15 */
/*****************************************/
void displayachar(uint8 line,uint8 addr,char str)
{
uint8 readata;
if(line>2 || line<1 || addr<1 ||addr>15)
return;
//OS_ENTER_CRITICAL();
LCM_WrCommand(0x34);
LCM_WrCommand(0x30);
switch(line)
{
case 1:
if(addr%2==1)
{
addr = (addr-1)/2 + 0x80;
LCM_WrCommand(addr);
}
else
{
addr = addr/2 - 1 + 0x80;
LCM_WrCommand(addr);
delay1us(50);
readata = LCM_RdData();
delay1us(50);
LCM_WrCommand(addr);
delay1us(50);
LCM_WrData(readata);
}
break;
case 2:
if(addr%2==1)
{
addr = (addr-1)/2 + 0x90;
LCM_WrCommand(addr);
}
else
{
addr = addr/2 - 1 + 0x90;
LCM_WrCommand(addr);
delay1us(50);
readata = LCM_RdData();
delay1us(50);
LCM_WrCommand(addr);
delay1us(50);
LCM_WrData(readata);
}
break;
default:break;
}
delay1us(50);
LCM_WrData(str);
delay1us(50);
LCM_WrCommand(0x34);
LCM_WrCommand(0x36);
//OS_EXIT_CRITICAL();
}
/********************************/
/*在第line行,第addr个位置显示一个汉字*str*/
/* line = 1~2 addr = 1~7 */
/********************************/
void displayachinese(uint8 line,uint8 addr,char *str)
{
if(line>2 || line<1 || addr<1 ||addr>7)
return;
//OS_ENTER_CRITICAL();
LCM_WrCommand(0x34);
LCM_WrCommand(0x30);
if(line == 1)
addr = addr -1 + 0x80;
else
addr = addr -1 + 0x90;
LCM_WrCommand(addr);
delay1us(50);
LCM_WrData(*str);
delay1us(50);
LCM_WrData(*(str+1));
delay1us(50);
LCM_WrCommand(0x34);
LCM_WrCommand(0x36);
//OS_ENTER_CRITICAL();
}
/********************************/
/*在第line行,第addr个位置显示字符串*str*/
/* line = 1~2 addr = 1~15 */
/********************************/
void displayastr(uint8 line,uint8 addr,char *str)
{
uint8 len,i;
if(line>2 || line<1 || addr<1 ||addr>7)
return;
LCM_WrCommand(0x34);
LCM_WrCommand(0x30);
len = strlen(str);
if(len+(addr-1)*2>15)
len = 15 - (addr-1)*2;
if(line == 1)
addr = addr -1 + 0x80;
else
addr = addr -1 + 0x90;
LCM_WrCommand(addr);
delay1us(50);
for(i=0;i<len;i++)
{
LCM_WrData(*(str+i));
delay1us(50);
}
LCM_WrCommand(0x34);
LCM_WrCommand(0x36);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -