下面是我的代码请大神看看void LCD12864_Data_State(GPIOMode_TypeDef state)
{
u8 i=0;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
//--------------------------------------------------------------------------------
//LCD-GPIO 口配置(数据接口)
for(i=0;i<8;i++)
{
GPIO_InitStructure.GPIO_Pin = LCD_DATA_Pin[i].Pin_No; //数据口配置成开漏输出模式,此模式下读输入寄存器的值得到IO口状态
GPIO_InitStructure.GPIO_Mode = state; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_DATA_Pin[i].IoPort , &GPIO_InitStructure); //IO口初始化函数(使能上述配置)
}
}
void LCD_WriteData(u8 dat)
{
u8 i;
LCD12864_Data_State(GPIO_Mode_Out_PP);
for(i=0;i<8;i++)
{
if(dat&0x80)
{
GPIO_SetBits(LCD_DATA_Pin[i].IoPort,LCD_DATA_Pin[i].Pin_No);
}else
{
GPIO_ResetBits(LCD_DATA_Pin[i].IoPort,LCD_DATA_Pin[i].Pin_No);
}
dat=dat<<1;
}
}
/*
4
D/I(RS)
H/L
D/I=“H”,表示DB7∽DB0为显示数据
D/I=“L”,表示DB7∽DB0为显示指令数据
5
R/W
H/L
R/W=“H”,E=“H”数据被读到DB7∽DB0
R/W=“L”,E=“H→L”数据被写到IR或DR
6
E
H/L
R/W=“L”,E信号下降沿锁存DB7∽DB0
R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0
*/
void WaitBusy(void) //等待12864的忙状态结束的函数。
{
//把所有引脚定义为输出。
u8 lcdtemp = 0;
u16 timecnt;
LCD12864_Data_State(GPIO_Mode_IN_FLOATING);
LCD_DI_L();
LCD_RW_H();
LCD_EN_H();
timecnt=0;
do //判忙
{
LCD_EN_H();
lcdtemp = GPIO_ReadInputDataBit(LCD_DATA_Pin[0].IoPort,LCD_DATA_Pin[0].Pin_No);
//delay_us(1);
LCD_EN_L();
timecnt++;
}
while(lcdtemp==1);//这里以后要加上超时操作
LCD_EN_L();
LCD12864_Data_State(GPIO_Mode_Out_PP);
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(u8 cmd)
{
WaitBusy();
LCD_RW_L();
LCD_EN_H();
LCD_DI_L();
LCD_WriteData(cmd);
delay_us(20);
LCD_EN_L();
delay_us(1);
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void Write_Data(u8 dat)
{
WaitBusy();
LCD_DI_H();
LCD_RW_L();
LCD_EN_H();
LCD_WriteData(dat);
delay_us(20);
LCD_EN_L();
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
LCD12864_Data_State(GPIO_Mode_Out_PP); //液晶控制端口设置为输出
LCD_CSA_H();
//复位
LCD_RS_L() ;
delay_ms(20);
LCD_RS_H();
// Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
delay_ms(1);
Write_Cmd(0x30); //基本指令集
delay_ms(1);
Write_Cmd(0x80); //设定显示的起始地址
delay_ms(1);
Write_Cmd(0x0c); //开显示,无游标,不反白.
delay_ms(1);
Write_Cmd(0x01);//Clear DDRAM and set DDRAM address to AC
Delay_Nms(15);//> 10ms
Write_Cmd(0x06); //游标右移
delay_ms(1);
}
/*******************************************
函数名称:Clear_GDRAM
功 能:清除液晶GDRAM中的随机数据
参 数:无
返回值 :无
********************************************/
void Clear_GDRAM(void)
{
u8 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_TX
功 能:显示一个8*16大小的图形
参 数:Yaddr--Y地址
Xaddr--X地址
flash--是否要闪
FangBai--是否要反白
dp--指向图形数据存放地址的指针
横向高点8位
返回值 :无
********************************************/
void Draw_TX8x16(u8 Yaddr,u8 Xaddr,const u8 * dp)
{
u8 j;
u8 k=0;
u8 data;
// Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr);//X地址
data=dp[k++];
Write_Data(data);
//data=dp[k++];
//Write_Data(data);
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集模式
}
//取反白
void Draw_TX8x16F(u8 Yaddr,u8 Xaddr,const u8 * dp)
{
u8 j;
u8 k=0;
u8 data;
// Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr);//X地址
data=~dp[k++];
Write_Data(data);
//data=~dp[k++];
//Write_Data(data);
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集模式
}
函数名称:Draw_TX
功 能:显示一个16*16大小的图形
参 数:Yaddr--Y地址
Xaddr--X地址
flash--是否要闪
FangBai--是否要反白
dp--指向图形数据存放地址的指针
横向高点8位
返回值 :无
********************************************/
void Draw_TX16x16(u8 Yaddr,u8 Xaddr,const u8 * dp)
{
u8 j;
u8 k=0;
u8 data;
// Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr);//X地址
data=dp[k++];
Write_Data(data);
data=dp[k++];
Write_Data(data);
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集模式
}
//取反白
void Draw_TX16x16F(u8 Yaddr,u8 Xaddr,const u8 * dp)
{
u8 j;
u8 k=0;
u8 data;
// Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr);//X地址
data=~dp[k++];
Write_Data(data);
data=~dp[k++];
Write_Data(data);
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集模式
}
//---------------------------------------------
//最多显示八个中文汉字
//---------------------------------------------
u8 uartprintf(u8 x,u8 y,u8 * str,u8 flash)
{
register u8 ch1;
register u8 ch2;
register u16 ch16;
register u16 index;//所在的位置
u8 hanziBuf[32];//汉字缓存
u8 AssiiBuf1[16];//ASSIIC缓存
u8 AssiiBuf2[16];//ASSIIC缓存
static u8 Youflag=0;
static u8 LastData=0;
register u8 Posx,Posy;
u8 i;
u8 j,k;
if(x>3) return 0;
if(y>7) return 0;
switch(x)
{
case 0:
Posy=0x80;
Posx=0x80+y;
break;
case 1:
Posy=0x90;
Posx=0x90+y;
break;
case 2:
Posy=0x80;
Posx=0x88+y;
break;
case 3:
Posy=0x90;
Posx=0x98+y;
break;
default:
Posy=0x80;
Posx=0x80+y;
break;
}
Youflag=0;
for(;;str++)
{
ch1=*str;
if(ch1==0)break;
if(ch1<0x80)
{
//point=chardot+((u16)(ch1-0x20)<<4);
if(Youflag==0)
{
Youflag=1;
LastData=ch1;
index=(ch1-0x20)*16;
memcpy(AssiiBuf1,&chardot[index],sizeof(AssiiBuf1));
if(flash&Flash_**) Draw_TX8x16(Posy,Posx,AssiiBuf1);
else Draw_TX8x16F(Posy,Posx,AssiiBuf1);
}else
{
Youflag=0;
//把连个字母的字模拼接成16x16
index=(LastData-0x20)*16;
memcpy(AssiiBuf1,&chardot[index],sizeof(AssiiBuf1));
index=(ch1-0x20)*16;
memcpy(AssiiBuf2,&chardot[index],sizeof(AssiiBuf2));
j=0;k=0;
for(i=0;i<32;i++)
{
if(i&0x01)
{
hanziBuf[i]=AssiiBuf2[j]; j++;
}
else
{
hanziBuf[i]=AssiiBuf1[k]; k++;
}
}
if(flash&Flash_**) Draw_TX16x16(Posy,Posx,hanziBuf);
else Draw_TX16x16F(Posy,Posx,hanziBuf);
Posx++;
}
}
else
{
if(Youflag==1)
{
Youflag=0;
Posx++;
}
str++;
ch2=*str;
ch16=((u16)ch1<<8)|(u16)ch2;
index=HanZiIndex(ch16);
index=index*32;//计算出真正的偏移
memcpy(hanziBuf,&hzdot[index],sizeof(hanziBuf));
if(flash&Flash_**) Draw_TX16x16(Posx,Posy,hanziBuf);
else Draw_TX16x16F(Posx,Posy,hanziBuf);
Posx++;
//Posy++;
}
}
return y;
}
|
|