📄 12864.h
字号:
//disp_char(8,4,'x'); 例子!!!!
//disp_char(9,4,'x');
//disp_str(1,1,"haha");
/* char n=9;
Write_Cmd(0x7F + 2); //第一行 第二位
Write_Data(0x30+n);//ACSLL码*/
/*LCD_Draw_Point(10,10,1);
LCD_Draw_Point(1,1,2);*/
/*LCD_Draw_Line_x(1,127,1,1);
LCD_Draw_Line_x(1,50,0,2);
LCD_Draw_Line_x(1,50,60,2);
LCD_Draw_Line_x(1,50,63,2);*/
//LCD_Draw_Line_Y(0,0,63,1); // 第0列 从第一行划线到最后一行,颜色1
// LCD_Draw_Line(0,0,127,63,1);//只能画45°斜线
typedef unsigned char uchar;
typedef unsigned int uint;
extern const unsigned char shuzi_table[];
#define LCD_DataIn P6DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P6DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P6IN
#define MCU2LCD_Data P6OUT
#define LCD_CMDOut P3DIR|=0x07 //P3口的低三位设置为输出
#define LCD_RS_H P3OUT|=BIT0 //P3.0
#define LCD_RS_L P3OUT&=~BIT0 //P3.0
#define LCD_RW_H P3OUT|=BIT1 //P3.1
#define LCD_RW_L P3OUT&=~BIT1 //P3.1
#define LCD_EN_H P3OUT|=BIT2 //P3.2
#define LCD_EN_L P3OUT&=~BIT2 //P3.2
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;
for(i = n;i > 0;i--) Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*********
函数功能:读数据
读数据???
***********/
uchar Read_Data()
{
uchar lcdtemp = 0;
uchar data=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataIn;
LCD_RS_H; //选择数据
LCD_RW_H; //读数据
LCD_EN_H;
_NOP();
data = LCD2MCU_Data;
_NOP();
LCD_EN_L;
return data;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Init_Lcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出
Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址归位
Delay_1ms();
Write_Cmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01); //清除显示
Delay_1ms();
Write_Cmd(0x06); //游标右移
Delay_1ms();
Write_Cmd(0x80); //设定显示的起始地址
}
/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}
/*******************************************
函数名称:Clear_GDRAM
功 能:清除液晶GDRAM中的随机数据
参 数:无
返回值 :无
********************************************/
void Clear_GDRAM(void)
{
uchar i,j,k;
Write_Cmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
Write_Cmd(0x30); //回到基本指令集
}
/*******************************************
函数名称:Draw_PM
功 能:在整个液晶屏幕上画图
参 数:无
返回值 :无
********************************************/
void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
i = 0x80;
Write_Cmd(0x36); //打开绘图显示
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k = 0;k < 16;k++)
{
Write_Data(*ptr++);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(*ptr++);
}
}
Write_Cmd(0x34); //打开扩展指令集
Write_Cmd(0x30); //回到基本指令集
}
/*******************************************
函数名称:Draw_TX
功 能:显示一个16*16大小的图形
参 数:Yaddr--Y地址
Xaddr--X地址
dp--指向图形数据存放地址的指针
返回值 :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
uchar j;
uchar k=0;
Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr); //X地址
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集模式
}
/****************定位函数*****x(1~8)y(1~4)****************/
void LCD_SetXY(uchar X, uchar Y)
{
switch(Y) {
case 1: Write_Cmd(0x7F + X);break;
case 2: Write_Cmd(0x8F + X);break;
case 3: Write_Cmd(0x87 + X);break;
case 4: Write_Cmd(0x97 + X);break;
default:break;
}
}
/****************在指定的位置显示某个字符****************/
void disp_char(unsigned char X, unsigned char Y, unsigned char wdata)
{
LCD_SetXY(X, Y);
Write_Data(wdata);
}
/***********
函数功能:在指定的位置显示字符串
************/
void disp_str(unsigned char X, unsigned char Y, unsigned char *Str)
{
unsigned char temp;
LCD_SetXY(X, Y);
temp = *Str;
while(temp != 0)
{
Write_Data(temp);
temp = *(++Str);
}
}
/**********************
函数功能:画点x(0~127) y(0~63)
color 0蓝色 1,2白色
***********************/
void LCD_Draw_Point( uchar X,uchar Y,uchar Color ) //X为列,Y为行!!!!!!!!
{
uchar Row,Tier,Tier_bit;//
uchar ReadOldH,ReadOldL;//
Write_Cmd(0x34);//扩充指令集
Write_Cmd(0x36);
Tier= X >> 4 ; //Tier 为X除以16
Tier_bit = X & 0x0f ;
if( Y < 32 )//定义点的位置x为0到63,y为0到7
{
Row = Y ;
}
else
{
Row = Y - 32 ;
Tier += 8 ;
}
Write_Cmd( Row + 0x80 );//送行的地址
Write_Cmd( Tier + 0x80 );//送列的地址
Read_Data();//读出该点的数据,即状态
ReadOldH = Read_Data();
ReadOldL = Read_Data();
Write_Cmd( Row + 0x80 );
Write_Cmd( Tier + 0x80 );
if( Tier_bit < 8 )
{
switch( Color)
{
case 0 : ReadOldH &=(~( 0x01 << ( 7 - Tier_bit ))); break ;
case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ;
case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit )) ; break ;
default: break ;
}
Write_Data( ReadOldH ) ;
Write_Data( ReadOldL ) ;
}
else
{
switch(Color)
{
case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit )));break ;
case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit )) ; break ;
case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;
default : break ;
}
Write_Data( ReadOldH );
Write_Data( ReadOldL );
}
Write_Cmd(0x30);
}
/******************画水平线*********************/
void LCD_Draw_Line_x( uchar X0, uchar X1, uchar Y, uchar Color )
{
uchar Temp ;
if( X0 > X1 )
{
Temp = X1 ;
X1 = X0 ;
X0 = Temp ;
}
for( ; X0 <= X1 ; X0++ )
LCD_Draw_Point( X0, Y, Color );
}
//画垂直线 第x列 从第y0行画到第y1行 颜色 color
void LCD_Draw_Line_Y( uchar X, uchar Y0, uchar Y1, uchar Color )
{
uchar Temp ;
if( Y0 > Y1 )
{
Temp = Y1 ;
Y1 = Y0 ;
Y0 = Temp ;
}
for(; Y0 <= Y1 ; Y0++)
LCD_Draw_Point( X, Y0, Color);
}
//画斜线(x,y)到(end x,end y)
void LCD_Draw_Line( uchar StartX, uchar StartY, uchar EndX, uchar EndY, uchar Color )
{
int distance; /*根据屏幕大小改变变量类型(如改为int型)*/
int delta_x, delta_y ;
int incx, incy ;
do{
delta_x = EndX - StartX ;
delta_y = EndY - StartY ;
if( delta_x > 0 )
{
incx = 1;
}
else if( delta_x == 0 )
{
incx = 0;
}
else
{
incx = -1 ;
}
if( delta_y > 0 )
{
incy = 1 ;
}
else if(delta_y == 0 )
{
incy = 0 ;
}
else
{
incy = -1 ;
}
delta_x = incx * delta_x ;
delta_y = incy * delta_y ;
if( delta_x > delta_y )
{
distance = delta_x ;
StartX+=incx;
StartY+=incy;
}
else
{
distance = delta_y;
StartX+=incx;
StartY+=incy;
}
LCD_Draw_Point( StartX, StartY, Color );
}while(distance!=0);
}
/**********************
函数功能:清除一个点
***********************/
void LCD_Draw_Point_clear( uchar X,uchar Y )
{
uchar Row,Tier,Tier_bit;//
uchar ReadOldH,ReadOldL;//
Write_Cmd(0x34);//扩充指令集
Write_Cmd(0x36);
Tier= X >> 4 ; //Tier 为X除以16
Tier_bit = X & 0x0f ;
if( Y < 32 )//定义点的位置x为0到63,y为0到7
{
Row = Y ;
}
else
{
Row = Y - 32 ;
Tier += 8 ;
}
Write_Cmd( Row + 0x80 );//送行的地址
Write_Cmd( Tier + 0x80 );//送列的地址
Read_Data();//读出该点的数据,即状态
ReadOldH = Read_Data();
ReadOldL = Read_Data();
Write_Cmd( Row + 0x80 );
Write_Cmd( Tier + 0x80 );
Write_Data( 0x00);
Write_Data(0x00);
Write_Cmd(0x30);
}
//清除一条垂直线
void LCD_Draw_Line_Y_clear( uchar X, uchar Y0, uchar Y1 )
{
uchar Temp ;
if( Y0 > Y1 )
{
Temp = Y1 ;
Y1 = Y0 ;
Y0 = Temp ;
}
for(; Y0 <= Y1 ; Y0++)
LCD_Draw_Point_clear( X, Y0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -