问答

汇集网友智慧,解决技术难题

21ic问答首页 - 新人求解,STM32F103的LCD12864串行模式的问题

新人求解,STM32F103的LCD12864串行模式的问题

yiyanfenghua2022-10-04
如何定义,这程序是否有问题,问题出在那?


#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LCD.h"


#define RST_0                GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define RST_1                GPIO_ResetBits(GPIOB,GPIO_Pin_15)

#define PSB_0                GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define PSB_1                GPIO_ResetBits(GPIOB,GPIO_Pin_14)

#define CS_0                GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define CS_1                GPIO_ResetBits(GPIOB,GPIO_Pin_13)

#define SID_0                GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define SID_1                GPIO_ResetBits(GPIOB,GPIO_Pin_12)

#define SCLK_0                GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define SCLK_1                GPIO_ResetBits(GPIOB,GPIO_Pin_11)


#define WRITE_CMD        0xF8//写命令  
#define WRITE_DAT        0xFA//写数据


void lcd12864_Init(void)
{       
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        SID_1;
        SCLK_1;
       
}


void send_dat(u8 dat)
{
        u8 i;
        for(i = 0;i < 8;i++)
    {
        if((dat& 0x80)==0x80)
                    SID_1;
                if((dat& 0x80)==0x00)
                        SID_0;
                SCLK_0;
                Delay_ms(50);
                SCLK_1;
                dat<<=1;
        }   
}

/*!
*  @brief      LCD写指令
*  @param  Cmd   要写入的指令
*/
void send_cmd(u8 Cmd )
{
     Delay_ms(1);   
     send_dat(WRITE_CMD);   
     send_dat(Cmd&0xf0);
     send_dat((Cmd&0x0f)<<4);
}

/*!
*  @brief      LCD写数据
*  @param  Dat   要写入的数据
*/
void write_char(u8 Dat )
{
         Delay_ms(1);
     send_dat(WRITE_DAT);
     send_dat(Dat&0xf0);
     send_dat((Dat&0x0f)<<4);
}
/*!
*  @brief      LCD初始化
*  @param  None
*/
void Lcd_Init(void)
{
        RST_0;
        Delay_ms(50);
        RST_1;
        Delay_ms(50);
        CS_1;
    Delay_ms(50);
        send_cmd(0x30);
    Delay_ms(1);
    send_cmd(0x0c);
    Delay_ms(1);
    send_cmd(0x01);
    Delay_ms(30);
        send_cmd(0x02);
    Delay_ms(30);
        send_cmd(0x80);
        PSB_0;
}
void lcd_addr(uint8_t y_add,uint8_t x_add)
{
        switch(y_add)
        {
                case 1:
                send_cmd(0x80|x_add);break;
                case 2:
                send_cmd(0x90|x_add);break;
                case 3:
                send_cmd(0x88|x_add);break;
                case 4:
                send_cmd(0x98|x_add);break;
        default:break;
        }
}

/*!
*  @brief      显示字符或汉字
*  @param  x: row(0~3)
*  @param  y: line(0~7)
*  @param         str: 要显示的字符或汉字
*/
void LCD_Display_Words(uint8_t y_add,uint8_t x_add , char *str)
{
        uint8_t i;
        lcd_addr(y_add,x_add);
        for(i=0;str!='\0';i++)
        {
                write_char(str);
        }
}

/*!
*  @brief      清屏函数
*  @param  None
*/
void LCD_Clear(void)
{
        send_cmd(0x01);
        Delay_ms(2);
}

回答 +关注 16
4882人浏览 8人回答问题 分享 举报
8 个回答

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