微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为什么非要先执行printc,再执行prints?

为什么非要先执行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未被调用

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top