
本帖最后由 xnmc2013 于 2015-4-20 21:58 编辑 以前用51时,驱动12864屏用并口,但是感觉显示速度还是挺慢,现在用STM32F103ZE的SPI驱动,感觉还很快,而且很稳定。我试了金鹏OCMJ4*8C的,还试了刚买的一个杂牌的12864屏,显示都蛮快蛮好。我是用的V2版库文件,这里面关键是设置好SPI的一些参数,我都标住了中文解释。具体其他一些IO等的设置这里就不具体讲了,大家应该都会的哦~~好了,下面附上我的一部分代码供大家参考: void SPI_Configuration(void) { SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主设备 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //位数据一帧 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //时钟级性 SCK空闲时为1 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据采样从第2个时钟边沿开始 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //波特率控制 fclk/4 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //先发送MSB SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); } void LCD_wr(u8 lcd_com,u8 lcd_data) //写入LCD数据或命令 { u8 lcd_data_msb,lcd_data_lsb; lcd_data_msb=0xf0&lcd_data; lcd_data_lsb=(0x0f&lcd_data)<<4; if(lcd_com==0) //写命令 { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 发送缓冲空 SPI_I2S_SendData(SPI1, 0xf8); // SPI1 发送数据--命令指令-- } if(lcd_com==1) //写数据 { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 发送缓冲空 SPI_I2S_SendData(SPI1, 0xfa); //SPI1 发送数据--数据指令-- } delay(100); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //等待 SPI1 接收数据完毕 SPI_I2S_SendData(SPI1, lcd_data_msb); //SPI1 发送高4位数据 delay(100); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); //Wait for SPI1 Tx buffer empty SPI_I2S_SendData(SPI1, lcd_data_lsb); // SPI1 发送低4位数据 delay(100); } void initlcd(void) //LCD初始化 { LCD_wr(0,0x30); //30---基本指令动作 delay (100); LCD_wr(0,0x01); //清屏,地址指针指向00H delay (100); LCD_wr(0,0x06); //光标的移动方向 delay (100); LCD_wr(0,0x0c); //开显示,关游标 delay (100); } void delay (u16 ms) { u16 i,j; for(i=0;i<ms;i++) for(j=0;j<100;j++) {;} } void lcddisp(u8 *chn) { u8 i,j; LCD_wr(0,0x30); delay (100); LCD_wr(0,0x80); delay (100); for (j=0;j<4;j++) { for (i=0;i<16;i++) LCD_wr(1,chn[j*16+i]); delay (100); } } 希望能帮助需要用到的人哦,我也是花了很长时间才搞好的 ![]() 可能有的人不会接线,我上传下我的接线,这里片选直接接了VCC,数据线只接了时钟-R/W和数据命令发送-E。就是图中的STD和SCLK。仅供参考 有图有真相哦 ![]() ![]() |
12864å±SPIæ¥çº¿
不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
看到你的液晶焊的软线,我后悔焊插针了
焊了20个脚
我也刚买了030的板子,过2个月也想把F1的移植到F0上面,不过固件库好像差别比较大
discovery与nucleo库函数有区别
hal硬件抽象层函数库
用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
你的17引脚RST没有连接,对吧?