#include "drive_12864.h"
#include <stdarg.h>		  //  ��׼ͷ�ļ�
#include "stdio.h"
#include "delay.h"

#define L128_RW  GPIO_Pin_8 //
#define L128_EN  GPIO_Pin_9 //

#define SET_EN GPIO_SetBits(GPIOA, L128_EN);
#define CLR_EN GPIO_ResetBits(GPIOA, L128_EN);

#define SET_RW GPIO_SetBits(GPIOA, L128_RW);
#define CLR_RW GPIO_ResetBits(GPIOA, L128_RW);


void LCD128GPIO_Init(void)
{
     GPIO_InitTypeDef GPIO_InitStructure;
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//����ʱ�� 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
	   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	   GPIO_Init(GPIOA,&GPIO_InitStructure);
}


void Senbyte(unsigned char command)//��12864�����1byte����
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
     if((command<<i)&0x80)
	 {
	   SET_RW;
	 }
	 else 
	 {
	   CLR_RW;
	 }
	 CLR_EN;//sclk =0
	// delay_ms(5);
	 SET_EN;//sclk=1
  }

}

void Write_lcd_com(unsigned char command)//��12864дָ���
{
 //  SET_RW;
   Senbyte(0xf8);
   Senbyte(command&0xf0);
   Senbyte((command<<4)&0xF0);
   delay_us(100);
}

void Write_lcd_date(unsigned char date)//��12864д���ݺ���
{
//  SET_RW;
  Senbyte(0xfa);
  Senbyte(date & 0xf0);
  Senbyte((date<<4) & 0xf0);
  delay_us(100);
}
void lcd128_Init(void)//12864��ʼ������
{
	 LCD128GPIO_Init();
	 delay_ms(100);
   Write_lcd_com(0x30);//����8λ���ݿ� ����ָ��ģʽ
   delay_us(100);
   Write_lcd_com(0xc0);//������ʾ�� �α�� ���׹�
    delay_us(100);
   Write_lcd_com(0x30); //����8λ���ݽӿڣ�����ָ��ģʽ   
   Write_lcd_com(0x20);  //��DDRAM    
   Write_lcd_com(0x06);  //�α꼰��ʾ����һλ   
   Write_lcd_com(0x0c);  //������ʾ��,�α�أ����׹�   
   Write_lcd_com(0x01);  //д��ո�����    
   Write_lcd_com(0x80);  //�����״���ʾλ�� 
}

/************ д�ַ����ݺ���  *****************
���ܣ��ڴ��ֿ�12864ָ��λ������ʾ�ַ���
����
p:    ָ�����ʾ����ָ��
x:    X����
y:    Y����
************ ***********  *****************/
void WriteLcd128_String(char x,char y,char *p)
{
   switch(y)  //  ������ʾ��ַ
	{
	   case 0:Write_lcd_com(0x80 + x);  //  ��һ��
	          break;
	   case 1:Write_lcd_com(0x90 + x);  //  �ڶ���
	          break;
	   case 2:Write_lcd_com(0x88 + x);  //  ������
	          break;
	   case 3:Write_lcd_com(0x98 + x);  //  ������
	          break;
	}
	while(*p != 0)	    //  ѭ����ʾ�ַ���ֱ����⵽�����ַ�
	{
        Write_lcd_date(*p);
  //  delay(100);
		    p++;
  }
}


void L128printf(char x,char y,char *p,...)
{
	  char LcdBuff[20];
		va_list ap;
		va_start(ap,p);
		vsprintf(LcdBuff,p,ap);
		va_end(ap);
		WriteLcd128_String(x,y,LcdBuff);
}