你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103用SPI驱动12864屏  

[复制链接]
发布时间:2015-1-11 14:14
本帖最后由 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。仅供参考
有图有真相哦

IMG_20150111_151609.jpg

IMG_20150111_151622.jpg



12864屏SPI接线

12864屏SPI接线
1 收藏 14 评论56 发布时间:2015-1-11 14:14

举报

56个回答
回答时间:2015-4-15 21:56:38
michael83 发表于 2015-4-15 10:38
你好,能发一下你的打包代码吗?谢谢分享。

不好意思,当时主要是用于我的一个小项目,现在搞的比较复杂了,贴出来的主要是一些最基本的操作,用这些就可以控制比较复杂的变化。看看过些时候,我把一些简单的应用稍微总结一下,再另贴发代码吧
回答时间:2016-6-1 20:43:23
sdtazzf 发表于 2016-5-27 14:29
咨询楼主:为什么显示很慢啊?还有乱码。


要把延时缩短,我感觉比51单片机的并行口还快呢!乱码的话,不知道,我的没出现,你再试试,我现在用的屏不是金鹏的,是淘宝上的杂牌,量大的话才28一个的,效果也很好,兼容金鹏的
回答时间:2015-4-15 21:52:30
michael83 发表于 2015-4-15 10:08
谢谢。非常棒的消息。
想问,你的12864的核是st7920吗?谢啦。

是的,是ST7920的控制器,测试时是用的金鹏OCMJ4X8C,不过后来又买的杂牌的12864屏,和金鹏OCMJ4X8C完全兼容,感觉比金鹏还好用点,不过不知道是否耐用~~
黄小狼 回答时间:2015-1-11 15:02:55
楼主是好人呀,嘿嘿,我的屏也是12864,不过驱动是别人写好的
wamcncn 回答时间:2015-1-11 15:48:11
本帖最后由 wambob 于 2015-1-11 15:54 编辑

看到你的液晶焊的软线,我后悔焊插针了
焊了20个脚
回答时间:2015-1-11 15:52:16
wambob 发表于 2015-1-11 15:48
看到你的液晶焊的软线,我后悔焊插针了

,这个只能用于平时测试
kevin0129 回答时间:2015-1-11 16:01:54
我也准备用SPI驱动12864,不过我的板子是072的!
回答时间:2015-1-11 16:40:35
kevin0129 发表于 2015-1-11 16:01
我也准备用SPI驱动12864,不过我的板子是072的!

我也刚买了030的板子,过2个月也想把F1的移植到F0上面,不过固件库好像差别比较大
huaxi90 回答时间:2015-1-11 16:58:30
楼主好人,代码可以参考下,哈哈
manxueqian 回答时间:2015-1-11 17:05:24
谢谢分享!
kqh1120 回答时间:2015-1-11 17:19:18
学习了啊
大秦正声 回答时间:2015-1-11 17:57:55
不错的
discovery与nucleo库函数有区别
hal硬件抽象层函数库
abend 回答时间:2015-1-11 18:07:13
st的hall库质量堪忧,估计是印度那帮阿三搞的
caizhiwei 回答时间:2015-1-11 18:23:15
spi怎么有一个复位线?还有读数据的函数呢?
回答时间:2015-1-11 18:58:36
caizhiwei 发表于 2015-1-11 18:23
spi怎么有一个复位线?还有读数据的函数呢?

用SPI驱动12864,不需要复位线,也基本不需要读取忙的状态,个别地方只要加入短暂的延时就行了。我只接了4根线:5V、0V、STD、SCLK。
yceast 回答时间:2015-1-11 21:47:56
谢谢分享
caizhiwei 回答时间:2015-1-11 21:48:37
两线的SPI 可能是省掉了CS,高明啊,,!
你的17引脚RST没有连接,对吧?
1234下一页

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版