打印

麻烦各位帮我看看STM32的LCD1602程序。急!

[复制链接]
3971|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
over_chain|  楼主 | 2013-4-8 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是源程序,问题就是不能显示。麻烦各位帮看看,初学STM32。
lcd.h文件
#include "stm32f10x.h"
#define LCD_RS_1 GPIOC->BSRR=GPIO_Pin_0 //PC.0--(LCD)RS
#define LCD_RS_0 GPIOC->BRR =GPIO_Pin_0
#define LCD_RW_1 GPIOC->BSRR=GPIO_Pin_1 //PC.1--(LCD)RW
#define LCD_RW_0 GPIOC->BRR =GPIO_Pin_1
#define LCD_EN_1 GPIOC->BSRR=GPIO_Pin_2 //PC.2--(LCD)E
#define LCD_EN_0 GPIOC->BRR =GPIO_Pin_2
#define LcdData  GPIOC->ODR        //PC[3..10]--(LCD)D0~D7
void delay_nus(unsigned long n);
void delay_nms(unsigned long n);
unsigned char Lcd_CheckBusy(void);
void Lcd_WriteData(unsigned char Data);
void LCD_write_com(unsigned char com);
void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char *Str);
void Lcd_INIT();

lcd.c文件
#include "stm32f10x.h"
#include "lcd.h"
#include <stdio.h>
#define uchar unsigned char
#define uint  unsigned int




//延时n us
void delay_nus(unsigned long n)
{
unsigned long j;
while(n--)
{ j=8;
   while(j--);
}
}
//延时n ms
void delay_nms(unsigned long n)
{
while(n--)
    delay_nus(1100);
}
/*************
测试LCD是否处于忙状态
如果忙则返回0x80,否则返回0
**************/
unsigned char Lcd_CheckBusy(void)
{
   // GPIO_Write(GPIOC,0xFF);
    LCD_RS_0;
    delay_nus(1);
    LCD_RW_1;
    delay_nus(1);
    do
    {
    LCD_EN_0;
    delay_nus(200);
    LCD_EN_1;
    delay_nus(200);
    }while(GPIOC->IDR&0X80);
   return (u8)0;
}
/*********************************
向LCD写入字节数据
**********************************/
void Lcd_WriteData(unsigned char Data)
{  
    LCD_EN_0;
    delay_nus(1);
    LCD_RS_1;
    delay_nus(1);
    LCD_RW_0;
    delay_nus(1);
    LcdData=Data;
    delay_nus(500);
    LCD_EN_1;
    delay_nms(1);
    LCD_EN_0;
    delay_nus(100);
}
/*************************************
想LCD中写入指令代码
**************************************/
void LCD_write_com(unsigned char com)
{
//while(LCD_check_busy()); //忙则等待
LCD_EN_0;
delay_nus(1);
LCD_RS_0;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
LcdData=com;
delay_nus(500);
LCD_EN_1;
delay_nms(1);
LCD_EN_0;
delay_nus(100);
}


/*************************************
向LCD指定起始位置写入一个字符串
*************************************/
void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char *Str)
{
    if (y == 0)
    {
      LCD_write_com(0x80+x);
    }
    else
    {
      LCD_write_com(0xc0+x);
    }
    while (*Str)
    {
      Lcd_WriteData(*Str);
      Str++;
      delay_nus(500);
    }
}




/****************************************
LCD初始化
*****************************************/
void Lcd_INIT()
{  
delay_nms(15);
LCD_write_com(0x38); //显示模式
delay_nms(5);
LCD_write_com(0x38);
delay_nms(5);
LCD_write_com(0x38);
delay_nms(5);
LCD_write_com(0x38);
delay_nms(5);
LCD_write_com(0x08); //显示关闭
delay_nms(5);
LCD_write_com(0x01); //显示清屏
delay_nms(6);
LCD_write_com(0x06); //显示光标移动设置
delay_nms(5);
LCD_write_com(0x0c); //显示打开及光标设置
delay_nms(5);
}

main.c文件
#include "stm32f10x.h"
#include "stdio.h"
#include "lcd.h"
#include "rs485.h"
void RCC_Configuration()
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);//使能HSE
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
    RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK=SYSCLK
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource()!=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
}

//GPIO配置函数
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_Init(GPIOC, &GPIO_InitStructure);     
  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //PC.0~2
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}
int main(void)
{
  RCC_Configuration();
GPIO_Configuration();
Lcd_INIT();
while(1)
{
  Lcd_WriteStr(0,0,"happy");
}
}

相关帖子

沙发
zaffwong| | 2013-4-9 18:01 | 只看该作者
好长,能仿真否?

使用特权

评论回复
板凳
rgh111| | 2013-4-9 20:42 | 只看该作者
貌似这玩意儿不能一直写吧,你在主循环里面做个延时,让它喘口气儿试试:P

使用特权

评论回复
地板
天岩圣老| | 2013-4-21 17:04 | 只看该作者
敢问楼主问题解决了没有。。。。。。我也遇到你同样的问题了,希望能够帮助讨论下。

使用特权

评论回复
5
heavyrain| | 2013-5-12 14:32 | 只看该作者
你GPIO配置和#define LcdData  GPIOC->ODR        //PC[3..10]--(LCD)D0~D7声明,不一致,检查忙的pin也就错了。

使用特权

评论回复
6
emcwhvri| | 2016-3-3 00:23 | 只看该作者
你定义的lcd数据线为PC3-PC10;所以,读回来的数据忙位在第11位,也就是Pin_10;所以,你应该判断的读数与(0000 0100 0000 0000)b,这样就好了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

24

帖子

1

粉丝