OpenEdv-开源电子网

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

最近搞一个STM32F107控制QC12864显示的项目,并行传输,已经编译通过了,但是始终显示不出来,代码如下,求大神帮忙看一下,程序哪里有问题,万分感激。。。在线等

[复制链接]

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
发表于 2015-5-26 15:36:07 | 显示全部楼层 |阅读模式
5金钱

/***********************************************************************
文件名称:QC12864.c
功    能:
编写时间:
编 写 人:
注    意:
***********************************************************************/
#include "stm32f10x.h"
//#include "SCI.H"
#include <includes.h> 
//**********************************************************
//连线表: RS->D8,R/W->D9,E->D10,PSB->D11,/RET->D12,(DB0~DB7->E8~PE15)
//**********************************************************
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int

/***********************************************************************
函数名称:QC12864_Configuration(void)
功    能:完成QC12864的配置
输入参数:
输出参数:
编写时间:
编 写 人:
注    意:
***********************************************************************/

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;                  //定义结构
/* Enable the GPIO_KEY Clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE , ENABLE);  //使能端口时钟 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //输出速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //模式选择 推挽输出 
GPIO_Init(GPIOE, &GPIO_InitStructure);              //设置IO
//GPIO_Write(GPIOE ,0xffff);

//GPIO_InitTypeDef GPIO_InitStructure;                  //定义结构
/* Enable the GPIO_KEY Clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE);  //使能端口时钟 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //输出速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //模式选择  推挽输出 
GPIO_Init(GPIOD, &GPIO_InitStructure);              //设置IO
//GPIO_Write(GPIOD ,0xffff);
}
//延时函数:
void delays(unsigned char x); 
void delays(unsigned char x)
{
while(x--);
}
//读忙状态

 void rdbf(); 
 void rdbf()
  {
u16 RData;
u16 ReadValue_Bus=0x0080;
    while(1)
  {
loop: GPIO_ResetBits(GPIOD,GPIO_Pin_8);     //RS=0 
GPIO_SetBits(GPIOD,GPIO_Pin_9);       //RW=1;
GPIO_ResetBits(GPIOD,GPIO_Pin_10);    //E=0;
GPIO_SetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);  //LCDdata=0xFF;
delays(10);
GPIO_SetBits(GPIOD,GPIO_Pin_10);       //E=1;
       RData=GPIO_ReadOutputData(GPIOE);      //这句先入这,如若不行,便放有E=1,上面那一行
if((RData&ReadValue_Bus)==0)  
  break;
else
goto loop;
  }
  }

//写数据
void wr_data(uchar wrdata);
void wr_data(uchar wrdata)
{
rdbf();
GPIO_SetBits(GPIOD,GPIO_Pin_8);          //RS=1;
GPIO_ResetBits(GPIOD,GPIO_Pin_9);        //RW=0;
GPIO_SetBits(GPIOD,GPIO_Pin_10);         //E=1;
//LCDdata=wrdata;
  if(wrdata&0x80)
GPIO_SetBits(GPIOE,GPIO_Pin_15);       //
else
GPIO_ResetBits(GPIOE, GPIO_Pin_15);
if(wrdata&0x40)
GPIO_SetBits(GPIOE,GPIO_Pin_14);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_14);
if(wrdata&0x20)
 GPIO_SetBits(GPIOE,GPIO_Pin_13);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_13);
if(wrdata&0x10)
GPIO_SetBits(GPIOE,GPIO_Pin_12);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_12);
if(wrdata&0x08)
GPIO_SetBits(GPIOE,GPIO_Pin_11);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_11);
if(wrdata&0x04)
GPIO_SetBits(GPIOE,GPIO_Pin_10);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_10);
if(wrdata&0x02)
GPIO_SetBits(GPIOE,GPIO_Pin_9);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_9);
if(wrdata&0x01)
GPIO_SetBits(GPIOE,GPIO_Pin_8);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_10);        //E=0;
}
//写指令
void wr_cmd(uchar cmd,uchar busys);
void wr_cmd(uchar cmd,uchar busys)
{
  if(busys)
 rdbf(); //当BF=0时,模块内部方可接收新的指令
GPIO_ResetBits(GPIOD,GPIO_Pin_8);        //RS=0;
GPIO_ResetBits(GPIOD,GPIO_Pin_9);        //RW=0;
GPIO_SetBits(GPIOD,GPIO_Pin_10);          //E=1;
//LCDdata=cmd;
  if(cmd&0x80)
 GPIO_SetBits(GPIOE,GPIO_Pin_15);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_15);
if(cmd&0x40)
GPIO_SetBits(GPIOE,GPIO_Pin_14);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_14);
if(cmd&0x20)
GPIO_SetBits(GPIOE,GPIO_Pin_13);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_13);
if(cmd&0x10)
GPIO_SetBits(GPIOE,GPIO_Pin_12);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_12);
if(cmd&0x08)
GPIO_SetBits(GPIOE,GPIO_Pin_11);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_11);
if(cmd&0x04)
GPIO_SetBits(GPIOE,GPIO_Pin_10);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_10);
if(cmd&0x02)
GPIO_SetBits(GPIOE,GPIO_Pin_9);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_9);
if(cmd&0x01)
GPIO_SetBits(GPIOE,GPIO_Pin_8);
else
GPIO_ResetBits(GPIOE, GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_10);        //E=0;
}
//确定行、列号,并显示数据
void display(uchar x,uchar y,uchar *seg);
void display(uchar x,uchar y,uchar *seg) //x为行号,y为列号
{
uchar i;
uint t=0;
switch(x)                //确定行号
{
case 1: i=0x80; break;        //第一行
case 2: i=0x90; break;        //第二行
case 3: i=0x88; break;        //第三行
case 4: i=0x98; break;        //第四行
default : break;
}
i=x+y;
wr_cmd(i,1);                       //确定列号
while(seg[t]!='\0')
{
wr_data(seg[t]);                    //写入需要显示字符的显示码
t++;
}
}

//Lcd写数据初始化
void lcd_init(void)
{
delays(5000000);
GPIO_SetBits(GPIOD,GPIO_Pin_12);       //RST=1;      复位脚       
GPIO_ResetBits(GPIOD,GPIO_Pin_12);     //RST=0;      低电平复位
GPIO_SetBits(GPIOD,GPIO_Pin_12);       //RST=1;
wr_cmd(0x30,0);
delays(50000);
wr_cmd(0x30,0); //2次功能模式设置,不用判忙(基本指令)
delays(50000);
wr_cmd(0x0c,1); //整体显示,光标及其设置不显示
delays(50000);
wr_cmd(0x01,1); //清屏
delays(50000);
delays(50000);
wr_cmd(0x06,1); //光标右移
delays(50000);
}
//读数据
uchar read_data(void);
uchar read_data(void)
{
u8 RData;
u16 RData_32b;
GPIO_SetBits(GPIOE,GPIO_Pin_8);  //LCDdata=0xff;
GPIO_SetBits(GPIOE,GPIO_Pin_9);
GPIO_SetBits(GPIOE,GPIO_Pin_10);
GPIO_SetBits(GPIOE,GPIO_Pin_11);
GPIO_SetBits(GPIOE,GPIO_Pin_12);
GPIO_SetBits(GPIOE,GPIO_Pin_13);
GPIO_SetBits(GPIOE,GPIO_Pin_14);
GPIO_SetBits(GPIOE,GPIO_Pin_15);
rdbf();
GPIO_SetBits(GPIOD,GPIO_Pin_8);    //RS=1;
GPIO_SetBits(GPIOD,GPIO_Pin_9);    //RW=1;
GPIO_ResetBits(GPIOD,GPIO_Pin_10);  //E=0;
GPIO_SetBits(GPIOD,GPIO_Pin_10);    //E=1;

RData_32b=GPIO_ReadOutputData(GPIOE);
RData=(u8)(RData_32b&0x00FF);      
return RData;
}

//GDRAM初始化
void clr_GDRAM(void)          //行列扫描
{
uchar x,y;
for(y=0;y<64;y++)
    for(x=0;x<16;x++)
    {
wr_cmd(0x34,1);
            wr_cmd(y+0x80,1);     //行地址  
            wr_cmd(x+0x80,1);     //列地址  
            wr_cmd(0x30,1);
            wr_data(0x00);
            wr_data(0x00);
        }
}

/**************************************************************************************
*主函数说明
*显示数据(每行最多显示8个汉字,或16个字符)
**************************************************************************************/
void qc12864_dis(void)
{
uchar  string_1[]="你好";
    uchar string_2[]="0123456789";
lcd_init();
display(1,1,string_1);
display(3,1,string_2);
}  

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

使用道具 举报

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
 楼主| 发表于 2015-5-26 21:49:07 | 显示全部楼层
哪位大神救一下急,帮小弟一把。实在是着急的不行了,搞了好几天了。。。。
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-5-26 22:35:57 | 显示全部楼层
没搞过,帮顶
回复

使用道具 举报

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
 楼主| 发表于 2015-5-27 11:50:02 | 显示全部楼层
回复【3楼】lycreturn:
---------------------------------
谢了,怎么没人回复一下,实是急坏我了。这几天天加班,也没搞出来。高手快出来吧。。。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-5-27 12:03:05 | 显示全部楼层
这个别人怎么帮你,你先用屏幕例程测试通过,保证硬件没有问题后,再根据例程一步步改,你一下上传一个编译通过的程序,别人怎么下手
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
 楼主| 发表于 2015-5-27 12:13:19 | 显示全部楼层
回复【5楼】龙之谷:
---------------------------------
屏目硬件肯定没有问题,前两年有同事同样的硬件已经做出来了,现在这个项目程序需要改一下,我现在写了个这个简单的程序,但始终就是显不出来。
回复

使用道具 举报

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
 楼主| 发表于 2015-5-27 12:15:05 | 显示全部楼层
回复【6楼】cc57822:
---------------------------------
之前是同样的主板样件和屏目,连接方法都一样。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-5-27 12:33:46 | 显示全部楼层
回复【6楼】cc57822:
---------------------------------
重点在于你先用屏幕例程或者先前能用的程序让屏幕显示出来了,在此基础上再进行修改调试,你这样的求助在我看来没有人能够单从你提供的程序帮到你,没法下手。
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
 楼主| 发表于 2015-5-27 12:45:12 | 显示全部楼层
回复【7楼】cc57822:
---------------------------------
我之前都按照手册上对过了,感觉是写指令或者写地址没写对,可是,对了半天别人的例程也没有看出来问题在哪,愁死我了,天天加班。也没忙出个所以然,。。。。
回复

使用道具 举报

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
 楼主| 发表于 2015-5-27 13:39:13 | 显示全部楼层
我这边没有STM32F107控制qc12864的例程,你有没有?给我发一份吧?谢了
回复

使用道具 举报

15

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2015-3-20
在线时间
5 小时
发表于 2015-5-27 14:21:31 | 显示全部楼层
示波器,jlink去一步步调,光盯着代码看没用
回复

使用道具 举报

58

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-5-26
在线时间
31 小时
 楼主| 发表于 2015-5-28 08:45:39 | 显示全部楼层
哪位大虾有STM32F107控制QC12864显示的例程,给发一份吧,谢了。。。
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-5-28 10:26:43 | 显示全部楼层
先确定和屏连接的IO配置无误,然后慢慢查时序指令吧,看这程序真看不出来
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-6-17
在线时间
47 小时
发表于 2015-6-17 17:33:04 | 显示全部楼层
搞好没有.................
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 04:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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