我用AVR硬件SPI,给你参考一下‘。我用过几款串行LCD,虽然控制器不一样,但指令都是一样的,只是延时稍有不同,改一下就能移植过来,而且都能正常显示。
//数据线定义:
// SI==========MOSI // 十四脚
// A0==========PB0 //第四脚
// CS==========PB2//第二脚
// RES=========PB1 //第三脚
// SCL=========SCK //十三脚
/////////////////////////////////////////
///////////////////////////////
//发送一个字节到ST7565P并等待发送完毕
//入口:要发送的字节
//返回值:无
////////////////////////////////
void SPIByte(unsigned char byte)
{
SPDR = byte; //写数据
while(!(SPSR & (1<<SPIF))); //等待发送完成
}
////////////////////////////////////////////////
//将一个字节发送的ST7565P的函数
//入口参数: select ,data
//select:根据此值确定发送给ST7565P的是数据还是命令
//data: 要发送给ST7565的一个字节
//返回值:无
////////////////////////////////////////////////
void LCD_SPISend(unsigned char select,unsigned char data)
{
PORTB &= ~(1<<2); // CS=0 芯片使能信号
if(select == COMMAND) //传输的是命令
{
PORTB &= ~(1<<0); // 根据ST7565P的数据手册,传输命令时A0应该是为低电平
SPIByte(data);
PORTB |= 1<<0; // A0=1
}
else
{
SPIByte(data);
}
PORTB |= 1<<2; //CS= 恢复不使能
}
////////////////////////////////////////////
//写坐标函数
//入口参数:x y
//y: 页面地址,此液晶将显示区域分为9个页面,y的值域0~8
//x: 列地址,值域:0~127
//返回值:无
////////////////////////////////////////////
void LCD_XYSet(unsigned char x,unsigned char y)
{
LCD_SPISend(COMMAND,0xB0|y); //y的值为0~8
LCD_SPISend(COMMAND,0x10|(x>>4));
LCD_SPISend(COMMAND,0x00|(x&0x0F));
}
void LCD_Init(void)
{
SPCR = 0x5C;
SPSR |= 1<<SPI2X;
//SPI的功能设置解释:使能SPI;采用主机模式;SPI的传输模式为模式3;时钟频率为系统时钟的两分频
_delay_us(1);
SPIByte(0xFF); //可发可不发,无意义
PORTB &= ~(1<<1); //将复位脚拉低
_delay_ms(5); //延时5ms,等待电源稳定
PORTB |= 1<<1; //将复位脚拉高
_delay_ms(5);
LCD_SPISend(COMMAND,0xAE); //将液晶屏的显示关掉
LCD_SPISend(COMMAND,0xA3); //设置偏压比
LCD_SPISend(COMMAND,0xA0); //设置SEG 输出方向
LCD_SPISend(COMMAND,0xC8); //设置公共端输出扫描方向
LCD_SPISend(COMMAND,0x25); //调整 (1 + Rb/Ra) ratio 值,调整此值影响很大
LCD_SPISend(COMMAND,0x81); //开始设置α的命令
LCD_SPISend(COMMAND,0x0c); //设置α的值,值越大对比度越强,调整此值影响不太,是
//微调的
_delay_ms(5);
LCD_SPISend(COMMAND,0x2F); //开启相关电压
_delay_ms(5);
LCD_SPISend(COMMAND,0xAF); //显示开
LCD_SPISend(COMMAND,0xF8);
LCD_SPISend(COMMAND,0x01); //设置升压比
_delay_ms(10); //延时
}
////////////////////////////////////////
//清屏函数
//入口:无
//返回值:无
///////////////////////////////////////
void Clear_Display(void)
{
unsigned char i;
unsigned char j;
for(i=0;i<8;i++)
{
LCD_XYSet(0,i);
for(j=0;j<128;j++)
{
LCD_SPISend(DATA,0); //传输数据
}
}
} |