4327|5

11

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32F4驱动1602A,只有第一行显示方格 [复制链接]

利用stm32F4驱动1602A显示字符,可是只有显示第一行方格,后来接了10k的变位器调节对比度还是不行。程序上传在附件中了,希望大家能给予解答,谢谢

  1. 主函数
  2. int main(void)
  3. {
  4.         u8 str[]="sghj";
  5.        
  6.         gpioinit();
  7.         delay_ms(10);
  8.   lcdinit();
  9.         delay_ms(20);
  10.         LCD1602_Show_Str(1, 0, str);
  11.        
  12. }

  13. 头文件
  14. #ifndef __LCD_H
  15. #define __LCD_H
  16. #include "sys.h"

  17. #define LCD_RS PEout(0)
  18. #define LCD_RW PEout(1)
  19. #define LCD_E  PEout(2)
  20. #define PORT_DATA GPIOF
  21. #define        DATAOUT(x)        GPIO_Write(GPIOF, x)
  22. #define busy 0x80
  23. #define D7_IN()  {GPIOF->MODER&=~(3<<(8*2));GPIOF->MODER|=0<<8*2;}       
  24. #define D7_OUT() {GPIOF->MODER&=~(3<<(8*2));GPIOF->MODER|=1<<8*2;}


  25. void checkbusy(void);
  26. void lcdinit(void);
  27. void writecommand(unsigned char val,u8 flag);
  28. void portwrite(u8 data);
  29. void writedata(unsigned char data);
  30. void display_position(unsigned char i);
  31. void gpioinit(void);
  32. void port_in( u8 data );
  33. void LCD1602_Show_Str(u8 x, u8 y, u8 *str);
  34. #endif



  35. 子函数:
  36. #include "lcd.h"
  37. #include "delay.h"
  38. #include "led.h"

  39. void checkbusy(void)
  40. {
  41.         u8 sta;
  42.        
  43.         DATAOUT(0xff);
  44.         LCD_RS=0;
  45.         delay_us(200);
  46.         LCD_RW=1;
  47.         delay_us(200);
  48.         do
  49.         {
  50.                 LCD_E=1;
  51.                 delay_ms(5);
  52.                 sta = GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_7);
  53.                 LCD_E=0;
  54.         }while(sta & 0x80);
  55. }


  56. void lcdinit(void)
  57. {
  58.         writecommand(0x38,0);
  59.         delay_ms(5);
  60.         writecommand(0x38,0);
  61.         delay_ms(5);
  62.         writecommand(0x38,0);
  63.   delay_ms(5);
  64.                

  65.        
  66.         writecommand(0x38,1);
  67.         writecommand(0x08,1);
  68.   writecommand(0x01,1);
  69.   writecommand(0x06,1);
  70.   writecommand(0x0C,1);        
  71.        
  72. }

  73. void gpioinit(void)
  74. {
  75.         GPIO_InitTypeDef  GPIO_InitStructure;
  76.        
  77.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF, ENABLE);       
  78.        
  79.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
  80.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  81.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  82.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  83.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  84.         GPIO_Init(GPIOE, &GPIO_InitStructure);       

  85.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;       
  86.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  87.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  88.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  89.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  90.         GPIO_Init(GPIOF, &GPIO_InitStructure);       
  91. }




  92. void writedata(unsigned char data)
  93. {
  94.         checkbusy();
  95.   LCD_RS=1;
  96.         delay_us(200);
  97.         LCD_RW=0;
  98.         delay_us(200);
  99.         DATAOUT(data);
  100.         LCD_E=1;
  101.         delay_us(500);
  102.         LCD_E=0;
  103. }

  104. void writecommand(unsigned char i,u8 flag)
  105. {
  106.   if(flag)
  107.         {
  108.                 checkbusy();
  109.         }
  110.         LCD_RS=0;
  111.         delay_us(200);
  112.         LCD_RW=0;
  113.         delay_us(200);
  114.        
  115.         DATAOUT(i);
  116.         delay_us(500);
  117.         LCD_E=1;
  118.         delay_us(500);
  119.         LCD_E=0;
  120. }       

  121. void LCD1602_Set_Cursor(u8 x, u8 y)
  122. {
  123.         u8 addr;
  124.        
  125.         if (y == 0)
  126.                 addr = 0x00 + x;
  127.         else
  128.                 addr = 0x40 + x;
  129.         writecommand(addr|0x80,1);
  130. }

  131. void LCD1602_Show_Str(u8 x, u8 y, u8 *str)
  132. {
  133.         LCD1602_Set_Cursor(x, y);
  134.         while(*str != '\0')
  135.         {
  136.                 writedata(*str++);
  137.         }
  138. }
复制代码

新建文本文档.txt

2.85 KB, 下载次数: 28

此帖出自stm32/stm8论坛

最新回复

第一行黑块显示是上电的初始状态,仔细检查时序,io口操作太快了不行,第一条复位指令正确执行后那个黑色块就会消失。  详情 回复 发表于 2017-4-13 10:11
点赞 关注
 

回复
举报

24

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
你可以试试显示一个字符看看能不能行,把main函数中的LCD1602_Show_Str(1, 0, str);替换成writedata(‘A');
此帖出自stm32/stm8论坛

点评

nmg
点赞  详情 回复 发表于 2017-4-13 08:13
 
 

回复

5260

帖子

239

TA的资源

管理员

板凳
 
cangsang 发表于 2017-4-12 13:25
你可以试试显示一个字符看看能不能行,把main函数中的LCD1602_Show_Str(1, 0, str);替换成writedata(‘A');

点赞
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 

回复

5260

帖子

239

TA的资源

管理员

4
 
楼主有代码的建议使用论坛编辑器中的代码嵌入功能,这样网友帮你找问题的时候,更方便查看。如下图所示
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

672

帖子

0

TA的资源

版主

5
 
本帖最后由 柠檬酸钠 于 2017-4-13 09:03 编辑

在主函数里面再加一行:   LCD1602_Show_Str(1, 1, str);
看第二行显示不?

此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

6
 
第一行黑块显示是上电的初始状态,仔细检查时序,io口操作太快了不行,第一条复位指令正确执行后那个黑色块就会消失。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表