单片机学习小组
直播中

魏天霞

7年用户 210经验值
私信 关注

STM32F103C8T6控制1602液晶显示

#include"STM32f10x_lib.h"
//定义LCD的RS,RW,EN=0时分别是 Set_RS,Set_RW,Set_EN
#define Set_RS (GPIO_SetBits(GPIOB,GPIO_Pin_0))
#define Set_RW (GPIO_SetBits(GPIOB,GPIO_Pin_1))
#define Set_EN (GPIO_SetBits(GPIOB,GPIO_Pin_2))
//定义RS,RW,EN=1时分别是CLR_RS,CLR_RW,CLR_EN
#define CLR_RS (GPIO_ResetBits(GPIOB,GPIO_Pin_0))
#define CLR_RW (GPIO_ResetBits(GPIOB,GPIO_Pin_1))
#define CLR_EN (GPIO_ResetBits(GPIOB,GPIO_Pin_2))
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
void Delay(u32 count)
{  //定义无符号长整型变量count
    for(;count!=0;count--);

}
unsigned char table[]="liushuai";
unsigned char table1[]="2009.12.21";
//写指令
void Send_Com(unsigned char Send_Com)
{
    u16 Temp;//定义短整型变量Temp,由于STM32F103C8的GPIOA恰好有16个IO口。
    Delay(0xAFFFF);
    CLR_RS;
    Temp=GPIO_ReadOutputData(GPIOA);//读回GPIOA发送寄存器的数据。
    Temp&=0xff00;//将GPIOA的高8位保留,低8位清0.

    Temp|=(u16)Send_Com;//将char型变量Send_Com强制转换成short(短整型),其中高8位由0代替,低8位是Send_Com的值
    GPIO_Write(GPIOA,Temp);
    Delay(100);
    Set_EN;
    Delay(100);
    CLR_EN;
}
//写数据
void Send_Dat(unsigned char Send_Dat)
{
     u16 Temp;//定义短整型变量Temp,由于STM32F103C8的GPIOA恰好有16个IO口。
    Set_RS;
Temp=GPIO_ReadOutputData(GPIOA);//读回发送寄存器内的数据
Temp&=0xff00;
Temp|=(u16)Send_Dat;
GPIO_Write(GPIOA,Temp);
Delay(100);
     Set_EN;
Delay(500);
     CLR_EN;
}
void init()
{

   CLR_EN;
   //Delay(0xAFFF);
   Send_Com(0x38);    //置初值//
   Send_Com(0x0c);
   Send_Com(0x06);
   Send_Com(0x80);
}
void GPIO_Configuration(void)
{

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);



    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;

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void RCC_Configuration(void)
{


   RCC_DeInit();





      RCC_HSEConfig(RCC_HSE_ON);

      HSEStartUpStatus= RCC_WaitForHSEStartUp();


   if(HSEStartUpStatus==SUCCESS)

{



    RCC_HCLKConfig(RCC_SYSCLK_Div1);




    RCC_PCLK2Config(RCC_HCLK_Div1);


       RCC_PCLK1Config(RCC_HCLK_Div2);


     FLASH_SetLatency(FLASH_Latency_2);



     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


     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);
       }
}

int main(void)
{
   #ifdef DEBUG
   debug();
   #endif
   unsigned char num;
   RCC_Configuration();
   GPIO_Configuration();
   init();
   for(;;)
   {
     for(num=0;num<8;num++)
   {
    Send_Dat(table[num]);
    Delay(2000000);
   }
    //while(1);
     //Send_Com(0x01);
   Delay(20000);
   Send_Com(0x80+0x40);
   for(num=0;num<10;num++)
   {
    Send_Dat(table1[num]);
    Delay(2000000);
   }
     while(1);
   }



}

更多回帖

发帖
×
20
完善资料,
赚取积分