OpenEdv-开源电子网

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

大侠帮忙看看,STM32的1602没有显示

[复制链接]

21

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-6-30
在线时间
0 小时
发表于 2011-7-16 11:06:47 | 显示全部楼层 |阅读模式

接口电路连接
PA0~PA7      D0~D7
RS                C1
RW               PC2
E                  PC3
程序如下:


 #include<stm32f10x_lib.h>
#include "delay.h"
#include "sys.h"

#define RSL GPIOC->ODR&=~(1<<1)
#define RSH GPIOC->ODR|=1<<1
#define W GPIOC->ODR&=~(1<<2)
#define R GPIOC->ODR|=1<<2
#define DISEN GPIOC->ODR=~(1<<3)
#define EN GPIOC->ODR|=1<<3

#define SEND(x) {GPIOA->ODR&=0xFFFFFF00; GPIOA->ODR|=x;}

void delay_ms(u16 cnt){
 u16 i;
 for(i=0;i<cnt;i++)
  delay_us(1000);
}

void Output_Config(){
 GPIOC->CRL&=0x00000000;
 GPIOC->CRL|=0x33333333;
}

void Input_Config(){
 GPIOC->CRL&=0x00000000;
 GPIOC->CRL|=0x88888888;
 GPIOC->ODR|=0x000000FF;
}

void LCD1602_GPIO_Config(){
 RCC->APB2ENR|=1<<(2+0);
 Output_Config();
 RCC->APB2ENR|=1<<(2+2);
 GPIOC->CRL&=0xFFFF0000;
 GPIOC->CRL|=0x00003333;
}

void busy(){
 u8 temp;
 Input_Config();
 do{
  RSL;
  R;
  delay_ms(1);
  EN;
  delay_ms(1);
  temp=GPIOA->IDR&0x80;
  delay_ms(1);
  DISEN;
  delay_ms(1);
 }while(temp);
 Output_Config();
}

void WriteData(u8 data){
 RSH;
 W;
 delay_ms(1);
 SEND(data);
 delay_ms(1);
 DISEN;
 delay_us(200);
 EN;
 delay_ms(1);
 DISEN;
}

void WriteCommand(u8 com){
 RSL;
 W;
 delay_ms(1);
 SEND(com);
 delay_ms(1);
 DISEN;   
 delay_us(200);
 EN;
 delay_ms(1);
 DISEN;
}

void LCD1602_Init(){
 WriteCommand(0x38);
 WriteCommand(0x38);
 WriteCommand(0x38);
 busy();
 WriteCommand(0x38);
 busy();
 WriteCommand(0x08);
 busy();
 WriteCommand(0x01);
 busy();
 WriteCommand(0x06);
 busy();
 WriteCommand(0x0C);
}

u8 table[]="Hello, world!";

int main(){
 u8 i;
 Stm32_Clock_Init(9);
 delay_init(72);
 LCD1602_GPIO_Config();
 LCD1602_Init();
 for(i=0;i<14;i++){
  busy();
  WriteData(table);
 }
 while(1){
  for(i=0;i<14;i++){
   busy();
   WriteData(table);
  }
 }
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

9

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2011-1-20
在线时间
7 小时
发表于 2011-7-23 12:36:07 | 显示全部楼层

lcd162a的参考代码:
文件名:lcd162a.h

#ifndef __LCD162A_H
#define __LCD162A_H      
#include "sys.h"
#include "stdlib.h"    
////////////////////////////////////////////////////////////////////////////////// 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板162A驱动代码
//修改日期:2011/07/23
//版本:V0.0.2

 

/*=====================================================
连接线定义: 
DB0-----Pa0  DB4-----Pa4  RS-------Pc8
DB1-----Pa1  DB5-----Pa5  RW-------Pc7
DB2-----Pa2  DB6-----Pa6  E--------Pc6
DB3-----Pa3  DB7-----Pa7  VLCD(Vee)接1K2电阻到GND
VSS-----GND  VCC-----+5v  
======================================================*/
//-----------------LCD162A端口定义----------------         

#define LCD162A_RS PCout(8)
#define LCD162A_RW PCout(7)   
#define LCD162A_E  PCout(6)

//PB0~7,作为数据线
#define DATAOUT(x) GPIOA->ODR=(GPIOA->ODR&0xff00)|(x&0x00FF); //Pa0-Pa7输出
       
//lcd162a控制用函数

void lcd162a_Reset(void); //复位lcd162a 
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata);//在指定位置显示一个字符//x:0~15 //y:0~1
void lcd162a_cls(void);    //清屏
void lcd162a_Display(u8 dd);  //显示      
void lcd162a_Init(void); //初始化lcd162a
void lcd162a_LocateXY(u8 posx,u8 posy);  //显示光标位置
void lcd162a_WriteCommand(u8 CMD);
void lcd162a_WriteData(u8 dataW);
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr); //显示字符串

 

#endif 


