OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6974|回复: 14

STM32驱动12864的问题,求大神解答!

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-11-5
在线时间
0 小时
发表于 2012-11-29 19:39:16 | 显示全部楼层 |阅读模式

贴出C文件和H文件,用原子的库写的,参考的51的写法,已经折腾2天了,还是显示不了,求大神帮帮忙!
在线等解答。。。。。。拜托了。。。

12864.h
#ifndef __12864_H
#define __12864_H
#include "sys.h"
#define rs  PBout(3)
#define rw  PBout(4) 
#define e   PBout(5)
#define psb PBout(6)
#define rest PBout(7)

#define DATAOUT(x) GPIOD->ODR=(GPIOD->ODR&0XFF00)|(x&0x00ff)//数据输出
void display(void);
void GPIOD_Init(void);
void write_com(u8 com) ;
void write_data(u8 date);
void init(void);    
#endif

/*************************************************************************************/
12864.c

#include <stm32f10x_lib.h>
#include "usart.h"
#include "12864.h"
#include "delay.h"
#include "sys.h"
u8 table[]={"测试"};
void GPIOD_Init(void)
{
  RCC->APB2ENR|=1<<3;     //B时钟
  RCC->APB2ENR|=1<<5;  //D时钟
                 
  GPIOD->CRL&=0X00000000;
  GPIOD->CRL|=0X33333333;//D0-7推挽输出 数据口
  GPIOD->ODR|=0X0000FFFF
 
  GPIOB->CRL&=0X00000FFF;
  GPIOB->CRL|=0X33333000;
  GPIOB->ODR|=1<<3;
  GPIOB->ODR|=1<<4; 
  GPIOB->ODR|=1<<5;  
  GPIOB->ODR|=1<<6;
  GPIOB->ODR|=1<<7;   
}
void write_com(u8 com)
{
  rw=0;
  rs=0;
  e=0;
  delay_ms(2);
  DATAOUT(com);
  delay_ms(2);
  e=1;
  delay_ms(2);
  e=0; 
}
void write_data(u8 date)
{
   rw=0;
   rs=1;
   e=0;
   DATAOUT(date);
   delay_ms(5);
   e=1;
   delay_ms(5);
   e=0;
}
void init()
{
   psb=1;
   rest=0;
   delay_ms(2);
   rest=1;
  
   delay_ms(5);
   write_com(0x30);
   delay_ms(5);
   write_com(0x0C);
   delay_ms(5);
   write_com(0x01);
   delay_ms(5);
}
int main(void)

 u8 i=0;
  Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
 uart_init(72,9600); //串口1初始化
 GPIOD_Init();
 init();
 write_com(0x80) ; 
 write_data('Z');

 while(1);
}

在线等解答~~~~~~~~~~~~~~

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-11-5
在线时间
0 小时
 楼主| 发表于 2012-11-29 20:38:44 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-29 21:38:13 | 显示全部楼层
这东西我也没用STM32驱动过呢。
看你的IO设置,没问题。
有没有可能你的12864没有正常工作(比如电压?对比度设置?)?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-11-5
在线时间
0 小时
 楼主| 发表于 2012-11-29 23:11:26 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
专门买的3.3V供电的12864, 买回来测试的时候,用的51的IO口,12864供电3.3V ,和51的5V共地驱动成功了,屏应该没有啥问题,好纠结,现在还在调试中。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-29 23:55:08 | 显示全部楼层
加油!
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-11-5
在线时间
0 小时
 楼主| 发表于 2012-11-30 15:13:09 | 显示全部楼层

12864 驱动成功啦!主要把H文件修改了,没有用Pxout,直接对寄存器操作的。贴上来给需要的同学。提倡开源。共同进步!
12864.h
#ifndef __12864_H
#define __12864_H
#include "sys.h"
//#define rs   PBout(3)
//#define rw   PBout(4) 
////#define e    PBout(5)
//#define psb  PBout(6)
//#define rest PBout(7)
#define RS_H GPIOE->ODR|=1<<0
#define RS_L GPIOE->ODR&=~(1<<0)
#define RW_H GPIOE->ODR|=1<<1
#define RW_L GPIOE->ODR&=~(1<<1)
#define EN_H GPIOE->ODR|=1<<2
#define EN_L GPIOE->ODR&=~(1<<2)
#define PSB_H GPIOE->ODR|=1<<3
#define PSB_L  GPIOE->ODR&=~(1<<3)
#define RST_H GPIOE->ODR|=1<<4
#define RST_L GPIOE->ODR&=~(1<<4)
#define DATAOUT(x) GPIOD->ODR=(GPIOD->ODR&0XFF00)|(x&0x00ff)//数据输出
void display(void);
void IO_Init(void);
void write_com(u8 com);
void write_data(u8 date);
void init(void);    
#endif
/****************************************************************/
12864.c

#include <stm32f10x_lib.h>
#include "usart.h"
#include "12864.h"
#include "delay.h"
#include "sys.h"
u8 table[]={"STM32 串口测试"};
void IO_Init(void)
{
 RCC->APB2ENR|=1<<5;     //D时钟
 RCC->APB2ENR|=1<<6;  //E时钟                
 GPIOD->CRL&=0X00000000;
 GPIOD->CRL|=0X33333333; //D0-7推挽输出 数据口
 GPIOD->ODR|=0X0000FFFF;
 GPIOE->CRL&=0XFF000000; //E3-E7 推挽输出 RS RW EN PSB RSET
 GPIOE->CRL|=0XFF333333;
 GPIOE->ODR|=0XFF000000;  
}
void write_com(u8 com)
{
  RW_L;
  RS_L;
  EN_L;
  delay_ms(1);
  DATAOUT(com);
  delay_ms(1);
  EN_H;
  delay_ms(1);
  EN_L; 
}
void write_data(u8 date)
{
   RW_L;
   RS_H;
   EN_L;
   DATAOUT(date);
   USART1->DR=GPIOD->ODR;
   delay_ms(1);
   EN_H;
   delay_ms(1);
   EN_L;
}
void init()
{
   PSB_H;
   RST_L;
   delay_ms(1);
   RST_H;
   delay_ms(1);
   write_com(0x30);
   delay_ms(1);
   write_com(0x0C);
   delay_ms(1);
   write_com(0x01);
   delay_ms(1);
}
void display(void)
{
 u8 i;
 write_com(0x80);
 for(i=0;i<14;i++)
 {
 write_data(table);
 } 
}

/********************************************************/
main.c
#include <stm32f10x_lib.h>
#include "usart.h"
#include "12864.h"
#include "delay.h"
#include "sys.h"
int main(void)

   Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
 uart_init(72,9600); //串口1初始化
 IO_Init();
 init();
 write_com(0x01);
 display();
 while(1);
}
直接贴上去就可以显示的。


 

回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-11-5
在线时间
0 小时
 楼主| 发表于 2012-11-30 15:14:54 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
我觉得Pxout和直接对寄存器操作应该没有区别吧?还是有点不解。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-30 20:27:54 | 显示全部楼层
回复【6楼】STM32_郭:
---------------------------------
谢谢分享。
回复【7楼】STM32_郭:
---------------------------------
没问题啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-10-16
在线时间
1 小时
发表于 2012-11-30 23:05:44 | 显示全部楼层
回复【7楼】STM32_郭:
---------------------------------
你用的PB  里面有几个JTAG是共用的 一上电默认是JTAG模式!
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-5-12
在线时间
0 小时
发表于 2013-5-15 21:23:21 | 显示全部楼层
不用判忙吗?而且ODR前十六为是保留啊。只能操作后十六为啊。。。
大家好
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-2-19
在线时间
1 小时
发表于 2013-5-15 22:34:16 | 显示全部楼层
不错!顶一个!
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-5-12
在线时间
0 小时
发表于 2013-5-16 11:05:02 | 显示全部楼层
#include <stm32f10x_lib.h>
 #include "usart.h"
 #include "lcd_12864.h"
 #include "delay.h"
 #include "sys.h"
 u8 table[]={"STM32 串口测试"};
 void IO_Init(void)
 {
  RCC->APB2ENR|=1<<2;     //D时钟 
 RCC->APB2ENR|=1<<3;  //E时钟                 
  GPIOB->CRH&=0X00000000;
   GPIOB->CRH|=0X33333333; //D0-7推挽输出 数据口
   GPIOB->ODR|=0XFF00;
  GPIOE->CRL&=0X0000FFFF; //E3-E7 推挽输出 RS RW EN SB RSET
  GPIOE->CRL|=0X33330000;
  GPIOE->ODR|=0X00F0;   
}
 void write_com(u8 com)
 { 
  RW_L;
   RS_L;
   EN_L;
   delay_ms(1);
   DATAOUT(com);
   delay_ms(1);
   EN_H;
   delay_ms(1);
   EN_L;  
}
 void write_data(u8 date)
 { 
   RW_L;
    RS_H;
    EN_L;
    DATAOUT(date);
    USART1->DR= GPIOB->ODR;
    delay_ms(1); 
   EN_H;
    delay_ms(1); 
   EN_L;
 }
 void init()
 { 
    delay_ms(1);
    write_com(0x30);
    delay_ms(1);
    write_com(0x0C);
    delay_ms(1);
    write_com(0x01);
    delay_ms(1);
 }
 void display(void)
 {
  u8 i;
  write_com(0x80);
  for(i=0;i<14;i++)
  {
  write_data(table);
  } 
 }

#ifndef __12864_H
#define __12864_H
#include "sys.h"
//#define rs   Bout(3)
//#define rw   Bout(4) 
//#define e    Bout(5)
//#define psb  Bout(6)
//#define rest Bout(7)
#define RS_H GPIOA->ODR|=1<<4
#define RS_L GPIOA->ODR&=~(1<<4)
#define RW_H GPIOA->ODR|=1<<5
#define RW_L GPIOA->ODR&=~(1<<5)
#define EN_H GPIOA->ODR|=1<<6
#define EN_L GPIOA->ODR&=~(1<<6)
#define SB_H GPIOA->ODR|=1<<7
#define SB_L  GPIOA->ODR&=~(1<<7)
#define DATAOUT(x)  GPIOB->ODR=( GPIOB->ODR&0X00FF)|(x<<8)//数据输出
void display(void);
void IO_Init(void);
void write_com(u8 com);
void write_data(u8 date);
void init(void);     
#endif
哪里兄弟帮忙看下有错
大家好
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-3
在线时间
3 小时
发表于 2014-4-4 18:05:06 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2014-5-5 16:59:43 | 显示全部楼层
不错 谢谢分享
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-9-3
在线时间
0 小时
发表于 2015-2-25 10:42:01 | 显示全部楼层
谢谢分享,已测试能用
不能用的小伙伴可以将PE5的RST拔掉,按楼主的方法接线没显示纠结了一会,阴差阳错拔了RST的线就有显示了
准备和24L01程序合并,能看到这么清晰方法写的程序真的太感谢了。
教程的那种写法太复杂了,还是楼主的好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表