我用STM32迷你版做一个12864菜单显示,但是在编译过程中总是报错,不知道怎么处理?

2019-07-21 03:18发布

我用STM32mini版做控制板,用12864做液晶显示,做一个由按键控制LED灯,同时在12864上用来显示,可是在编译的过程中,lcd.c中命名的一个函数Dispaly_LCD_String(u8 x,u8 *p,u8 time),在menu.c中调用的时候,总是提醒没有提前声明函数,不知道怎么处理,还请帮忙!!
报错信息如下:
..HARDWAREMENUmenu.c(15): warning:  #223-D: function "Display_LCD_String" declared implicitly
..OBJTemplate.axf: Error: L6218E: Undefined symbol Display_LCD_String (referred from menu.o).

主要代码如下:
lcd.c
#include "lcd.h"
#include "delay.h"

void Send_Byte(u8 zdata)
{
        u16 i;
        for(i=0;i<8;i++)
        {
                if((zdata<<i)& 0x80)
                        SID_H;
           else
          
                        SID_L;
                    SCLK_H;
                    SCLK_L;               
     }
}

u8 Receive_Byte(void)
{
        u8 i,temp1,temp2,value;
        temp1=0;
        temp2=0;
        for(i=0;i<8;i++)
        {
                temp1=temp1<<1;
                SCLK_L;
                SCLK_H;
                SCLK_L;
                if(GPIO_ReadInputDataBit(GPIOB,DAT_128))
                {
                        temp1++;

        }
    }
        for(i=0;i<8;i++)
        {
                temp2=temp2<<1;
                SCLK_L;
                SCLK_H;
                SCLK_L;
                if(GPIO_ReadInputDataBit(GPIOB,DAT_128))
                {
                        temp2++;
        }
    }
        temp1=0xf0&temp1;
        temp2=0x0f&temp2;
        value=temp1+temp2;
        return value;
}

void Check_Busy(void)
{
        do
                Send_Byte(0xfc);
        while(0x80&Receive_Byte());
}
void Write_LCD_Command(u8 cmdcode)
{
        CS_H;
        Check_Busy();
        Send_Byte(0xf8);
        Send_Byte(cmdcode&0xf0);
        Send_Byte((cmdcode<<4)&0xf0);
        delay_ms(2);
        CS_L;
}

void Write_LCD_Data(u8 Dispdata)
{
        CS_H;
        Check_Busy();
        Send_Byte(0xfa);
        Send_Byte(Dispdata&0xf0);
        Send_Byte((Dispdata<<4)&0xf0);
        delay_ms(2);
        CS_L;
}

u8 Read_Data(void)
{
        Check_Busy();
        Send_Byte(0xfe);
        return Receive_Byte();

}

void LCD_Clear_TXT(void)
{
        u8 i;
        Write_LCD_Command(0x30);
        Write_LCD_Command(0x80);
        for(i=0;i<64;i++)
        {
                Write_LCD_Data(0x20);
    }
}

void LCD_Clear_BMP(void)
{
        u8 i,j;
        Write_LCD_Command(0x34);
        Write_LCD_Command(0x36);
        for(i=0;i<32;i++)
        {
                Write_LCD_Command(0x80|i);
                Write_LCD_Command(0x80);
                for(j=0;j<32;j++)
                Write_LCD_Data(0);

    }

}

void Dispaly_LCD_String(u8 x,u8 *p,u8 time)
{
        u8 i,addr,num;
        num=sizeof(p);
        switch(x)
        {
                case 0:addr=0x80;break;
                case 1:addr=0x90;break;
                case 2:addr=0x88;break;
                case 3:addr=0x98;break;
    }


        Write_LCD_Command(addr);
        for(i=0;i<(num*4);i++)
        {
                Write_LCD_Data(*(p++));
                delay_ms(time);
    }
}


menu.c
#include "menu.h"
#include "delay.h"
#include "key.h"
#include "led.h"

u8 MenuItem_0[]={" Select:       "};
u8 MenuItem_1[]={"  light led1   "};
u8 MenuItem_2[]={"  light led2   "};
u8 MenuItem_3[]={"  light two led"};


void DisplayMenu(u8 cur)
{
        Display_LCD_String(0,MenuItem_0,1);
        switch(cur)
        {
                case 1:
                        MenuItem_1[1]=26;
                        MenuItem_2[1]=0x20;
                        MenuItem_3[1]=0x20;
                        Display_LCD_String(1,MenuItem_1,1);
                        Display_LCD_String(2,MenuItem_2,1);
                        Display_LCD_String(3,MenuItem_3,1);
                    break;
                case 2:
                        MenuItem_1[1]=0x20;
                        MenuItem_2[1]=26;
                        MenuItem_3[1]=0x20;
                    Display_LCD_String(1,MenuItem_1,1);
                        Display_LCD_String(2,MenuItem_2,1);
                        Display_LCD_String(3,MenuItem_3,1);
                        break;
                case 3:
                        MenuItem_1[1]=0x20;
                        MenuItem_2[1]=0x20;
                        MenuItem_3[1]=26;
                        Display_LCD_String(1,MenuItem_1,1);
                        Display_LCD_String(2,MenuItem_2,1);
                        Display_LCD_String(3,MenuItem_3,1);
                        break;
    }
}


lcd.h

#ifndef __LCD_H
#define __LCD_H
#include "sys.h"

#define DAT_128     GPIO_Pin_9
#define SID_H                GPIO_SetBits(GPIOB,DAT_128)
#define SID_L                GPIO_ResetBits(GPIOB,DAT_128)

#define CS_128                GPIO_Pin_8
#define CS_H                GPIO_SetBits(GPIOB,CS_128)
#define CS_L                GPIO_ResetBits(GPIOB,CS_128)

#define SCLK_128        GPIO_Pin_10
#define SCLK_H                GPIO_SetBits(GPIOB,SCLK_128)
#define SCLK_L                GPIO_ResetBits(GPIOB,SCLK_128)

void Send_Byte(u8 zdata);
u8 Receive_Byte(void);
void Check_Busy(void);
void Write_LCD_Command(u8 cmdcode);
void Write_LCD_Data(u8 Dispdata);
u8 Read_Data(void);
void LCD_Clear_TXT(void);
void LCD_Clear_BMP(void);
void Display_LCD_Pos(u8 x,u8 y);
void Disp_HZ(u8 X,const u8 *pt,u8 num);
void Dispaly_LCD_String(u8 x,u8 *p,u8 time);
void PutBMP(u8 *puts);

void Draw_Dots(u8 x,u8 y,u8 color);
void Draw_Update(void);
void Draw_Clear(void);
void Draw_Char4x5(u8 x,u8 y,u8 value);
void Draw_Char4x5Line(u8 x,u8 y,u8 *value,u8 len);
void LCD12864_Init(void);


#endif



menu.h

#ifndef __MENU_H
#define __MENU_H
#include "sys.h"

void DisplayMenu(u8 cur);
void ExecuteFuntion(u8 cur);
void KeyPressed(u8 cur);


#endif







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。