文件名:lcd162a.c
#include "lcd162a.h"
#include "stdlib.h"  
#include "delay.h"
#include "stdio.h"

//清屏
////
void lcd162a_cls(void)
{
 lcd162a_WriteCommand(0x01); //            
}

//显示
void lcd162a_Display(u8 dd)
{            
 u8 i=0;
 for(i=0;i<16;i++)
 {
  lcd162a_DispOneChar(i,1,dd++);
  dd &=0x7f;
  if (dd<32) dd=32;
 }        
}

//显示光标位置
void lcd162a_LocateXY(u8 posx,u8 posy)
{            
 u8 temp;
 temp=posx & 0xf;
 posy &= 0x01;
 if(posy) temp |=0x40;
 temp |=0x80;
 lcd162a_WriteCommand(temp);        
}

//在指定位置显示一个字符
//x:0~15
//y:0~1
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata)
{            
 lcd162a_LocateXY(x,y);
 lcd162a_WriteData(Wdata);        
}

//显示字符串
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr)
{            
 u8 i,l=0;

 while (ptr[l] >31)
 {
  l++;
 };

 for (i=0;i<l;i++)
 {
  lcd162a_DispOneChar(x++,y,ptr);
  if ( x == 16 )
  {
   x = 0;
   y ^= 1;
  }
 }        
}

//复位
////
void lcd162a_Reset(void)
{
 lcd162a_WriteCommand(0x38); //
 delay_ms(15);

 lcd162a_WriteCommand(0x38); //
 delay_ms(15);

 lcd162a_WriteCommand(0x38); //
 delay_ms(15);

 lcd162a_WriteCommand(0x38); //
 lcd162a_WriteCommand(0x08); //

 lcd162a_cls(); //clear device

 lcd162a_WriteCommand(0x06); //
 lcd162a_WriteCommand(0x0c); //
             
}
//写入控制字。
//RS=0,
//RW=0
//E=1
//
void lcd162a_WriteCommand(u8 CMD)
{
 delay_ms(2);  //等待控制器完成指令

 LCD162A_RS=0;
 LCD162A_RW=0;
 LCD162A_E=1;
 
 DATAOUT(CMD); //送控制字
 delay_us(2);

 LCD162A_E=0;              
}

