为什么非要先执行printc,再执行prints?
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#include"LCD1602.h"
void main(void)
{
LCD_initial( );
LCD_set_position(0);
LCD_printc('a'); //如果删除红色字体的这两句,keil就无法编译成功
LCD_cls( ); //为什么非要先执行printc,再执行prints?
LCD_prints("lele I love you!");
LCD_set_position(0x40);
LCD_prints("lele I love you!");
while(1)
{
}
}
以下是LCD1602.h
#ifndef __LCD_H__
#define __LCD_H__
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位
//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C //显示开
#define LCD_DISPLAY_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //光标显示
#define LCD_CURSOR_OFF 0x08 //光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
void LCD_cls(void);
void LCD_write_data(unsigned char);
void LCD_initial(void);
void LCD_set_position(unsigned char);
void LCD_prints(unsigned char *);
void LCD_printc(unsigned char);
#endif
这里以下是lcd1602.c程序
#include "hardware.h"
#include "lcd1602.h"
void LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢
{
while(1)
{
LCD_EN=0;
LCD_RS=0;
LCD_RW=1;
LCD_DATA=0xff;
LCD_EN=1;
if(!LCD_BUSY)break;
}
LCD_EN=0;
}
void LCD_cls(void) //LCD清屏
{
LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=1;
LCD_EN=1;
LCD_EN=0;
}
void LCD_write_instruction(unsigned char LCD_instruction) //写指令到LCD
{
LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=LCD_instruction;
LCD_EN=1;
LCD_EN=0;
}
void LCD_write_data(unsigned char LCD_data) //输出一个字节数据到LCD
{
LCD_check_busy();
LCD_RS=1;
LCD_RW=0;
LCD_DATA=LCD_data;
LCD_EN=1;
LCD_EN=0;
}
void LCD_set_position(unsigned char x) //LCD光标定位到x处
{
LCD_write_instruction(0x80+x);
}
/*
void LCD_go_home(void) //LCD光标归位
{
LCD_write_instruction(LCD_GO_HOME);
}
*/
void LCD_printc(unsigned char lcd_data) //输出一个字符到LCD
{
LCD_write_data(lcd_data);
}
void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD
{
unsigned char i=0;
while(lcd_string!=0x00)
{
LCD_write_data(lcd_string);
i++;
}
}
void LCD_initial(void) //初始化LCD
{
LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);
LCD_cls();
}
警告一般是可以忽略的,这个警告只是告诉你printc没有被调用;
编译器发现你设计了一个没有用到的函数printc,可以在LCD1602.C中将printc函数删除,就可以避免这个警告了;
去掉红色两句,编译结果是:
Build target 'Target 1'
compiling my1602mail.c...
compiling LCD1602.C...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_LCD_PRINTC?LCD1602
Program Size: data=12.0 xdata=0 code=230
creating hex file from "aaa"...
"aaa" - 0 Error(s), 1 Warning(s).
每次仿真输出前要先输出一个字符然后再cls清屏最后再输出字符串
各位大大帮帮我吧!
编译通过了,但是存在警告,指针操作不当。
提示里面没有指针操作不当啊?
谢谢woodmice,确实存在多余函数princ未被调用
栏目分类
射频专业培训教程推荐