📄 lcdlib.c
字号:
#include "LCD_320240.h"
//#include "uart_lib.h"
//#include "44b.h"
#include "LCDlib.h"
#include "hanzi.h"
#include "GUIbasic.h"
#define BIT_A0 (0x1 << 7)
#define BIT_nWR (0x1 << 6)
#define BIT_nRD (0x1 << 5)
#define DELAY_TIME 2
static const BYTE SYSTAB[8] = {
0x30, // 0011 0000 B: 1, W/S: 0, M2: 0, M1: 0, M0: 0
0x87, // 1000 0111 WF: 1, FX: 7字符宽度8点阵
0x0f, // 0000 1111 FY: 16字符垂直大小16点阵
0x27, // 0010 0111 C/R: 39 每行显示的字符数
0x36, // 0100 0010 TC/R: 66
0xEF, // 1110 1111 L/F: 240
0x28, // 0010 1000 APL: 40
0x00 // 0000 0000 APH: 0
};
#define BasePart1 0x00//0x0000为第一显示区首地址
#define BasePart2 0x40//0x4000为第二显示区首地址
#define BasePart3 0x80//0x8000为第三显示区首地址
#define BasePart4 0x00
static const BYTE SCRTAB[10] = {
0x00, // 0000 0000 SAD1L: 0x00
BasePart1, // 0000 0000 SAD1H: 0x00
0xf0, // 1111 0000 SL1: 240 ;1区显示屏的行数为240
0x00, // 0000 0000 SAD2L: 0x00
BasePart2, // 0001 0000 SAD2H: 0x10
0xf0, // 1111 0000 SL2: 240;1区显示屏的行数为240
0x00, // 0000 0000 SAD3L: 0x00
BasePart3, // 1000 0000 SAD3H: 0x40
0x00, // 0000 0000 SAD4L: 0x00
BasePart4 // 0101 0000 SAD4H: 0x50
};
extern unsigned char ASCII16x8[][16];
UINT8 buffer[240][40]; //显示缓冲区
UINT8 nanjing[][16]=
{
/*-- 文字: 南 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x00,0x3F,0xFC,0x24,0x24,0x22,0x44,
0x2F,0xF4,0x21,0x04,0x3F,0xFC,0x21,0x04,0x21,0x04,0x21,0x14,0x21,0x08,0x00,0x00,
/*-- 文字: 京 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x02,0x00,0x01,0x08,0x7F,0xFC,0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,
0x1F,0xF0,0x01,0x00,0x09,0x30,0x19,0x18,0x31,0x0C,0x41,0x08,0x05,0x00,0x02,0x00,
};
void LCDturnoff(void)
{
WLCDCmd(0x58);//off screen
WLCDData(0x00);
}
void LCDturnon(void)
{
WLCDCmd(0x59);//on screen
WLCDData(0x55);
}
void Delaycicle(U16 i)
{
int j=0;
while(j<i)j++;
}
void WLCDData(UINT8 data)
{
/* PORT D GR
OUP(I/O OR LCD) */
// 00-input 01-output 10-sfr
/* BIT 7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* PD 7 6 5 4 3 2 1 0 */
/* o o o o o o o o */
/* LCD LCD LCD LCD LCD LCD LCD LCD */
/* 01 01 01 01 01 01 01 01 */
rPCOND=0x5555;
rPDATC&=~BIT_A0;
rPDATC|= BIT_nRD;
rPDATC&=~BIT_nWR; // clear nWR
rPDATD=data;
#if DELAY_TIME > 0
Delaycicle(DELAY_TIME); // Delay for SED1335
#endif
rPDATC|=BIT_nWR;
}
void WLCDCmd(UINT8 cmd)
{
/* PORT D GROUP(I/O OR LCD) */
// 00-input 01-output 10-sfr
/* BIT 7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* PD 7 6 5 4 3 2 1 0 */
/* o o o o o o o o */
/* LCD LCD LCD LCD LCD LCD LCD LCD */
/* 01 01 01 01 01 01 01 01 */
rPCOND=0x5555;
rPDATC|=BIT_A0;
rPDATC|=BIT_nRD;
rPDATC&=~BIT_nWR; // Set nWR
rPDATD=cmd;
#if DELAY_TIME > 0
Delaycicle(DELAY_TIME); // Delay for SED1335
#endif
rPDATC|=BIT_nWR;
}
UINT8 RLCDData()
{
UINT8 data;
/* PORT D GROUP(I/O OR LCD) */
// 00-input 01-output 10-sfr
/* BIT 7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* PD 7 6 5 4 3 2 1 0 */
/* i i i i i i i i */
/* LCD LCD LCD LCD LCD LCD LCD LCD */
/* 00 00 00 00 00 00 00 00 */
rPDATD=0x0;
rPCOND=0x0;
rPDATC|=BIT_A0;
rPDATC&=~BIT_nRD;
rPDATC|=BIT_nWR; // Set nWR
data=rPDATD;
#if DELAY_TIME > 0
Delaycicle(DELAY_TIME); // Delay for SED1335
#endif
rPDATC|=BIT_nRD;
return data;
}
UINT8 RLCDSta()
{
UINT8 stu;
/* PORT D GROUP(I/O OR LCD) */
// 00-input 01-output 10-sfr
/* BIT 7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* PD 7 6 5 4 3 2 1 0 */
/* i i i i i i i i */
/* LCD LCD LCD LCD LCD LCD LCD LCD */
/* 00 00 00 00 00 00 00 00 */
rPDATD=0x0;
rPCOND=0x0;
rPDATC|=BIT_A0;
rPDATC&=~BIT_nRD;
rPDATC|=BIT_nWR; // Set nWR
stu=rPDATD;
#if DELAY_TIME > 0
Delaycicle(DELAY_TIME); // Delay for SED1335
#endif
rPDATC|=BIT_nRD;
return stu;
}
/* 更新指定的显示区域*/
void LCDupdata(UINT16 x1,UINT16 y1,UINT16 x2, UINT16 y2)
{
int i,j;
WLCDCmd( CSR_RIGHT); /*光标自动向右增一*/
WLCDCmd( CSRW); /*设定光标位置命令*/
WLCDData( 0 ); /* 从0000位置开始*/
WLCDData( 0 );
WLCDCmd( MWRITE); /* 允许uPU连续地把显示数据写入显示区内命令*/
for(j=y1;j<y2;j++)
for(i=x1;i<x2;i++)
WLCDData(buffer[j][i]);
}
/* 清除显示区域*/
void LCDClear()
{
U16 i=32768;
WLCDCmd( CSR_RIGHT); /*光标自动向右增一*/
WLCDCmd( CSRW); /*设定光标位置命令*/
WLCDData( 0 ); /* 从0000位置开始*/
WLCDData( 0 );
WLCDCmd( MWRITE); /* 允许uPU连续地把显示数据写入显示区内命令*/
while(i--) { /*将32K显缓全部清零,即LCD不显示任何东西*/
WLCDData( 0x0 );
}
}
/* 液晶屏初始化*/
void LCDinit()
{
U16 i;
Delaycicle(600);//足够的时间让液晶准备好
WLCDCmd(SYSTEM_SET);
for(i=0;i<8;i++)
{
WLCDData(SYSTAB[i]);
}
WLCDCmd(SCROLL);
for(i=0;i<10;i++)
{
WLCDData(SCRTAB[i]);
}
WLCDCmd(HDOT_SCR);
WLCDData(0);
WLCDCmd(OVLAY);
WLCDData(0x1C); //设置一三区属性为图形方式,或方式合成
WLCDCmd(DISP_ON);
WLCDData(0x54); //关光标显示
LCDClear();
}
/* 液晶屏测试函数*/
void Lcd_test(void)
{
U8 i;
UINT8 data;
char s[]="welcom!";
uint32 dd[]={200,10,250,20,300,40,240,90,200,10};
WLCDCmd( CSR_DOWN); /*光标自动向下增一*/
WLCDCmd( CSRW); /*设定光标位置命令*/
WLCDData( 0x0 ); /* 从0000位置开始*/
WLCDData( 0x0 );
WLCDCmd( MWRITE); /* 允许uPU连续地把显示数据写入显示区内命令*/
for(i=0;i<16;i++)
{
data=nanjing[0][i*2];
WLCDData(data);
Delay(10);
//Uart_Printf("lcddata=%d;\n",RLCDData());
}
WLCDCmd( CSRW); /*设定光标位置命令*/
WLCDData( 0x1 ); /* 从0000位置开始*/
WLCDData( 0x0 );
WLCDCmd( MWRITE); /* 允许uPU连续地把显示数据写入显示区内命令*/
for(i=0;i<16;i++)
{
data=nanjing[0][i*2+1];
WLCDData(data);
Delay(10);
//Uart_Printf("lcddata=%d;\n",RLCDData());
}
i=0;
while(s[i]!='\0')
{
Lcd_printfchar(20,i,s[i]);
i++;
}
DrawSting16X16( 40,0, "我爱LCD!") ;
GUI_HLine(2,100,100,1);
GUI_RLine(2,100,200,1);
GUI_RectFill(5, 110, 100,200, 1);
GUI_CircleFill(200,150, 50, 1);
GUI_LineS(dd, 5, 1);
}
/* 液晶屏汉字显示函数*/
void Lcd_printfHZ(UINT16 row,UINT16 col, UINT16 data)
{
U8 i;
UINT16 j;
j=row*40+col;
WLCDCmd( CSR_DOWN); /*光标自动向下增一*/
WLCDCmd( CSRW); /*设定光标位置命令*/
WLCDData( j%256 ); /* 从0000位置开始*/
WLCDData( j/256 );
WLCDCmd( MWRITE); /* 允许uPU连续地把显示数据写入显示区内命令*/
for(i=0;i<16;i++)
{
WLCDData((UINT8)hanzi[data][i*2]);
Delay(10);
//Uart_Printf("lcddata=%d;\n",RLCDData());
}
WLCDCmd( CSRW); /*设定光标位置命令*/
WLCDData( (j%256)+1 ); /* 从0000位置开始*/
WLCDData( j/256 );
WLCDCmd( MWRITE); /* 允许uPU连续地把显示数据写入显示区内命令*/
for(i=0;i<16;i++)
{
WLCDData(hanzi[data][i*2+1]);
Delay(10);
//Uart_Printf("lcddata=%d;\n",RLCDData());
}
}
/* 液晶ASCII码显示函数*/
void Lcd_printfchar(UINT16 row,UINT16 col, UINT8 data )
{
UINT8 i;
UINT16 j;
j=row*40+col;
WLCDCmd( CSR_DOWN); /*光标自动向下增一*/
WLCDCmd( CSRW); /*设定光标位置命令*/
WLCDData( j%256 );
WLCDData( j/256 );
WLCDCmd( MWRITE); /* 允许uPU连续地把显示数据写入显示区内命令*/
for(i=0;i<16;i++)
{
WLCDData(ASCII16x8[data-0x20][i]);
Delay(10);
}
}
/*字符串显示输出*/
void DrawSting16X16( UINT16 rowfirst,UINT16 colfirst, char *p)
{
UINT16 q,qq;
UINT16 row,col;
int i;
row=rowfirst;
col=colfirst;
i=0;
while(p[i]!='\0')
{
if(p[i]&0x80)
{
q=p[i];
i++;
qq=p[i];
q=(q-0xB0)*94+(qq-0xA1); //取出汉字内码
Lcd_printfHZ(row,col,q);
col+=2;
if(col==40)
{
col=0;
row++;
}
}
else
{
Lcd_printfchar(row,col,p[i]); //输出单个字符
col++;
if(col==40)
{
col=0;
row++;
}
}
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -