OpenEdv-开源电子网

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

关于stm32控制1602液晶

[复制链接]

46

主题

177

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2012-5-2
在线时间
0 小时
发表于 2012-5-3 19:33:55 | 显示全部楼层 |阅读模式

我想用stm32控制1602液晶  编写了如下程序

但是液晶上没有出现预期的光标闪烁

请重点看看红字部分

 

#include<stm32f10x_lib.h>
#include"delay.h"
#include"sys.h"
#define rs PAout(3)
#define rw PAout(4)
#define en PAout(5)
/******A,B口初始化*******/
void dk_init(void)
{
  RCC->APB2ENR|=1<<3;//使能PB口时钟
  RCC->APB2ENR|=1<<2;
  GPIOB->CRL&=0x0;
  GPIOB->CRL|=0x33333333;//PB0-7全输入
  GPIOB->ODR=0xff;//PB0-7输出高
  GPIOA->CRL&=0xff000fff;
  GPIOA->CRL|=0x333000;//PA3-5输入
  GPIOA->ODR=3<<4;//PA3-5输出高
}

/*******请问以下命令格式正确吗?******/
void write_com(u8 com)
{
  rs=0;rw=0;en=0;
 GPIOB->ODR=com;//主要是这一句正确吗??

 delay_ms(5);
 en=1;
 delay_ms(5);
 en=0;
}
void write_dat(u8 dat)
{
  rs=1;rw=0;en=0;
 GPIOB->ODR=dat;
 delay_ms(5);
 en=1;
 delay_ms(5);
 en=0;
}
void 1602_init()
{
  write_com(0x38);
 write_com(0x01);
 write_com(0x0f);
 write_com(0x80);
}
int main(void)
{
  Stm32_Clock_Init(9);
  delay_init(72);
 dk_init();
 1602_init();
 while(1);
}

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

使用道具 举报

9

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2011-1-20
在线时间
7 小时
发表于 2012-5-3 21:02:26 | 显示全部楼层
请参考“http://www.openedv.com/posts/list/1012.htm”。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-3 23:24:11 | 显示全部楼层
我在论坛发过avr的代码.可以参考下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
发表于 2012-5-4 23:15:07 | 显示全部楼层
以下是我早两个星期 自己弄STM32驱动1602程序的程序,已经调试成功!!

头文件:
#ifndef _LCD1602_H__
#define _LCD1602_H__

#include "sys.h"

void init1602(void);
void write_com(u8 com);
void write_date(u8 date);
//void write_2date(unsigned char a,unsigned char b);

#endif


c文件:
#include"lcd1602.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 

#define rd  (1<<2)  //P24  C2
#define wr  (1<<0)  //P25  C0
#define en  (1<<13)  //P26  C13

//设置使能脚为1或者0     
#define lcden(x) GPIOC->ODR=(GPIOC->ODR&~en)|(x?en:0)
#define lcdrd(x) GPIOC->ODR=(GPIOC->ODR&~rd)|(x?rd:0)
#define lcdwr(x) GPIOC->ODR=(GPIOC->ODR&~wr)|(x?wr:0)
 
void init1602()
{
RCC->APB2ENR|=1<<3;     //使能PORTB时钟
RCC->APB2ENR|=1<<4;     //使能PORTC时钟
GPIOC->CRL&=0XFFFFF0F0; //OC输出   
GPIOC->CRL|=0X00000303;
GPIOC->ODR|=5<<0;

GPIOC->CRH&=0XFF0FFFFF; //OC输出   
GPIOC->CRH|=0X00300000;
GPIOC->ODR|=1<<13;

GPIOB->CRH&=0X00000000; //OC输出   D0----D8
GPIOB->CRH|=0X33333333;
GPIOB->ODR|=0XFFFF;

delay_ms(5);
write_com(0x01);
write_com(0x38);  //  显示模式设置
write_com(0x0c);  //显示开关 及光标设置
write_com(0x06); //移动光标
write_com(0x80);  //数据指针初始化
}

void write_com(u8 com)  //写指令 
{
delay_ms(1);
lcdrd(0);
delay_us(20);
lcdwr(0);
delay_us(20);
lcden(0);
delay_us(20);
GPIOB->ODR=0XFF00&(com<<8); //PB高8位
delay_ms(1);
lcden(1);
delay_ms(1);
lcden(0);
delay_ms(1);
}

void write_date(u8 date)   //写数据 
 {
delay_ms(1);
lcdrd(1);
delay_us(20);
GPIOB->ODR=0XFF00&(date<<8); //PB高8位
delay_ms(1);
lcden(1);
delay_ms(1);
lcden(0);
  }



回复 支持 反对

使用道具 举报

41

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2012-4-28
在线时间
0 小时
发表于 2012-5-5 13:36:28 | 显示全部楼层
回复【4楼】bluebird23:
---------------------------------
  必须先发高八位数据吗?  GPIOB->ODR=0XFF00&(date<<8); //PB高8位 
   这条语句 date不是八位的吗  左移八位那样全都是0了啊? 
时时心存感激,事事全力以赴。
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2012-5-5 19:14:37 | 显示全部楼层
回复【5楼】zhulifeng:
---------------------------------
他是PB高8位做为数据口
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
发表于 2012-5-5 21:06:48 | 显示全部楼层
如5楼所说
回复 支持 反对

使用道具 举报

41

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2012-4-28
在线时间
0 小时
发表于 2012-5-6 11:06:47 | 显示全部楼层
回复【4楼】bluebird23:
---------------------------------
RCC->APB2ENR|=1<<3;     //使能PORTB时钟 
RCC->APB2ENR|=1<<4;     //使能PORTC时钟 
GPIOC->CRL&=0XFFFFF0F0; //OC输出    
GPIOC->CRL|=0X00000303; 
GPIOC->ODR|=5<<0; 

GPIOC->CRH&=0XFF0FFFFF; //OC输出    
GPIOC->CRH|=0X00300000; 
GPIOC->ODR|=1<<13; 
 
能说一下 为什么 RS RW  EN 都为输出吗?  本业RW 为写时应该输入啊  跟这个没关系吗?
时时心存感激,事事全力以赴。
回复 支持 反对

使用道具 举报

2

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-8-8 15:59:48 | 显示全部楼层
回复【4楼】bluebird23:
---------------------------------
PC2不需要配置吗?
回复 支持 反对

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-4-24
在线时间
0 小时
发表于 2014-4-24 17:20:54 | 显示全部楼层
回复【7楼】bluebird23:
-------------------------
你的主程序呢    不是就光初始化吧
回复 支持 反对

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-13 23:25:13 | 显示全部楼层
回复【4楼】bluebird23:
---------------------------------
大神,那个rd wr  en  这三个对应的硬件是什么啊?我的1602只有16个引脚,什么都没有写,我怎么识别呢?还有连线应该怎么连接呢?谢谢大神
愈挫愈勇
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-12-7
在线时间
3 小时
发表于 2015-3-8 23:41:03 | 显示全部楼层
回复【4楼】bluebird23:
---------------------------------
STM32驱动LCD1206电路图怎么连的?中间加了一个上拉电阻,然后用的上拉模式?
回复 支持 反对

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2015-3-31
在线时间
0 小时
发表于 2015-4-3 22:04:29 | 显示全部楼层
回复【6楼】zenghi:
---------------------------------
可是他不就是把高八位移走了吗?
回复 支持 反对

使用道具 举报

3

主题

4

帖子

0

精华

新手入门

积分
36
金钱
36
注册时间
2015-4-26
在线时间
0 小时
发表于 2015-4-27 22:35:12 | 显示全部楼层
你好,问下1602的引脚可以随便连STM32的IO口麽?
回复 支持 反对

使用道具 举报

24

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
503
金钱
503
注册时间
2016-3-16
在线时间
204 小时
发表于 2016-4-9 18:13:16 | 显示全部楼层
不对,stm32的ODR寄存器是32位的,你往里写一个字节,肯定是不OK的,中文参考手册三令五申:不能写非32位的数据到寄存器。
回复 支持 反对

使用道具 举报

24

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
503
金钱
503
注册时间
2016-3-16
在线时间
204 小时
发表于 2016-4-10 19:40:22 | 显示全部楼层
bluebird23 发表于 2012-5-4 23:15
以下是我早两个星期&nbsp;自己弄STM32驱动1602程序的程序,已经调试成功!!

头文件:
#ifndef&nbsp;_LCD1 ...

    大神,你这个改变低八位的输出了;能不能不改变低位数据;因为我低位外接了设备。
路漫漫其修远兮,戒骄戒躁。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-4-20
在线时间
2 小时
发表于 2016-9-22 11:43:10 | 显示全部楼层
#define        lcden(x) GPIOC->ODR=(GPIOC->ODR&~en)|(x?en:0) 请问这句是什么意思啊?尤其是(x?en:0)
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 07:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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