📄 lcd.c
字号:
#include "lcd.h"
#include "delay.h"
#ifdef Debug
#include <stdio.h>
#endif
unsigned char CurOffset,CurRow,CurPage,CurCol;
void LCD_BUSY(unsigned char lr) //判断忙标志
{
unsigned char status;
if(lr==RIGHT)
{
CLEAR_LCD_CS2; //cs2=0
SET_LCD_CS1; //cs1=1
}
else
{
SET_LCD_CS2; //cs2=1
CLEAR_LCD_CS1; //cs1=0
}
SET_LCD_CMD;
SET_LCD_READ;
SET_LCD_E;
delay_us();
while(LCD_OP_PORT&LCD_STATUS_BUSY)
{
CLEAR_LCD_E;
delay_us();
SET_LCD_E;
delay_us();
}
CLEAR_LCD_E;
SET_LCD_WRITE;
}
void write_LCD(unsigned char lr,unsigned char cd,unsigned char dat) /*写入指令或数据*/
{
LCD_BUSY(lr);
if(cd==CMD)
SET_LCD_CMD;
else
SET_LCD_DATA;
SET_LCD_WRITE;
SET_LCD_E;
LCD_OP_PORT = dat;
#ifdef Debug
printf("%x \n",dat);
#endif
delay_nus(4);
CLEAR_LCD_E;
}
unsigned char read_LCD(unsigned char lr) /* 读显示数据 */
{
unsigned char dat;
LCD_BUSY(lr);
SET_LCD_DATA;
SET_LCD_READ;
SET_LCD_E;
delay_us();
dat=LCD_OP_PORT;
CLEAR_LCD_E;
SET_LCD_WRITE;
LCD_BUSY(lr);
SET_LCD_DATA;
SET_LCD_READ;
SET_LCD_E;
delay_us();
dat=LCD_OP_PORT;
CLEAR_LCD_E;
SET_LCD_WRITE;
return dat;
}
void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63
{
write_LCD(LEFT,CMD,0xc0|line);
}
void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
{
write_LCD(RIGHT,CMD,0xc0|line);
}
void set_page_L(unsigned char page) /*设置X地址 设置页*/ //0-7
{
write_LCD(LEFT,CMD,0xb8|page);
}
void set_page_R(unsigned char page) /*设置X地址 设置页*/ //0-7
{
write_LCD(RIGHT,CMD,0xb8|page);
}
void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
{
write_LCD(LEFT,CMD,0x40|col);
}
void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
{
write_LCD(RIGHT,CMD,0x40|col);
}
void LCD_Init(void) /*初始化函数*/
{
set_start_line_L(0); /*显示起始行为0*/
set_start_line_R(0); /*显示起始行为0*/
write_LCD(LEFT,CMD,DISPLAY_ON); /* 开显示 */
#ifdef Debug
//printf("OK \n");
#endif
// write_LCD(RIGHT,CMD,DISPLAY_ON); /* 开显示 */
for(;;)
{
// write_LCD(RIGHT,CMD,DISPLAY_ON); /* 开显示 */
// write_LCD(RIGHT,CMD,DISPLAY_OFF); /* 开显示 */
LCD_clr();
disp_char('1');
// disp_char('1');
}
}
void LCD_clr(void) /*清屏函数*/
{
unsigned char pages,i;
for(pages=6;pages<8;pages++)
{
set_page_L(pages); /* X 页地址 */
set_page_R(pages); /* X 页地址 */
for(i=0;i<20;i++)
{
set_col_addr_L(i);//Y
set_col_addr_R(i);//Y
write_LCD(LEFT,DATA,0x0);
write_LCD(RIGHT,DATA,0x0);
}
}
}
//ASCII 字模宽度及高度
#define ASC_CHR_WIDTH 8
#define ASC_CHR_HEIGHT 12
typedef struct typFNT_ASC16 /* 汉字字模显示数据结构 */
{
char Index[1];
char Msk[16];
};
struct typFNT_ASC16 ASC_16[] = { /* 显示为8*16 Curier 10 常规*/
"1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00,
};
#define ASC_HZ_WIDTH 12
//#define ASC_HZ_HEIGHT 12
typedef struct typFNT_GB16 /*12*16 汉字字模显示数据结构 */
{
char Index[2];
char Msk[24];
};
unsigned char GetPage(void) /*得到当前页*/
{
return CurPage;
}
unsigned char GetCol(void) /*得到当前列*/
{
return CurCol;
}
void SetPageCol(unsigned char upage, unsigned char ucol) /* 设置液晶的页和列 */
{
CurPage = upage;
CurCol = ucol;
if(ucol<64)
{
set_page_L(upage);
set_col_addr_L(ucol);
}
else
{
set_page_R(upage);
set_col_addr_R(ucol-64);
}
}
/* 设置当前显示的页和列 */
void SetRowCol(unsigned char urow, unsigned char ucol)
{
unsigned char page;
CurRow = urow;
CurCol = ucol;
switch(urow)
{
case 1:
page=0;
CurOffset=1;
break;
case 2:
page=1;
CurOffset=2;
break;
case 3:
page=3;
CurOffset=1;
break;
case 4:
page=4;
CurOffset=2;
break;
case 5:
page=6;
CurOffset=1;
break;
}
SetPageCol(page,ucol);
}
void disp_char(unsigned char c)
{
unsigned char k,j,uPage,uCol,ch_r,ch_w;
unsigned char width;
unsigned char len;
uPage = GetPage();
uCol = GetCol();
len=sizeof(ASC_16)/sizeof(ASC_16[0]);
for(k=0;k<len;k++)
{
if(c == ASC_16[k].Index[0] )
break;
}
if(k<len)
{
if(c=='-'||c==':')
width=ASC_CHR_WIDTH-2;
else if(c=='|')
width=ASC_HZ_WIDTH-ASC_CHR_WIDTH;
else
width=ASC_CHR_WIDTH;
if(CurOffset==1) //下半部是写半个字节
{
for(j=0;j<width;j++)
{
SetPageCol(uPage,uCol+j);
ch_w=ASC_16[k].Msk[j];
if(uCol+j<64)
write_LCD(LEFT,DATA,ch_w);
else
write_LCD(RIGHT,DATA,ch_w);
}
SetPageCol(uPage+1,uCol);
for(j=0;j<width;j++)
{
SetPageCol(uPage+1,uCol+j);
if(uCol+j<64)
ch_r=read_LCD(LEFT);
else
ch_r=read_LCD(RIGHT);
ch_r&=0xf0;
ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j]&0x0f;
ch_w|=ch_r;
SetPageCol(uPage+1,uCol+j);
if(uCol+j<64)
write_LCD(LEFT,DATA,ch_w);
else
write_LCD(RIGHT,DATA,ch_w);
}
}
else //上半部是写半个字节
{
for(j=0;j<width;j++)
{
SetPageCol(uPage,uCol+j);
if(uCol+j<64)
ch_r=read_LCD(LEFT);
else
ch_r=read_LCD(RIGHT);
ch_r&=0x0f;
ch_w=ASC_16[k].Msk[j];
ch_w=ch_w<<4;
ch_w|=ch_r;
SetPageCol(uPage,uCol+j);
if(uCol+j<64)
write_LCD(LEFT,DATA,ch_w);
else
write_LCD(RIGHT,DATA,ch_w);
}
SetPageCol(uPage+1,uCol);
for(j=0;j<width;j++)
{
SetPageCol(uPage+1,uCol+j);
ch_r=ASC_16[k].Msk[j];
ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j];
ch_r=ch_r>>4;
ch_w=ch_w<<4;
ch_w|=ch_r;
SetPageCol(uPage+1,uCol+j);
if(uCol+j<64)
write_LCD(LEFT,DATA,ch_w);
else
write_LCD(RIGHT,DATA,ch_w);
}
}
}
SetPageCol(uPage,uCol+width);
}
/*
void disp_hz(unsigned char *hz)
{
unsigned char k,j,uPage,uCol,ch_r,ch_w;
uPage = GetPage();
uCol = GetCol();
for(k=0;k<sizeof(GB_16)/sizeof(GB_16[0]);k++)
{
if(hz[0] == GB_16[k].Index[0] && hz[1] == GB_16[k].Index[1])
break;
}
if(CurOffset==1)
{
for(j=0;j<ASC_HZ_WIDTH;j++)
{
SetPageCol(uPage,uCol+j);
ch_w=GB_16[k].Msk[j];
if(uCol+j<64) write_LCD(LEFT,DATA,ch_w);
else write_LCD(RIGHT,DATA,ch_w);
}
SetPageCol(uPage+1,uCol);
for(j=0;j<ASC_HZ_WIDTH;j++)
{
SetPageCol(uPage+1,uCol+j);
if(uCol+j<64)
ch_r=read_LCD(LEFT);
else
ch_r=read_LCD(RIGHT);
ch_r&=0xf0;
ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j]&0x0f;
ch_w|=ch_r;
SetPageCol(uPage+1,uCol+j);
if(uCol+j<64)
write_LCD(LEFT,DATA,ch_w);
else
write_LCD(RIGHT,DATA,ch_w);
}
SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
}
else //汉字上半部是写半个字节
{
for(j=0;j<ASC_HZ_WIDTH;j++)
{
SetPageCol(uPage,uCol+j);
if(uCol+j<64)
ch_r=read_LCD(LEFT);
else ch_r=read_LCD(RIGHT);
ch_r&=0x0f;
ch_w=GB_16[k].Msk[j];
ch_w=ch_w<<4;
ch_w|=ch_r;
SetPageCol(uPage,uCol+j);
if(uCol+j<64)
write_LCD(LEFT,DATA,ch_w);
else
write_LCD(RIGHT,DATA,ch_w);
}
SetPageCol(uPage+1,uCol);
for(j=0;j<ASC_HZ_WIDTH;j++)
{
SetPageCol(uPage+1,uCol+j);
ch_r=GB_16[k].Msk[j];
ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j];
ch_r=ch_r>>4;
ch_w=ch_w<<4;
ch_w|=ch_r;
SetPageCol(uPage+1,uCol+j);
if(uCol+j<64)
write_LCD(LEFT,DATA,ch_w);
else
write_LCD(RIGHT,DATA,ch_w);
}
SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
}
}
*/
void disp_str(unsigned char *p)
{
unsigned char i=0;
while(p[i]>0)
{
if(p[i] < 128)
{ /* ASCII */
disp_char(p[i]);
}
else
{ /* 中文 */
disp_hz(&p[i]);
i++;
}
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -