打印

stm32点亮1602 怎么感觉比51还难呢 程序也不知道哪出错了 求助啊 前辈

[复制链接]
3348|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yushan210|  楼主 | 2013-7-29 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32, IO, TI, pi, gp
#include "stm32f10x.h"
#include "stdio.h"
#define uchar unsigned char
#define lcd_rs  (*(volatile unsigned long *) (42220194))//        //pc odr5
//#define lcd_rw  (*(volatile unsigned long *) (4222019C))//        //pc7
//#define lcd_en  (*(volatile unsigned long *) (422181a4))        //pb9
//#define lcd_address

uchar  table[]={"welcom"};
/*******************************************************************************
* Function Name  : Delay
* Description    : Inserts a delay time.
* Input          : nCount: specifies the delay time length.
* Output         : None
* Return         : None
*******************************************************************************/
void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}
/*****************************************************************
**   函 数 名:
**   功    能:
**   参    数:
**   描    述:       
**   使用说明  
******************************************************************/  
void gpio_init()
{
RCC->APB2ENR |=1<<4;   //使能PORTC时钟 当外设时钟没有启用时,软件不能读出外设寄存器的数值     
RCC->APB2ENR |=1<<3;//portb enable                                                            //        时钟外设配置(2种方式)放在最前边   

  GPIOC->CRL&=0X0F0FFFff;//  先清空pc5 7     其他位设1不影响默认
  GPIOC->CRL|=0X30300000; // Pc5 7设置成输chu         50m
                        
  GPIOB->CRH&=0X0F0F0F0f;//  先清空pb9  11 13 15    其他位设1不影响默认
  GPIOB->CRH|=0X30303030; // Pb9 11 13 15设置成输出 50M 其中pb11 1315为数据口D0 D1 D2
  
  GPIOC->CRH&=0XFF000Ff0;
  GPIOC->CRH|=0X00333003;         //pc8 11 12 13  分别为数据口D3 D4 D5 D6

  GPIOB->CRL&=0XFF0FF0Ff;
  GPIOB->CRL|=0X00300300;         //PB5为D7  输出 50M
  
   GPIOC->BRR|=1<<7;//      lcd_rw=0;//only allow write not read pc7

}

/*****************************************************************
**   函 数 名:
**   功    能:
**   参    数:
**   描    述:
**   使用说明:  
******************************************************************/
void write_Fun(uint8_t fun)
{
   
    if(fun&0x01)GPIOB->BSRR|=1<<11;else GPIOB->BRR|=1<<11;
        if(fun&0x02)GPIOB->BSRR|=1<<13;else GPIOB->BRR|=1<<13;
    if(fun&0x04)GPIOB->BSRR|=1<<15;else GPIOB->BRR|=1<<15;
        if(fun&0x08)GPIOC->BSRR|=1<<8;else GPIOC->BRR|=1<<8;
        if(fun&0x10)GPIOC->BSRR|=1<<11;else GPIOC->BRR|=1<<11;
        if(fun&0x20)GPIOC->BSRR|=1<<12;else GPIOC->BRR|=1<<12;
    if(fun&0x40)GPIOC->BSRR|=1<<13;else GPIOC->BRR|=1<<13;
        if(fun&0x80)GPIOB->BSRR|=1<<5;else GPIOB->BRR|=1<<5;               
}
/*****************************************************************
**   函 数 名:
**   功    能:
**   参    数:
**   描    述:
**   使用说明:  
******************************************************************/  
void write_dat(uint8_t dat)
{

    //lcd_rs=1;
        GPIOC->BSRR|=1<<5;

        GPIOC->BRR|=1<<7;//      lcd_rw=0;//only allow write not read pc7
        GPIOB->BRR|=(1<<9); // lcd_en=0;        //  pb9
//  lcd_address[i]=dat&0x80;
            Delay(3800);       
                 write_Fun(dat);
    GPIOB->BSRR|=1<<9;//        lcd_en=1;
           Delay(18000);
        GPIOB->BRR|=(1<<9); // lcd_en=0;        //  pb9
}
/*********************************************************************
**   函 数 名:   
**   功    能:
**   参    数:
**   描    述:
**   使用说明  
**********************************************************************/  
void write_com(uint8_t comm)
{
  
GPIOC->BRR|=1<<5;// lcd_rs =0;
  
  GPIOC->BRR|=1<<7;//      lcd_rw=0;//only allow write not read pc7
  GPIOB->BRR|=(1<<9);// lcd_en=0;
    //  lcd_address=comm&0x80;
   Delay(3800);         
   write_Fun(comm);
   GPIOB->BSRR|=1<<9;//lcd_en=1;
           Delay(12000);
    GPIOB->BRR|=(1<<9); // lcd_en=0;        //  pb9
}

/*****************************************************************
**   函数库说明:
**   版      本:
**   修      改:
**   修改  日期:
**   使用  说明:
**   版本  更新:   
******************************************************************/  
void Lcd1602_Init()
{
  gpio_init();
  write_com(0x38);
  Delay(25000);
   write_com(0x38);
  Delay(25000);
  write_com(0x08);
  write_com(0x0c);
  write_com(0x06);
  write_com(0x01);
  

}
/*****************************************************************
**   注意:
**   PA0与PA1口经过键盘接地,所以需开两个IO的上拉,具体见程序  
******************************************************************/  
      
int main(void)
{
  
  uchar i;
// gpio_init();
  Lcd1602_Init();
  GPIOB->BRR|=1<<5;

  
            write_com(0x80+3);
          for(i=0;i<6;i++)
          {
            write_dat(table[i]);
                Delay(3000000);
          }
        while(1);  
  
  

}
沙发
heenson| | 2013-7-29 21:27 | 只看该作者
查看时钟正确否,IO驱动频率是否过高,定义正确否,STM32是最易上手的片子,仔细研读datasheet

使用特权

评论回复
板凳
a2582006460| | 2013-7-30 10:57 | 只看该作者
楼主,您的代码风格太乱,前面的函数描述也没写,刚入门对代码的风格培养很重要的,不然别人很难看下去,我带为整理了一下。还有你函数前的描述要写一下
#include "stm32f10x.h"
#include "stdio.h"
#define uchar unsigned char
#define lcd_rs  (*(volatile unsigned long *) (42220194))//        //pc odr5


uchar  table[]={"welcom"};
/*******************************************************************************
* Function Name  : Delay
* Description    : Inserts a delay time.
* Input          : nCount: specifies the delay time length.
* Output         : None
* Return         : None
*******************************************************************************/
void Delay(vu32 nCount)
{
        for(; nCount != 0; nCount--);
}
/*****************************************************************
**   函 数 名:
**   功    能:
**   参    数:
**   描    述:        
**   使用说明  
******************************************************************/  
void gpio_init()
{
        RCC->APB2ENR |=1<<4;   //使能PORTC时钟     
        RCC->APB2ENR |=1<<3;   //portb enable                                                            //        时钟外设配置(2种方式)放在最前边   
       
        GPIOC->CRL&=0X0F0FFFff;//  先清空pc5 7     其他位设1不影响默认
        GPIOC->CRL|=0X30300000; // Pc5 7设置成输chu         50m
                                 
        GPIOB->CRH&=0X0F0F0F0f;//  先清空pb9  11 13 15    其他位设1不影响默认
        GPIOB->CRH|=0X30303030; // Pb9 11 13 15设置成输出 50M 其中pb11 1315为数据口D0 D1 D2
          
        GPIOC->CRH&=0XFF000Ff0;
        GPIOC->CRH|=0X00333003;         //pc8 11 12 13  分别为数据口D3 D4 D5 D6
       
        GPIOB->CRL&=0XFF0FF0Ff;
        GPIOB->CRL|=0X00300300;         //PB5为D7  输出 50M
          
        GPIOC->BRR|=1<<7;//      lcd_rw=0;//only allow write not read pc7

}

/*****************************************************************
**   函 数 名:
**   功    能:
**   参    数:
**   描    述:
**   使用说明:  
******************************************************************/
void write_Fun(uint8_t fun)
{
        if(fun&0x01)
                GPIOB->BSRR|=1<<11;
        else
                GPIOB->BRR|=1<<11;
        if(fun&0x02)
                GPIOB->BSRR|=1<<13;
        else
                GPIOB->BRR|=1<<13;
        if(fun&0x04)
                GPIOB->BSRR|=1<<15;
        else
                GPIOB->BRR|=1<<15;
        if(fun&0x08)
                GPIOC->BSRR|=1<<8;
        else
                GPIOC->BRR|=1<<8;
        if(fun&0x10)
                GPIOC->BSRR|=1<<11;
        else
                GPIOC->BRR|=1<<11;
        if(fun&0x20)
                GPIOC->BSRR|=1<<12;
        else
                GPIOC->BRR|=1<<12;
        if(fun&0x40)
                GPIOC->BSRR|=1<<13;
        else
                GPIOC->BRR|=1<<13;
        if(fun&0x80)
                GPIOB->BSRR|=1<<5;
        else
                GPIOB->BRR|=1<<5;               
}
/*****************************************************************
**   函 数 名:
**   功    能:
**   参    数:
**   描    述:
**   使用说明:  
******************************************************************/  
void write_dat(uint8_t dat)
{
        GPIOC->BSRR|=1<<5;        //lcd_rs=1;
       
        GPIOC->BRR|=1<<7;//lcd_rw=0;//only allow write not read pc7
        GPIOB->BRR|=(1<<9); // lcd_en=0;        //  pb9
        //  lcd_address[i]=dat&0x80;
        Delay(3800);        
        write_Fun(dat);
        GPIOB->BSRR|=1<<9;//lcd_en=1;
        Delay(18000);
        GPIOB->BRR|=(1<<9); // lcd_en=0;        //  pb9
}
/*********************************************************************
**   函 数 名:   
**   功    能:
**   参    数:
**   描    述:
**   使用说明  
**********************************************************************/  
void write_com(uint8_t comm)
{   
        GPIOC->BRR|=1<<5;// lcd_rs =0;
          
        GPIOC->BRR|=1<<7;//      lcd_rw=0;//only allow write not read pc7
        GPIOB->BRR|=(1<<9);// lcd_en=0;
        //  lcd_address=comm&0x80;
        Delay(3800);         
        write_Fun(comm);
        GPIOB->BSRR|=1<<9;//lcd_en=1;
        Delay(12000);
        GPIOB->BRR|=(1<<9); // lcd_en=0;        //  pb9
}

/*****************************************************************
**   函数库说明:
**   版      本:
**   修      改:
**   修改  日期:
**   使用  说明:
**   版本  更新:   
******************************************************************/  
void Lcd1602_Init()
{
        gpio_init();
        write_com(0x38);
        Delay(25000);
        write_com(0x38);
        Delay(25000);
        write_com(0x08);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
/*****************************************************************
**   注意:
**   PA0与PA1口经过键盘接地,所以需开两个IO的上拉,具体见程序  
******************************************************************/  
      
int main(void)
{
        uchar i;
        // gpio_init();
        Lcd1602_Init();
        GPIOB->BRR|=1<<5;
        write_com(0x80+3);
        for(i=0;i<6;i++)
        {
                write_dat(table[i]);
                Delay(3000000);
        }
        while(1);  
}


我看了一下代码,发现你没有写检测忙碌函数,stm32是高速的单片机,必须要检测忙碌才行。而且你写的这些函数好像多不怎么规范。不知道你以前用过1602 没有最好搞一个别人的代码看看。很久没用过1602了。也记不太清楚了。

使用特权

评论回复
地板
电子农民工| | 2013-7-30 11:02 | 只看该作者
你没有写时钟配置函数?

使用特权

评论回复
5
yushan210|  楼主 | 2013-11-15 12:14 | 只看该作者
真不好意思 各位 大家的问题小弟接受了 还有问题出现在 stm32是3.3v电源,我没有用245电平转换芯片,所以根本是驱动不起来的

使用特权

评论回复
6
yushan210|  楼主 | 2013-11-15 12:14 | 只看该作者
电子农民工 发表于 2013-7-30 11:02
你没有写时钟配置函数?

写了 在初始化里

使用特权

评论回复
7
yushan210|  楼主 | 2013-11-15 12:15 | 只看该作者
a2582006460 发表于 2013-7-30 10:57
楼主,您的代码风格太乱,前面的函数描述也没写,刚入门对代码的风格培养很重要的,不然别人很难看下去,我 ...

OK 谨记谨记

使用特权

评论回复
8
yushan210|  楼主 | 2013-11-15 12:15 | 只看该作者
heenson 发表于 2013-7-29 21:27
查看时钟正确否,IO驱动频率是否过高,定义正确否,STM32是最易上手的片子,仔细研读datasheet ...

好 谢谢

使用特权

评论回复
9
香水城主| | 2013-11-15 12:23 | 只看该作者
51是8位的,STM32是32位的,差了四倍,难了四倍,所以你要加四倍努力,:D

使用特权

评论回复
10
ewindiy| | 2013-11-15 13:27 | 只看该作者
RCC gpio 引脚时钟问题

使用特权

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

本版积分规则

7

主题

111

帖子

2

粉丝