//写入一个字节。
//dataW:要写入的数据/命令
//RS=1
//RW=0
//E=1
//
void lcd162a_WriteData(u8 dataW)
{
 delay_ms(2); //等待控制器完成指令

 LCD162A_RS=1;
 LCD162A_RW=0;
 LCD162A_E=1;
 
 DATAOUT(dataW);

 delay_us(2);

 LCD162A_E=0;             
}


   
//初始化lcd162a       
void lcd162a_Init(void)
{                  
 RCC->APB2ENR|=1<<2;    //使能PORTA时钟
 RCC->APB2ENR|=1<<4;    //使能PORTC时钟  
 
 //RCC->APB2ENR|=1<<0;    //开启辅助时钟
      
  //JTAG_Set(SWD_ENABLE);

 GPIOA->CRL=0X33333333; //pa0-pa7
 GPIOA->ODR|=0X00FF;  //全部输出高电平
 
 //pc6-pc9
  GPIOC->CRH&=0XFFFFFF00;
 GPIOC->CRL&=0X00FFFFFF;
  GPIOC->CRH|=0X00000033;//
 GPIOC->CRL|=0X33000000;
 GPIOC->ODR|=0X03C0;

 lcd162a_Reset();
 lcd162a_cls();
      

////////////////////////////////////////////////////////////////

文件名:test.c

#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"  
#include "delay.h" 
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"

#include "lcd162a.h"  
#include "stdio.h"

//
//待显示的字符串
//

u8 *p1="Hello,world.";
  
int main(void)
{  
  u8 temp=0;
      
  Stm32_Clock_Init(9);  //系统时钟设置
 delay_init(72);       //延时初始化
 uart_init(72,9600);   //串口初始化
 lcd162a_Init();   //初始化与lcd162a连接的硬件接口

 lcd162a_cls();
 lcd162a_ePutstr(0,0,p1);
 delay_ms(1000);


 lcd162a_cls();

 while(1)
 {
  temp &= 0x7f;   // 只显示ASCII字符
  if (temp<32)temp=32; // 屏蔽控制字符,不予显示
  lcd162a_Display( temp++ );
  delay_ms(400);
 }
   
               
}


下面是lcd162a显示时的图片(手机拍的,因光线不足,不太清楚):




 

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-23 14:13:47 | 显示全部楼层
楼上威武
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2011-4-6
在线时间
0 小时
发表于 2011-8-24 10:33:18 | 显示全部楼层
强帖留名
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-9-7
在线时间
0 小时
发表于 2012-9-10 16:03:15 | 显示全部楼层
请问一下,1602接STM32单片机需要电平转换吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-10 21:35:47 | 显示全部楼层
1602有3.3V的吧。不过STM32驱动,就算5V应该也可以的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-8-11
在线时间
0 小时
发表于 2012-9-10 21:57:12 | 显示全部楼层
1602的高电平应该不用5V吧,以前写过,数据手册里面有的
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2012-9-11 15:07:50 | 显示全部楼层

回复【3楼】 master001 :
---------------------------------
有个问题请教下,下面的对于屏的第一行和第二行的地址设定,
在手册中说的第一行是0x80,第二行是0x80+0x40,但你的代码中貌似不是这么写的;
还有
代码中红色部分不太懂,不知道是怎么确定x,y位置的,请教~

//显示光标位置
void lcd162a_LocateXY(u8 posx,u8 posy)
{            
 u8 temp;
 temp=posx & 0xf;
 posy &= 0x01;
 if(posy) temp |=0x40;
 temp |=0x80;
 lcd162a_WriteCommand(temp);        
}

 

STM32
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2013-1-11 16:58:13 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
请问STM32驱动3.3V的1602,以下哪种电路连接方法能驱动成功且安全有效?
1,STM32连接到74HC245,再连接到1602.
2,STM32 IO接10K的上拉电阻,再接到1602.
3,STM32 IO直接连接1602.
STM32
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-11 17:00:04 | 显示全部楼层
回复【10楼】jj123paopao:
------------------------------
直接接就是了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2013-1-11 17:37:40 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
恩,谢谢。
STM32
回复 支持 反对

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2012-11-6
在线时间
7 小时
发表于 2013-2-26 11:57:11 | 显示全部楼层
回复【3楼】master001:
---------------------------------
这个1602的程序用在0802上需要改什么地方吗?
回复 支持 反对

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2012-11-6
在线时间
7 小时
发表于 2013-2-28 11:42:39 | 显示全部楼层
JTAG_Set(SWD_ENABLE);这句屏蔽了之后还能正常显示?
回复 支持 反对

使用道具 举报

16

主题

89

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2012-10-6
在线时间
9 小时
发表于 2013-3-7 23:01:01 | 显示全部楼层
为什么我用你的源程序都不得呢,一直循环显示···@master001
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2013-3-8 10:27:31 | 显示全部楼层
回复【9楼】jj123paopao:
---------------------------------
X,Y的值是由这个条代码来决定的,“lcd162a_ePutstr(0,0,p1);“
如果第二个变量为0的话就表示在第一行显示,如果第二个变量为1的话就表示在第二行显示
void lcd162a_LocateXY(u8 posx,u8 posy)
{             
 u8 temp;
 temp=posx & 0xf;
 posy &= 0x01;
 if(posy) temp |=0x40;
 temp |=0x80;
 lcd162a_WriteCommand(temp);         
}
天道酬勤
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-3-8 12:24:08 | 显示全部楼层
回复【3楼】master001:
---------------------------------
LZ好樣的
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

11

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2013-3-19
在线时间
20 小时
发表于 2013-5-7 19:37:03 | 显示全部楼层
为什么我移植到我的板子上就不行了呢????求救啊!!!!
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-1-24
在线时间
0 小时
发表于 2014-7-28 11:55:54 | 显示全部楼层
为什么我的lcd1602显示的是两排黑框呢,求解释,谢谢
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-4-5
在线时间
0 小时
发表于 2014-9-13 10:15:20 | 显示全部楼层
谁有1602显示中文的库啊~求救。谢谢。
BEVIS,在沉默中前行
回复 支持 反对

使用道具 举报

11

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-11-10 14:38:39 | 显示全部楼层
回复【11楼】正点原子:
----------------------------
如果1602是5V的呢?是不是   STM32 IO接10K的上拉电阻,再接到1602. ?
行善,持咒
回复 支持 反对

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2014-6-12
在线时间
54 小时
发表于 2014-11-10 15:02:16 | 显示全部楼层
回复【21楼】lvonve:
---------------------------------
开漏输出试试,我上次用核心板驱动成功了
回复 支持 反对

使用道具 举报

11

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-11-10 15:05:30 | 显示全部楼层
回复【22楼】Coder:
---------------------------------
开漏输出成功的吗?我试试
行善,持咒
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-12-7
在线时间
3 小时
发表于 2015-3-8 23:25:56 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
请问STM32驱动5.0V的1602,以下哪种电路连接方法能驱动成功且安全有效? 
1,STM32连接到74HC245,再连接到1602. 
2,STM32 IO接10K的上拉电阻,再接到1602. 
3,STM32 IO直接连接1602.
谢谢原子哥
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-8 23:48:30 | 显示全部楼层
回复【24楼】注册个号来学习:
---------------------------------
简单点,直接接也不会有问题
复杂点,每个信号线串接200R电阻。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-12-7
在线时间
3 小时
发表于 2015-3-11 15:21:00 | 显示全部楼层
回复【25楼】正点原子:
---------------------------------
谢谢了,原子哥
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 11:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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