关于函数重入的疑惑
这是重入问题,贴上来看一下呢,应该是定义声明问题吧
我觉得应该也是,因为我在刚开始学模块化编程,我试着把主函数所在文件一个一个往另外一个模块文件移动并在.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
多谢大侠!