📄 lcd12864.c
字号:
//RD P5.0
//WR P5.1
//CD P5.5
//CS P5.6
#include"MSP430X44X.h"
#include"lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
uchar Disp_Buff[16]; //显示缓冲区
/************************提取点阵方向:横向(先上->下, 再左->右)**********************************************/
uchar CGTAB[224]={
0x01,0x01,0x01,0x01,0x01,0x7D,0x05,0x05, // 水
0x09,0x09,0x11,0x21,0x41,0x81,0x05,0x02,
0x00,0x00,0x00,0x08,0x18,0x20,0xC0,0x80,
0x40,0x20,0x10,0x0E,0x04,0x00,0x00,0x00,
0x00,0x43,0x32,0x12,0x83,0x62,0x22,0x0B, // 温
0x10,0x27,0xE4,0x24,0x24,0x24,0x2F,0x20,
0x08,0xFC,0x08,0x08,0xF8,0x08,0x08,0xF8,
0x00,0xFC,0xA4,0xA4,0xA4,0xA4,0xFE,0x00,
0x20,0x20,0x20,0x27,0xF4,0x29,0x22,0x34, // 控
0x60,0xA3,0x20,0x20,0x20,0x20,0xAF,0x40,
0x80,0x40,0x40,0xFE,0x02,0x24,0x10,0x08,
0x00,0xF8,0x40,0x40,0x40,0x44,0xFE,0x00,
0x04,0x24,0x24,0x3F,0x24,0x44,0xFF,0x04, // 制
0x04,0x3F,0x24,0x24,0x26,0x25,0x04,0x04,
0x04,0x04,0x04,0xA4,0x24,0x24,0xE4,0x24,
0x24,0xA4,0xA4,0x84,0x84,0x04,0x14,0x08,
0x00,0x7F,0x02,0x04,0x08,0x3F,0x01,0x06, // 系
0x18,0x3F,0x11,0x01,0x11,0x21,0x45,0x02,
0x38,0xC0,0x00,0x20,0x40,0x80,0x00,0x20,
0x10,0xF8,0x08,0x00,0x10,0x08,0x08,0x00,
0x10,0x10,0x20,0x27,0x48,0xF9,0x12,0x27, // 统
0x49,0xFD,0x45,0x09,0xAA,0xAA,0xA4,0x08,
0x80,0x40,0x48,0xFC,0x80,0x10,0x08,0xFC,
0x24,0x20,0x20,0x20,0x22,0x22,0x1E,0x00,
};
//uchar DTAB[11]={ 0x37,0x45,0x4c,0x43,0x4f,0x4d,0x45,0x00,0x39,0x4f,0x55};
/******查询STA1 STA0 状态*********/
void Check_STA01(void)
{
uchar state;
do
{
data_DIR=0x00;
CD_H; //command channel select
RD_L; //读数据口
state=data_IN&0x03;
RD_H;
}
while(state!=0x03);
}
/*********查询STA2状态(数据自动读状态)*******/
void Check_STA2(void)
{
uchar state;
do
{
data_DIR=0x00;
CD_H; //command channel select
RD_L; //读数据口
state=data_IN&0x03;
RD_H;
}
while(state!=0x04);
}
/**********查询STA3状态(数据自动写状态)*******/
void Check_STA3(void)
{
uchar state;
do
{
data_DIR=0x00;
CD_H; //command channel select
RD_L; //读数据口
state=data_IN&0x03;
RD_H;
}
while(state!=0x08);
}
/********查询STA6状态(屏读/屏复制状态)*******/
void Check_STA6(void)
{
uchar state;
do
{
data_DIR=0x00;
CD_H; //command channel select
RD_L; //读数据口
state=data_IN&0x03;
RD_H;
}
while(state!=0x40);
}
/********向数据口发数据*********/
void WR_data(uchar dat)
{
Check_STA01();
data_DIR=0xff;
CD_L; //data channel select
WR_L; //写数据
data_OUT=dat;
WR_H;
}
/**********写一个命令*********/
void WR_com(uchar com)
{
Check_STA01();
data_DIR=0xff;
CD_H; //command channel select
WR_L; //写命令
data_OUT=com;
WR_H;
}
/***********写一个参数及命令***********/
void WR_data_com(uchar dat1,uchar com1)
{
WR_data(dat1);
WR_com(com1);
}
/************写两个参数及命令***************/
void WR_data2_com(uchar dat1,uchar dat2,uchar com1)
{
WR_data(dat1);
WR_data(dat2);
WR_com(com1);
}
/*************清文本显示RAM*****************/
void Clear_Text_Area(void)
{
uchar i;
WR_data2_com(0x00,0x00,0x24);//置文本区首指针
Check_STA3();
WR_com(0xB0);
for(i=0;i<=16*8;i++) //对128*64点阵液晶清屏每行16个,共8行,每次清一个字符
{
WR_data(0x00); //写数据0x00
}
Check_STA3();
WR_com(0xB2); //自动写结束
}
/*************清RAM区*********************/
void Clear_Dian(uchar a) //0:清除文本区;1:清除图形区
{
uint l,i;
if(a==0)
{
WR_data2_com(0x00,0x00,0x24);
i=129;
}
if(a==1)
{
WR_data2_com(0x00,0x04,0x24);
i=1025;
}
WR_com(0xb0);
for(l=i;l>0;l--)
{
WR_data(0x00);
}
WR_com(0xb2);
}
/**************清图形显示RAM**************/
void Clear_Image_Area(void)
{
uint i;
WR_data2_com(0x00,0x04,0x24);//置图形区首指针
Check_STA3();
WR_com(0xB0); //自动写
for(i=0;i<=16*64;i++) //对128*64LCD清屏,每次是清楚8个点阵,每行16个,共64行
{
WR_data(0x00); //写数据0x00
}
Check_STA3();
WR_com(0xB2); //自动写结束
}
/************清文本特征显示RAM ***********/
void Clear_Special_Text_Area(void)
{
uint i;
WR_data2_com(0x00,0x08,0x24);//置图形区首指针
Check_STA3();
WR_com(0xB0); //自动写结束
for(i=0;i<=16*64;i++)//对128*64LCD清屏,每次是清楚8个点阵,每行16个,共64行
{
WR_data(0x00); //写数据0x00
}
Check_STA3();
WR_com(0xB2); //自动写结束
}
/***************字符显示程序*******************/
void Chars_dis(uchar *s)
{
uchar w;
for(w=0;w<16;w++)
Disp_Buff[w]=s[w];
}
/**************** 显示一行英文字符*******************/
void Dis_line(uchar Line_num) //显示内容为Disp_Buff内所存内容
{
uchar i;
WR_data2_com(Line_num*16,0x00,0x24);
WR_com(0xb0);
for(i=0;i<16;i++)
{
WR_data(Disp_Buff[i]-0x20);
}
WR_com(0xb2);
}
/******************** 在指定的像素点位置显示字符 ************************/
void Display_Char(uchar X,uchar Y,uchar Tab)
{
uchar Addr_H,Addr_L;
uint Addr;
Addr=(uint)(Y*16)+X; //文本区地址
Addr_H=(uchar)(Addr>>8);
Addr_L=(uchar)Addr;
WR_data2_com(Addr_L,Addr_H,0x24); //置地址指针
Check_STA3();
WR_com(0xB0);
WR_data(Tab-0x20); //对显示字符进行ASCII码调整
Check_STA3();
WR_com(0xB2); //关自动写
}
/******************** 在指定的像素点位置显示字符串 ************************/
void Display_String(uchar X,uchar Y,uchar Length,uchar Tab[])
{ //入口参数:显示位置坐标,字符串长度,字符串入口指针
uchar Addr_H,Addr_L,i;
uint Addr;
Addr=(uint )(Y*16)+X;
Addr_H=(Addr>>8);
Addr_L=(uchar)Addr;
WR_data2_com(Addr_L,Addr_H,0x24); //置地址指针
Check_STA3();
WR_com(0xB0); //自动写
for(i=0;i<Length;i++)
WR_data(Tab[i]-0x20); //对显示字符进行ASCII码调整
Check_STA3();
WR_com(0xB2); //关自动写
}
/************设置图形显示方式**********/
void Set_Image(void)
{
WR_data2_com(0x00,0x04,0x42);//图形区首地址
WR_com(0x80); //显示方式设置:逻辑或合成0x80
}
/************液晶初始化程序************/
void LCD_Initial(void)
{
WR_data2_com(0x00,0x00,0x40);//文本显示区首地址
WR_data2_com(0x10,0x00,0x41);//文本显示区宽度,16个字符
Set_Image(); //设置图形显示方式
WR_data2_com(0x10,0x00,0x43);//图形显示区宽度,16个字符
WR_data2_com(0x02,0x00,0x22);//CGRAM显示区首地址
WR_com(0x9c);//显示开关设置,文本显示启用,图形显示启用,光标显示启用,光标闪烁启用,
WR_com(0xa7); //设置光标形状
WR_com(0x80); //显示方式设置看,逻辑或合成
//Clear_Text_Area(); //清显示区
//Clear_Image_Area();
//Clear_Special_Text_Area();
}
/******************显示汉字*******************/
void CGRAM(void)
{
unsigned int i;
unsigned char *p;
p=CGTAB;
WR_data2_com(0x03,0x00,0x22);// 设置CGRAM偏置地址
WR_data2_com(0x00,0x1c,0x24); //设置存储器地址指针
WR_com(0xb0); //设置自动写方式
for(i=0;i<224;i++)
{
//ST3();
// Out_data(CGTAB[i]);
WR_data(*p++);
}
WR_com(0xb2);//设置自动写结束方式
}
void CLEAR(void)
{
unsigned int a;
WR_data2_com(0x00,0x1c,0x24);//设置显示地址
WR_com(0xb0);//设置自动写方式
for(a=0;a<224;a++) //清8K存储器
{
//ST3();
WR_data(0x00);
}
WR_com(0xb2); // 设置自动写结束方式
}
void CCW1_PR(unsigned int O_Y,unsigned int O_X,uchar o ) // 汉字写入(文本方式)函数
{
uint i,j,code_1;
uint dat1,dat2;
i=0x10;
code_1 =0x80+o*4;
j=i*O_Y+O_X;
dat1=j%256;
dat2=j/256;
WR_data2_com(dat1,dat2,0x24); //设置显示地址
dat2=code_1;
WR_data_com(dat2,0xc0);// 写入左上半部汉字代码
dat2=code_1+0x02;
WR_data_com(dat2,0xc0); //写入右上半部汉字代码
j=j+i;
dat1=j%256; //显示RAM地址修正
dat2=j/256;
WR_data2_com(dat1,dat2,0x24);
dat2=code_1+0x01; //写入左下半部汉字代码
WR_data_com(dat2,0xc0);
dat2=code_1+0x03; //写入右下半部汉字代码
WR_data_com(dat2,0xc0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -