OpenEdv-开源电子网

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

求助大大12864程序问题

[复制链接]

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-11-13
在线时间
2 小时
发表于 2013-12-18 19:15:13 | 显示全部楼层 |阅读模式

我要在LCM上显示HZ[]里的字,编译器确定无误,硬体脚位确认无误

由可變電阻調整亮光度,但LCM上無顯示HZ[]裡面的字,想請問各位大大是程序裡面哪邊有誤嗎?

所使用LCM的為optima ,型號:OG12864BEYHV
[mw_shl_code=c,true]=====================main.c=================== #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_flash.h" #include "misc.h" #include "lcm.h" int main(void) { LCM_Init(); LCM_User_CN(0, 0, 0); LCM_User_CN(1, 0, 1); LCM_User_CN(2, 0, 0); while (1) ; } =====================LCM.h==================== #ifndef _LCM_H_ #define _LCM_H_ #include "stm32f10x.h" #include "stm32f10x_gpio.h" #define DB0 GPIO_Pin_3 #define DB1 GPIO_Pin_4 #define DB2 GPIO_Pin_5 #define DB3 GPIO_Pin_6 #define DB4 GPIO_Pin_7 #define DB5 GPIO_Pin_8 #define DB6 GPIO_Pin_9 #define DB7 GPIO_Pin_10 #define DATA_PORT GPIOA #define CS1 GPIO_Pin_5 #define CS2 GPIO_Pin_6 #define DI GPIO_Pin_8 #define E GPIO_Pin_9 #define CONTROL_PORT GPIOB #define RW GPIO_Pin_0 #define RST GPIO_Pin_1 #define READ_PORT GPIOA #define DI_H GPIO_SetBits(CONTROL_PORT,DI) #define DI_L GPIO_ResetBits(CONTROL_PORT,DI) #define E_H GPIO_SetBits(CONTROL_PORT,E) #define E_L GPIO_ResetBits(CONTROL_PORT,E) #define CS1_H GPIO_SetBits(CONTROL_PORT,CS1) #define CS1_L GPIO_ResetBits(CONTROL_PORT,CS1) #define CS2_H GPIO_SetBits(CONTROL_PORT,CS2) #define CS2_L GPIO_ResetBits(CONTROL_PORT,CS2) #define RW_H GPIO_SetBits(READ_PORT,RW) #define RW_L GPIO_ResetBits(READ_PORT,RW) #define RST_H GPIO_SetBits(READ_PORT,RST) #define RST_L GPIO_ResetBits(READ_PORT,RST) #define WRITE_DATA(DDAT) GPIO_Write(DATA_PORT,DDAT) #define READ_DATA GPIO_ReadInputData(DATA_PORT) void LCM_Delay(unsigned int uiTime); void LCM_Busy(void); void LCM_Reset(void); void LCM_Clear(unsigned char ucData); void LCM_Write(unsigned char ucDAT_or_CMD, unsigned char ucLeft_or_Right,unsigned char ucData); void LCM_Write_Screan(char x, char y, unsigned char ucData); void LCM_Switch(unsigned char ucSwitch); void LCM_Init(void); void LCM_User_CN(unsigned char ucRow, unsigned char ucColumn,unsigned char ucChn); #endif ======================LCM.c============================== #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_flash.h" #include "misc.h" #include "lcm.h" unsigned char HZ[] = { 0x40, 0x40, 0x40, 0x40, 0x20, 0x42, 0x20, 0x42, 0x50, 0x4A, 0x48, 0x72, 0x44, 0x42, 0xC3, 0x7F, 0x44, 0x42, 0x48, 0x62, 0x50, 0x5A, 0x50, 0x42, 0x20, 0x42, 0x60, 0x40, 0x20, 0x40, 0x00, 0x00,/*"踢",0*/ 0x00, 0x00, 0xFE, 0xFF, 0x22, 0x02, 0x5A, 0x04, 0x86, 0x43, 0x10, 0x48, 0x94, 0x24, 0x74, 0x22, 0x94, 0x15, 0x1F, 0x09, 0x34, 0x15, 0x54, 0x23, 0x94, 0x60, 0x94, 0xC0, 0x10, 0x40, 0x00, 0x00, /*"鍬",1*/ }; enum LCM_CMD_DAT { cmd, dat } LCM_CMD,LCM_DAT; enum LCM_LEFT_RIGHT { left, right } LCM_LEFT,LCM_RIGHT; enum LCM_OFF_ON { off, on } LCM_OFF, LCM_ON; void LCM_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DB0 | DB1 | DB2 | DB3 | DB4 | DB5 | DB6 | DB7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(DATA_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = DI | E | CS1 | CS2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(CONTROL_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = RW | RST; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(READ_PORT, &GPIO_InitStructure); } void LCM_Delay(unsigned int uiTime) { unsigned short int i, j; for (i = 0; i < uiTime; i++) for (j = 0; j < 10; j++) ; } void LCM_Reset(void) { RST_L; LCM_Delay(500); RST_H; LCM_Delay(500); } void LCM_Busy(void) { DI_L; //di=0; RW_H; //rw=1; LCM_Delay(100); } void LCM_Write(unsigned char ucDAT_or_CMD, unsigned char ucLeft_or_Right, unsigned char ucData) { u16 temp; if (ucDAT_or_CMD == LCM_DAT) //dat { if (ucLeft_or_Right == LCM_LEFT) //left { CS1_H; //cs1=1; CS2_L; //cs2=0; } else //right { CS1_L; //cs1=0; CS2_H; //cs2=1; } LCM_Delay(10); LCM_Busy(); DI_H; //di=1; RW_L; //rw=0; } else //cmd { CS1_H; //cs1=1; CS2_H; //cs2=1; LCM_Delay(10); LCM_Busy(); RW_L; //rw=0; DI_L; //di=0; } LCM_Delay(10); temp = ucData; temp = temp << 8; WRITE_DATA(temp); //lcm=a; LCM_Delay(10); E_H; //e=1; LCM_Delay(10); E_L; //e=0; LCM_Delay(10); } void LCM_Write_Screan(char x, char y, unsigned char ucData) { if (x >= 64) { x = x - 64; x = x + 0x40; y = y + 0xb8; LCM_Write(LCM_CMD, 0, x); LCM_Write(LCM_CMD, 0, y); LCM_Write(LCM_DAT, LCM_RIGHT, ucData); } else { x = x + 0x40; y = y + 0xb8; LCM_Write(LCM_CMD, 0, x); LCM_Write(LCM_CMD, 0, y); LCM_Write(LCM_DAT, LCM_LEFT, ucData); } } void LCM_Clear(unsigned char ucData) { unsigned char x, y; for (y = 0; y < 8; y++) { for (x = 0; x < 128; x++) { LCM_Write_Screan(x, y, ucData); } } } void LCM_Switch(unsigned char ucSwitch) { ucSwitch = ucSwitch + 0x3e; LCM_Write(LCM_CMD, 0, ucSwitch); } void LCM_Init(void) { LCM_CMD = cmd; LCM_DAT = dat; LCM_LEFT = left; LCM_RIGHT = right; LCM_OFF = off; LCM_ON = on; LCM_GPIO_Configuration(); LCM_Reset(); LCM_Switch(LCM_OFF); LCM_Clear(0); LCM_Switch(LCM_ON); LCM_Write(LCM_CMD, 0, 0xc0); } void LCM_User_CN(unsigned char ucRow, unsigned char ucColumn, unsigned char ucChn) { int i, dx; for (i = 0; i < 16; i++) { dx = HZ[2 * i + ucChn * 32]; LCM_Write_Screan(ucRow * 16 + i, ucColumn, dx); dx = HZ[(2 * i + 1) + ucChn * 32]; LCM_Write_Screan(ucRow * 16 + i, ucColumn + 1, dx); } } [/mw_shl_code]





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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-18 21:08:41 | 显示全部楼层
回复【楼主位】richard.lin:
-------------------------------
这样不好看啊。
楼主画点函数搞定了么?
显示字符是否成功了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-11-13
在线时间
2 小时
 楼主| 发表于 2013-12-19 08:10:19 | 显示全部楼层
程序compiler都無錯誤,但是LCM裡面卻都無顯示任何字符,不知是程序哪裡有少漏打,或者是程序哪裡有錯誤?

拜托原子大大帮忙解决
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-19 10:07:19 | 显示全部楼层
回复【3楼】richard.lin:
---------------------------------
这,你先搞出来显示字符先。
你这种12864,我也没整过哦。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2013-12-19 10:41:17 | 显示全部楼层
对,先用最最简单的例程把硬件调通,比如在屏幕任意位置画一个点或者简单字符看行不行,如果这个都有问题就先好好检查硬件是否正确,没问题了再调试更复杂的东西,调试有时候是个很锻炼能力的过程,一般过程是先调通硬件,再调软件,确保每一条硬件道路都是通的,再不断的丰富软件,循序渐进。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-19 12:16:21 | 显示全部楼层
回复【楼主位】richard.lin:
---------------------------------
楼主的判断忙信号那个函数好像有问题喔,你只改变了控制线的电平,但是LCM返回来的数据你没读进来判断,怎么知道LCM在忙还是在空闲状态呢?如果你不读取LCM返回的数据,直接就delay多少时间跳过即可,连控制线的电平都不用改变,接着发数据
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-11-13
在线时间
2 小时
 楼主| 发表于 2013-12-19 19:15:50 | 显示全部楼层
我在忙信号有做更改,萤幕上还是无显示任何字符

void LCM_Busy(void)
{    
    GPIO_InitTypeDef GPIO_InitStructure; 
    u8 temp=0; 
     
    DI_L;  // DI =0 指令 
    RW_H;    // RW =1  读模式 
     
    // 第7位读状态 
    //GPIO_InitStructure.GPIO_Pin = DB7; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_Init(DATA_PORT, &GPIO_InitStructure); 
    LCM_Delay(1); 
    do{ 
        E_H;
        LCM_Delay(1); 
        temp = GPIO_ReadInputDataBit(DATA_PORT, DB7);
        E_L; 
        LCM_Delay(1);            
    }while(temp);//等待不忙 
  E_L;   
  //--------把D7 设为输出
  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(DATA_PORT, &GPIO_InitStructure); 
  LCM_Delay(1);    
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-19 23:40:28 | 显示全部楼层
回复【7楼】richard.lin:
---------------------------------
调解下对比度试试,我记得以前用1602的时候,早就可以显示了,只是对比度太低了,直接就显示不出来,郁闷死了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-11-13
在线时间
2 小时
 楼主| 发表于 2013-12-20 10:16:53 | 显示全部楼层
原子大大,對比度調整我有用可變電阻調整,已調整為可顯示狀態,但是液晶裡面還是沒顯示程式裡的字符
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-20 12:30:21 | 显示全部楼层
回复【9楼】richard.lin:
---------------------------------
那你还得检查代码,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-5-2
在线时间
1 小时
发表于 2013-12-20 14:27:37 | 显示全部楼层
程序这么长,很少有人看吧。
接上楼,先把对比度确认无误了再说
12864对比度其实很有调头啊,背板上有很多是要我们选择配置的,这个还是仔细对着手册一步一步来。
电源3V还是5V,内带不带倍压,串口还是并口通信,是否要外接电阻调对比度啥的,先仔细看看手册,保证硬件没问题
阳光午后,沙滩漫步
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 08:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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