野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13785|回复: 10

1602显示一排方块,求解决

[复制链接]
发表于 2016-12-14 15:10:02 | 显示全部楼层 |阅读模式
WechatIMG7.jpeg
接线:
1602的D0-D7接的板子上B6,7,8,9,12,13,14,15,
RS RW E接板子上A2,3,4
代码如下,是网上复制下来的,我就改了gpio
  1. #include "stm32f10x.h"

  2. GPIO_InitTypeDef GPIO_InitStructure; //定义数据命令选择端
  3. #define RS_CLR  GPIO_ResetBits(GPIOA,GPIO_Pin_2) //读写控制端
  4. #define RS_SET  GPIO_SetBits(GPIOA,GPIO_Pin_2)
  5. #define RW_CLR  GPIO_ResetBits(GPIOA,GPIO_Pin_3)
  6. #define RW_SET  GPIO_SetBits(GPIOA,GPIO_Pin_3) //使能端
  7. #define EN_CLR  GPIO_ResetBits(GPIOA,GPIO_Pin_4)
  8. #define EN_SET  GPIO_SetBits(GPIOA,GPIO_Pin_4)

  9. //延时nus
  10. void delay_nus(unsigned long n) {
  11.         unsigned long j;
  12.         while (n--) {
  13.                 j = 8;
  14.                 while (j--)
  15.                         ;
  16.         }
  17. }
  18. //延时nms
  19. void DelayMs(unsigned char t) {
  20.         while (t--)
  21.                 delay_nus(1100);
  22. }
  23. void GPIO_Configuration(void) {
  24.         GPIO_InitTypeDef GPIO_InitStructure;
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6
  26.                         | GPIO_Pin_7
  27.                         | GPIO_Pin_8
  28.                         | GPIO_Pin_9
  29.                         | GPIO_Pin_12
  30.                         | GPIO_Pin_13
  31.                         | GPIO_Pin_14
  32.                         | GPIO_Pin_15;
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*I/O 方向 */
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; /*I/O 输出速度*/
  35.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*I/O 方向 */
  38.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; /*I/O 输出速度*/
  39.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  40. }
  41. //判断是否忙
  42. u8 LCD_check_busy() {
  43. //u8 ReadValue;
  44.         GPIO_Write(GPIOA, 0xFF);
  45.         RS_CLR;
  46.         delay_nus(1);
  47.         RW_SET;
  48.         delay_nus(1);
  49.         do {
  50.                 EN_CLR;
  51.                 delay_nus(200);
  52.                 EN_SET;
  53.                 delay_nus(200);
  54.         } while (GPIOA->IDR & 0X80);
  55.         return (u8) 0;
  56. }
  57. //命令初始化
  58. void LCD_initwrite_com(unsigned char com) {
  59. //while(LCD_check_busy()); //忙则等待
  60.         EN_CLR;
  61.         delay_nus(1);
  62.         RS_CLR;
  63.         delay_nus(1);
  64.         RW_CLR;
  65.         delay_nus(10);
  66.         GPIO_Write(GPIOA, com);
  67.         delay_nus(300);
  68.         EN_SET;
  69.         delay_nus(300);
  70.         EN_CLR;
  71.         delay_nus(300);
  72. }
  73. //写命令
  74. void LCD_write_com(unsigned char com) {
  75. //while(LCD_check_busy()); //忙则等待
  76.         EN_CLR;
  77.         delay_nus(1);
  78.         RS_CLR;
  79.         delay_nus(1);
  80.         RW_CLR;
  81.         delay_nus(1);
  82.         GPIO_Write(GPIOA, com);
  83.         delay_nus(500);
  84.         EN_SET;
  85.         DelayMs(1);
  86.         EN_CLR;
  87.         delay_nus(100);
  88. }
  89. //写入数据
  90. void LCD_write_data(unsigned char Data) {
  91. //while(LCD_check_busy()); //忙则等待
  92.         EN_CLR;
  93.         delay_nus(1);
  94.         RS_SET;
  95.         delay_nus(1);
  96.         RW_CLR;
  97.         delay_nus(1);
  98.         GPIO_Write(GPIOB, Data);
  99.         delay_nus(500);
  100.         EN_SET;
  101.         DelayMs(1);
  102.         EN_CLR;
  103.         delay_nus(100);
  104. }
  105. //清屏
  106. void LCD_Clear(void) {
  107.         LCD_write_com(0x01);
  108.         DelayMs(5);
  109. }
  110. // 写入字符串函数
  111. void LCD_write_string(unsigned char x, unsigned char y, unsigned char *s) {
  112.         if (y == 0) {
  113.                 LCD_write_com(0x80 + x);
  114.         } else {
  115.                 LCD_write_com(0xc0 + x);
  116.         }
  117.         while (*s) {
  118.                 LCD_write_data(*s);
  119.                 s++;
  120.                 delay_nus(500);
  121.         }
  122. }
  123. //写入字符函数
  124. void LCD_write_char(unsigned char x, unsigned char y, unsigned char data) {
  125.         if (y == 0) {
  126.                 LCD_write_com(0x80 + x);
  127.         } else {
  128.                 LCD_write_com(0xc0 + x);
  129.         }
  130.         LCD_write_data(data);
  131.         delay_nus(500);
  132. }
  133. void LCD_INIT(void) {
  134.         DelayMs(15);
  135.         LCD_write_com(0x38); //显示模式
  136.         DelayMs(5);
  137.         LCD_write_com(0x38);
  138.         DelayMs(5);
  139.         LCD_write_com(0x38);
  140.         DelayMs(5);
  141.         LCD_write_com(0x38);
  142.         DelayMs(5);
  143.         LCD_write_com(0x08); //显示关闭
  144.         DelayMs(5);
  145.         LCD_write_com(0x01); //显示清屏
  146.         DelayMs(6);
  147.         LCD_write_com(0x06); //显示光标移动设置
  148.         DelayMs(5);
  149.         LCD_write_com(0x0c); //显示打开及光标设置
  150.         DelayMs(5);
  151. }

  152. int main() {
  153.         GPIO_Configuration();
  154.         LCD_INIT();
  155.         while (1) {
  156.                 LCD_write_char(2, 0, '0');
  157.                 LCD_write_char(3, 0, 'k');
  158.                 LCD_write_string(1, 1, "welcome to 515");
  159.         }
  160. }
复制代码


回复

使用道具 举报

发表于 2016-12-14 15:59:18 | 显示全部楼层
是不是太快了,延时时间不够,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-14 16:02:49 | 显示全部楼层
wqy_1000 发表于 2016-12-14 15:59
是不是太快了,延时时间不够,

应该不是,加电就一排方块
回复 支持 反对

使用道具 举报

发表于 2016-12-14 16:55:28 | 显示全部楼层
调调1602的对比度电位器试试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-14 16:59:52 | 显示全部楼层
本帖最后由 wangyu1221 于 2016-12-14 17:58 编辑

是不是因为stm32的gpio输出电平只有3.3V?要上拉?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-14 17:41:14 | 显示全部楼层
lising 发表于 2016-12-14 16:55
调调1602的对比度电位器试试。

无非是方块明显和不明显的区别了
回复 支持 反对

使用道具 举报

发表于 2016-12-15 00:21:20 | 显示全部楼层
wangyu1221 发表于 2016-12-14 17:41
无非是方块明显和不明显的区别了

那就程序的问题了。
回复 支持 反对

使用道具 举报

发表于 2016-12-15 11:37:45 | 显示全部楼层
搞好了吗?
回复

使用道具 举报

发表于 2016-12-16 16:29:19 | 显示全部楼层
显示方块 说明你的LCD根本都还没有 初始化 差你 通讯及初始化部分
回复 支持 反对

使用道具 举报

发表于 2016-12-16 19:43:10 | 显示全部楼层
给你个程序参考。F103

超声波 1602液晶显示.zip

338.59 KB, 下载次数: 107

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 11:54:37 | 显示全部楼层
aaa_keen 发表于 2016-12-16 16:29
显示方块 说明你的LCD根本都还没有 初始化 差你 通讯及初始化部分

嗯 地址错了,不是官方资料上的地址。。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 17:00 , Processed in 0.047540 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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