天天看点

12864显示(串行控制)

        简单介绍SPI协议:

        MISO也被称作是

SIMO

DOUT

DO

SDO

SO(主机输入)

;

        MOSI也被称作是

SOMI

DIN

DI

SDI

SI

(主机输出); 

        NSS也被称作是

CE

CS

SSEL。

        SCLK也被称作是

SCK,串行时钟信号。

        SPI具有很多优点:全双工串行通信;高速数据传输速率。软件配置方便;数据传输灵活,不限于8位,它可以是任意大小的字;简单的硬件结构。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同),频率理论上可以无限快。

        言归正传,附上我们的代码;

        驱动程序

//lcd发送一个字节
void SendByte(char Dbyte)
{
    char i;
	for(i=0;i<8;i++)
	{
	    SCK=0;
		delay_us(10);
		if((Dbyte&0x80)==0x80) SID=1;
		else SID=0;
		Dbyte =Dbyte<<1;
		SCK=1;
		delay_us(10);
		SCK=0;
		delay_us(10);
	}
}
//lcd读取一个字节
unsigned char ReceiveByte(void)
{
    char i,temp1,temp2;
	temp1=0;
	temp2=0;
	for(i=0;i<8;i++)
	{
	    temp1=temp1<<1;
		SCK=0;
		delay_us(10);
		SCK=1;
		delay_us(10);
		SCK=0;
		delay_us(10);
		if(SID) temp1++;	
	}
	for(i=0;i<8;i++)
	{
	    temp2=temp2<<1;
		SCK=0;
		delay_us(10);
		SCK=1;
		delay_us(10);
		SCK=0;
		delay_us(10);
		if(SID) temp2++;	
	}
	return ((0xf0&temp1)+(0xf&temp2));
}
//写指令
void Write_Com(char Cbyte)
{
    CS = 1;
    Chk_Busy();
    SendByte(0xf8);          //11111,RW(0),RS(0),0
    SendByte(0xf0&Cbyte);
    SendByte(0xf0&Cbyte<<4);
    CS = 0;
}
//写数据
void Write_Data(char Dbyte)
{
    CS=1;
	Chk_Busy ();
	SendByte (0xfa);
	SendByte (0xf0&Dbyte);
	SendByte (0xF0&Dbyte<<4);
	CS=0;
}
//查忙
void Chk_Busy(void)
{
    do
		SendByte(0xfc);
	while(0x80&ReceiveByte());
}
//清屏
void LCD_Clear(void)
	{
		Write_Com(0x01);			
		delay_ms(2);				
	}
//初始化
void LCD_Init(void)
{
  delay_ms(50);
	RES=0;
	delay_ms(50);
	RES=1;
	delay_ms(50);
	Write_Com(0x30);
	delay_ms(50);
	Write_Com(0x30);
	delay_ms(50);
	Write_Com(0x30);
	delay_ms(50);
	Write_Com(0x03);  
	delay_ms(50);
	Write_Com(0x01);  
	delay_ms(50);
	Write_Com(0x06);
	delay_ms(50);
	Write_Com(0x0c); 
	delay_ms(50);
}
           

显示程序

uchar LCD_addr[4][8]={
	{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}		
	};
void LCD_Display_Words(uchar x,uchar y,uchar *str)
{ 
	Write_Com(LCD_addr[x][y]); 
	while(*str>0)
    { 
      Write_Data(*str);    
      str++;     
    }
}

           

//只需要在主函数调用,显示自己想显示的 ,12864自带字库直接输入汉字就行

如:

 LCD_Display_Words(1,2,"谢谢大家");

这种格式即可但是一般不停调用比较占程序内存空间,希望理解也希望大家提供更好的方法谢谢大家。

继续阅读