OpenEdv-开源电子网

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

STM32驱动12864显示问题

[复制链接]

15

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-4-17
在线时间
4 小时
发表于 2014-5-9 09:48:54 | 显示全部楼层 |阅读模式
5金钱
不知道哪里出错了,总是显示不出来,求救啊,弄了2天了。。

#ifndef __12864_H
#define __12864_H  
#include "sys.h"

#define DB0 PBout(8)
#define DB1 PBout(9)
#define DB2 PBout(10)
#define DB3 PBout(11)
#define DB4 PBout(12)
#define DB5 PBout(13)
#define DB6 PBout(14)
#define DB7 PBout(15)

#define RS PAout(2)
#define RW PAout(3)
#define EN  Aout(4)
#define PSB PAout(5)

#define RS_H RS=1
#define RS_L RS=0
#define RW_H RW=1
#define RW_L RW=0
#define EN_H EN=1
#define EN_L EN=0
#define PSB_H PSB=1
#define PSB_L PSB=0


#define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0X00FF)|(x&0xFF00)

void GPIOX_init(void);//初始化
void display(void);
void write_com(u8 com);
void write_data(u8 date);
void init(void);    
#endif 



#include <stm32f10x_lib.h>
#include "usart.h"
#include "12864.h"
#include "delay.h"
#include "sys.h"
u8 table[]={"测试"};

void GPIOX_init(void)
{
  RCC->APB2ENR|=1<<2;     //A时钟 
  RCC->APB2ENR|=1<<3;     //B时钟
                
  GPIOB->CRH&=0X00000000;   
  GPIOB->CRH|=0X33333333;   //B8-B15推挽输出 数据口
  GPIOB->ODR|=1<<8;
  GPIOB->ODR|=1<<9;
  GPIOB->ODR|=1<<10;
  GPIOB->ODR|=1<<11;
  GPIOB->ODR|=1<<12;
  GPIOB->ODR|=1<<13;
  GPIOB->ODR|=1<<14;
  GPIOB->ODR|=1<<15;
 
  GPIOA->CRL&=0XFF0000FF; // A2-A5设置为推挽输出
  GPIOA->CRL|=0X00333300;  
  GPIOA->ODR|=1<<2;
  GPIOA->ODR|=1<<3;
  GPIOA->ODR|=1<<4;
  GPIOA->ODR|=1<<5;

}

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);
   delay_ms(1); 
   EN_H;
   delay_ms(1); 
   EN_L;
}

void init()

PSB_H;
delay_ms(1);
write_com(0x30); //30--基本指令动作
    delay_ms(5);
    write_com(0x0c); //光标右移画面不动
    delay_ms(5);
    write_com(0x01); //清屏
    delay_ms(5); //清屏时间较长
    write_com(0x06); //显示打开,光标开,反白关
    delay_ms(5);
}
void display(void)
{
 u8 i;
 write_com(0x80);
 for(i=0;i<14;i++)
 {
 write_data(table);
 } 
}


#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初始化 
GPIOX_init();
init();
write_com(0x01);
display();
delay_ms(500);




最佳答案

查看完整内容[请看2#楼]

回复【6楼】nba501287927: --------------------------------- 其实用PB口的高8位也是可以的,只是你要将这个X要左移八位 #define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0X00FF)|((u16)(x<<8)&0xFF00) 因为你的写指令函数(write_com(u8 com))和写数据函数(write_data(u8 com)) 里的形参是用了u8型的参数 所以你当然得不得高8位的数据了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2014-5-9 09:48:55 | 显示全部楼层
回复【6楼】nba501287927:
---------------------------------
其实用PB口的高8位也是可以的,只是你要将这个X要左移八位
#define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0X00FF)|((u16)(x<<8)&0xFF00)
因为你的写指令函数(write_com(u8 com))和写数据函数(write_data(u8 com)) 里的形参是用了u8型的参数
所以你当然得不得高8位的数据了
天道酬勤
回复

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2014-5-9 10:55:48 | 显示全部楼层
为什么你的程序没有while(1)?
回复

使用道具 举报

15

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-4-17
在线时间
4 小时
 楼主| 发表于 2014-5-9 11:02:30 | 显示全部楼层
回复【2楼】zhp:
---------------------------------
谢谢你的回答,我循环了,还是不行。
回复

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2014-5-9 11:34:27 | 显示全部楼层
#define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0X00FF)|((uint16)(x<<8)&0xFF00)

另外,写数据、写指令函数最好按照数据手册来写,先配置读写指令还是数据,再使能,延时,再送数据

回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-9 12:30:45 | 显示全部楼层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

15

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-4-17
在线时间
4 小时
 楼主| 发表于 2014-5-9 13:04:17 | 显示全部楼层
谢谢你们的热情回答, 我找到问题了,我把数据口换到 C0-C7端口就好了。。。


#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<<2;     //S时钟 
RCC->APB2ENR|=1<<3;     
RCC->APB2ENR|=1<<4;
               
GPIOC->CRL&=0X00000000;
GPIOC->CRL|=0X33333333; //D0-7推挽输出 数据口

GPIOC->ODR|=1<<0;
GPIOC->ODR|=1<<1;
GPIOC->ODR|=1<<2;
GPIOC->ODR|=1<<3;
GPIOC->ODR|=1<<4;
GPIOC->ODR|=1<<5;
GPIOC->ODR|=1<<6;
GPIOC->ODR|=1<<7;

GPIOA->CRL&=0XFF0000FF; // A2-A5设置为推挽输出
GPIOA->CRL|=0X00333300;  
GPIOA->ODR|=1<<2;
GPIOA->ODR|=1<<3;
GPIOA->ODR|=1<<4;
GPIOA->ODR|=1<<5; 
}
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);
  
   delay_ms(1); 
   EN_H;
   delay_ms(1); 
   EN_L;
}
void init()

 //  SB_H;   
   delay_ms(1);
   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<16;i++)
 {
 write_data(table);
 } 
}
回复

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
发表于 2014-5-9 14:25:05 | 显示全部楼层
为什么换到C0-C7就好了??
回复

使用道具 举报

15

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-4-17
在线时间
4 小时
 楼主| 发表于 2014-5-9 18:39:52 | 显示全部楼层
回复【8楼】xly0907:
---------------------------------
太感谢了你了。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 02:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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