#include"stm32f10x_lib.h"
#include"12864.h"
#include"delay.h"
//#include"front.h"
u8addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};
voidGPIO_12864_Init(void)//12864管脚接口初始化
{
RCC->APB2ENR|=1<<3;//开启B时钟
RCC->APB2ENR|=1<<6;//开启E时钟
GPIOB->CRL&;=0XFFFFF000;
GPIOB->CRL|=0X00000333;
GPIOB->ODR|=7<0;//上拉输出
GPIOE->CRH&;=0X00000000;
GPIOE->CRH|=0X33333333;
GPIOE->ODR|=0XFF00;//上拉输出
}
voidGPIO_12864_Read(void)//设置为输入
{
RCC->APB2ENR|=1<<6;//开启E时钟
GPIOE->CRH&;=0X00000000;
GPIOE->CRH|=0X88888888;
GPIOE->ODR|=0XFF00;//上拉输出
}
voidGPIO_12864_Write(void)//设置输出
{
RCC->APB2ENR|=1<<6;//开启E时钟
GPIOE->CRH&;=0X00000000;
GPIOE->CRH|=0X33333333;
GPIOE->ODR|=0XFF00;//上拉输出
}
voidCheck_12864_Busy(void)//读忙碌状态
{
u8flag=0;
GPIO_12864_Read();
RS=0;
RW=1;
while(flag==0)
{
delay_us(5);
CE=1;
delay_us(5);
if(DATAIN_12864&;0X80)flag=0;
elseflag=1;
delay_us(5);
CE=0;
delay_us(5);
}
GPIO_12864_Write();
}
voidWrite_12864_Data(u8data)//写数据
{
Check_12864_Busy();
RS=1;
RW=0;
delay_us(5);
CE=1;
DATAOUT_12864(data);
delay_us(5);
CE=0;
}
u8Read_12864_Data(void)//读数据
{
u8data;
Check_12864_Busy();
GPIO_12864_Read();
RS=1;
RW=1;
CE=1;
delay_us(10);
data=DATAIN_12864;
CE=0;
GPIO_12864_Write();
return(data);
}
voidWrite_12864_Com(u8commod)//写指令
{
Check_12864_Busy();
RS=0;
RW=0;
delay_us(5);
CE=1;
DATAOUT_12864(commod);
delay_us(5);
CE=0;
}
voidLCD_12864_Init(void)//液晶初始化
{
Write_12864_Com(basic_commod);//30H--基本指令操作
//delay_ms(1);
Write_12864_Com(cursor_off);//0x06开显示,关光标,不闪烁。扩展
//delay_ms(1);
Write_12864_Com(clear);//清除显示0x01
//delay_ms(20);
Write_12864_Com(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。
}
voidWrite_12864_String(u8*str)//写入字符串或者汉字
{
u8*p;
p=str;
while(*p!=0)
{
Write_12864_Data(*p);
p=++str;
//delay_ms(10);
}
}
/*****指定位置显示汉字*****/
voidhanzi_Disp(u8x,u8y,u8*s)
{
Write_12864_Com(addr_tab[8*x+y]);//写地址
while(*s>0)
{
Write_12864_Data(*s);//写数据
s++;
}
}
/*****指定位置显示数字,最大为65536*****/
voidnum_Disp(u8x,u8y,u16number)
{
u16i=10000;
Write_12864_Com(addr_tab[8*x+y]);//写地址
while(number/i==0)
{
i/=10;
}
if(i!=1)
{
while(number/i!=0)
{
Write_12864_Data(number/i+0x30);
number-=(number/i)*i;
i/=10;
if(i==1)break;
}
}
Write_12864_Data(number%10+0x30);
}
/*画图方式为从左到右扫描,从上到下,每写一个字节后行地址加一,每写玩16个字节,即128个点(如果半屏显示8个字节,64个点)列地址加一*/
//点阵取点方式为从左到右,从上到下,高位在前,低为在后
voidPHO_DISP(constunsignedchar*s)
{
u8COUNT3=0X02,COUNT1,COUNT2,LCD_X=0X80,LCD_Y;
for(;COUNT3!=0;COUNT3--)
{
LCD_Y=0X80;//上半屏
COUNT2=0X20;//32
for(;COUNT2!=0;COUNT2--)
{
//COUNT1=0X10;//8个16*16点阵单