OpenEdv-开源电子网

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

关于stm32驱动1602液晶不显示的问题

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-11-14
在线时间
0 小时
发表于 2015-11-14 21:13:34 | 显示全部楼层 |阅读模式
5金钱
1602液晶上面不显示,代码已贴上,求指点!!!
#include "1602.h"

#define L1602_RS_1 GPIO_SetBits(GPIOB, GPIO_Pin_0)
#define L1602_RS_0 GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define L1602_RW_1 GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define L1602_RW_0 GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define L1602_E_1 GPIO_SetBits(GPIOB, GPIO_Pin_2)
#define L1602_E_0 GPIO_ResetBits(GPIOB, GPIO_Pin_2)

void delay_us(u16 us)
{
  u8 i;
while(us--)
for(i=0;i<6;i++);
}
void delay_ms(u16 ms)
{
while(ms--)
  delay_us(1000);
}
void busy_wait()//检查LCD是否忙,如果忙等待
{
  L1602_E_0;
  L1602_RW_1;//读
  L1602_RS_0;//状态
  L1602_E_1;//
  GPIOA->ODR=0XFF;//(GPIOA->ODR&0XFF00)|
  delay_us(1);
  while(GPIOA->ODR>>7);// dddddddd判断PA0~7 状态 &0xffff
  L1602_E_0;
}
void write_cmd(u8 cmd)//向1602发送一条命令
{
  L1602_E_0;
  L1602_RS_0;//命令或数据
  L1602_RW_0;//写
  GPIOA->ODR=(cmd&0X7F);//命令(GPIOA->ODR&0XFF00)|
  delay_us(1);//>40ns
  L1602_E_1;//执行
  delay_ms(1);//>150ns
  L1602_E_0;
  delay_us(1);//>250ns

}
void set_ddram(u8 add)//设置DDRAM的地址--显示地址
{
  L1602_E_0;
  L1602_RS_0;//命令或数据
  L1602_RW_0;//写
  GPIOA->ODR=(add|0X80);//地址(GPIOA->ODR&0XFF00)|
  delay_us(1);//>40ns
  L1602_E_1;//执行
  delay_ms(1);//>150ns
  L1602_E_0;
  delay_us(1);//>250ns

}
void write_dat(u8 asc)//向1602写入数据--asc码
{
  L1602_E_0;
  L1602_RS_1;//命令或数据
  L1602_RW_0;//写
  GPIOA->ODR=asc;//命令(GPIOA->ODR&0XFF00)|
  delay_us(1);//>40ns
  L1602_E_1;//执行
  delay_ms(1);//>150ns
  L1602_E_0;
  delay_us(1);//>250ns
}
void show_asc(u8 add,u8 asc)//在LCD上显示一个ASC字符
{
  busy_wait();
  set_ddram(add);
  busy_wait();
  write_dat(asc);
}
void show_string(u8 add,u8 *p)//显示一个字符串
{
  busy_wait();
  set_ddram(add);
  while(*p)
  {
    busy_wait();
    write_dat(*p++);
  }
}
void show_number(u8 add,u16 n)//在LCD 上显示一个数
{
  char s[6];
  s[0]=(n/10000)+48;//(0~9)+48===48~57  得到万位的asc码
  s[1]=(n%10000/1000)+48;
  s[2]=(n%1000/100)+'0';
  s[3]=(n%100/10)+'0';
  s[4]=(n%10)+'0';
  s[5]='\0';// \转义符
  show_string(add,(u8 *)s);
}

void show_float(u8 add,float n)//在LCD 上显示小数
{
  char s[10];
  sprintf  (s, "%04.3f", n);//按照指定 格式 打印 一个 字符串  n按照浮点型格式打印到asc码中
                            /* 调用这个函数是因为我们要把这个数字按照字符串的格式打印到数组中去  然后调用字符串显示函数  */
  show_string(add,(u8 *)s);
}
/*
void show_float(u8 add,float t)//在LCD 上显示一个数
{
  char s[7];
  u16 n;
  n=t*100;
  s[0]=(n/10000)+48;//(0~9)+48===48~57  得到万位的asc码
  s[1]=(n%10000/1000)+48;
  s[2]='.';
  s[3]=(n%1000/100)+'0';
  s[4]=(n%100/10)+'0';
  s[5]=(n%10)+'0';
  s[6]='\0';// \转义符
  show_string(add,s);
}
*/
void LCD_init()//初始化1602
{
RCC->APB2ENR=0x0000000c;
GPIOB->CRL=0x0111;
GPIOA->CRL=0x11111111;
  delay_us(15);
  write_cmd(0X38);
  delay_us(5);
  write_cmd(0X38);
  delay_us(5);
  write_cmd(0X38);//00111000 --8位接口,2行显示,5*7
  busy_wait();
  write_cmd(0X38);
  busy_wait();
  write_cmd(0X08);
  busy_wait();
  write_cmd(0X01);//清屏--填为空格
  busy_wait();
//  write_cmd(0X0F);//开显示,开光标
 write_cmd(0X0C);//开显示,关光标
  busy_wait();
  write_cmd(0X06);//地址自动加1,不移动


}

最佳答案

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

论坛可以搜到很多 STM32 驱动1602的例子, 参考下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-11-14 21:13:35 | 显示全部楼层
论坛可以搜到很多 STM32 驱动1602的例子, 参考下
回复

使用道具 举报

56

主题

1237

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2644
金钱
2644
注册时间
2014-2-13
在线时间
518 小时
发表于 2015-11-16 09:49:21 | 显示全部楼层
LZ可以看看我写的帖子,上面有完整的代码,哈哈
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-11-14
在线时间
0 小时
 楼主| 发表于 2015-11-17 14:48:44 | 显示全部楼层
你的我试过了,不知道为什么也是不显示的。。。~~~~(>_<)~~~~
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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