虽然控制器不一样,但指令都是一样的,只是延时稍有 ... |
E需要脉衝信號 |
zhou961291176 发表于 2015-8-3 10:48 ![]() |
我用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); //传输数据 } } } |