我用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
哈哈你眼睛好尖啊,这都看出来了
自己也常犯这样的错误。
非常感谢,已经改过了!!!
一周热门 更多>