微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于函数重入的疑惑

关于函数重入的疑惑

时间:10-02 整理:3721RD 点击:
我在做LCD液晶显示的时候有一个函数放到主函数所在模块没有问题,可是当放到另外一个模块文件并声明以后就会发出函数重入的警告。把它移回主模块又恢复正常,这是为什么呢?

这是重入问题,贴上来看一下呢,应该是定义声明问题吧

我觉得应该也是,因为我在刚开始学模块化编程,我试着把主函数所在文件一个一个往另外一个模块文件移动并在.H文件里生命的时候有的函数移动完没问题,有的却会出函数重入警告。虽然程序还能正常运行,但是肯定是有问题吧。
ss.h
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;   //1602的数据/指令选择控制线
sbit rw=P3^3;   //1602的读写控制线
sbit en=P3^4;    //1602的使能控制线  //
sbit set=P2^1;
sbit add=P2^2;
sbit sub=P2^3;
sbit reset=P2^0;
void write_cmd(uchar cmd);
void delay(uint n);

main.c
#include <reg52.h>
#include <intrins.h>
#include "ss.h"
uchar menu;
uchar display_flag=1;
uchar hh=12,mm,ss;

void write_dat(uchar dat)  //写数据 //1602写数据函数      
{
  rs=1;  //选择数据寄存器
  rw=0;   //选择写
  P1=dat;  //把要显示的数据送入P1
  delay(5);   //延时一小会儿,让1602准备接收数据
  en=1;         //使能线电平变化,数据送入1602的8位数据口
  en=0;
}
void write_pos(uchar pos)   //字符显示地址函数
{
  write_cmd(pos|0x80);
}
void init()  //初始化函数
{
  en=0;
  write_cmd(0x38);//8位数据,两行,5*8字形
  write_cmd(0x0c);//开启显示屏,开光标,光标闪烁 //0x0c
  write_cmd(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
  write_cmd(0x01);//清屏
  write_pos(0x80);
  delay(1);
}
void display(uchar d)
{
        uchar q,w;
        q=d%10;
        w=d/10;
        write_dat('0'+w);
        write_dat('0'+q);
}
void fresh_it(uchar d)
{
switch(d)
                        {
                                case 1:write_cmd(0x01);
                                write_cmd(0x80);
                                display(hh);break;
                                case 2:write_cmd(0x01);
                                write_cmd(0x83);
                                display(mm);break;
                                case 3:write_cmd(0x01);
                                write_cmd(0x86);
                                display(ss);break;
                                case 4:display_flag=1;
                                menu=0;       
                        }                       
       
}
void cct() interrupt 1
{
        uchar temp;
        TH0=0x3c;
        TL0=0xB0;
        temp++;
        if(temp==20)
        {
                temp=0;
                ss++;
        }
        if(ss==60)
        {
                ss=0;
                mm++;
        }
        if(mm==60)
        {
                mm=0;
                hh++;
        }
        if(display_flag)
        {
        write_pos(0x80);
        display(hh);
        write_dat(':');
        display(mm);
        write_dat(':');
        display(ss);
        }
}
void key_delay()
{
        uchar d,t;
        for(d=0;d<10;d++)
                for(t=0;t<255;t++)
                        ;
}
void main()
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xB0;
        EA=1;
        ET0=1;
        TR0=1;
  init();
  delay(10);
  while(1)
  {
          if(~set)
                {
                        TR0=0;
                        menu++;
                        key_delay();
                        while(~set);
                        display_flag=0;
                        if(menu==4)
                        {
                                menu=0;
                                TR0=1;
                                display_flag=1;
                        }
                        if(menu)
                        fresh_it(menu);
                }
                if(~add)
                {
                        key_delay();
                        while(~add);
                        switch(menu)
                        {
                                case 1:hh=hh+1;break;
                                case 2:mm++;break;
                                case 3:ss++;break;
                                case 0:break;
                        }
                        fresh_it(menu);
                }
                if(~sub)
                {
                        key_delay();
                        while(~sub);
                        switch(menu)
                        {
                                case 1:hh--;break;
                                case 2:mm--;break;
                                case 3:ss--;break;
                                case 0:break;
                        }
                        fresh_it(menu);
                }
                if(hh>=24)
                        hh=hh%24;
                if(mm>=60)
                        mm=mm%60;
                if(ss>=60)
                        ss=ss%60;
                if(hh<0)
                        hh=23;
                if(mm<0)
                        mm=59;
                if(ss<0)
                        ss=59;
                if(~reset)
                {
                        key_delay();
                        while(~reset);
                        hh=12;
                        mm=0;
                        ss=0;
                }
  }
}

tt.c
#include <reg52.h>
#include "ss.h"
void write_cmd(uchar cmd) //写指令 单片机给1602写指令
{  bit lcd_bz();                       //1602接收到命令后,不用存储,直接由HD44780执行并产生相应动作  
  rs=0;       //选择指令寄存器
  rw=0;       //选择写
  P1=cmd;     //把命令字送入P1
  delay(5);   //延时一小会儿,让1602准备接收数据
  en=1;        //使能线电平变化,命令送入1602的8位数据口
  en=0;
}
void delay(uint n)       //延时函数                       
{
    uint x,y;
    for(x=n;x>0;x--)
        for(y=110;y>0;y--);
}
往 tt.c中移动第一个write_cmd的时候程序正常,现在又移动了delay函数之后就是这个错误
*** WARNING L15: MULTIPLE CALL TO SEGMENT
    SEGMENT: ?PR?_DISPLAY?TEST
    CALLER1: ?C_C51STARTUP
    CALLER2: ?PR?CCT?TEST

多谢大侠!

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

网站地图

Top