找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8791|回复: 6
收起左侧

请教*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS要怎么消除?

[复制链接]
ID:130231 发表于 2017-9-4 13:58 | 显示全部楼层 |阅读模式
//----------------------------------------------------------------------------------------------------------------------------------
//程序名:  main.c  2017/8/16
//程序功能:安卓手机蓝牙控制继电器程序并用1602显示*
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar buf[10]=0;  //接收缓存数组
uchar  r_x=0;//接收计数
uchar  r_flag=0;//接收成功标志
sbit SPK=P0^5;
sbit DA =  P1^7;//继电器1
sbit DB =  P1^6;//继电器2
sbit DC =  P1^5;//继电器3
sbit DD =  P1^4;//继电器4
sbit RS=P2^6;                                   // 引脚定义  
sbit RW=P2^5;                                                           
sbit EN=P2^7;      
sbit busy=P0^7;                                 // "忙"标志位
void fs_d () ;   
#define LCD P0                                  //命令或数据线
unsigned char code TAB1[]={"Welcome to use"};     //欢迎用语
unsigned char code TAB2[]={"Light up"};     //点亮字符
unsigned char code TAB3[]={"open"};   //定义字符打开
unsigned char code TAB4[]={"Shut down"};   //定义字符关闭
unsigned char code digit[10]={"0123456789"};     //定义字符数组显示数字
//------------------------------------  延时函数  -------------------------------------------
void delay(unsigned int t)                      //延时若干微秒
{
   while(t--);
}
//----------------------------------------- 发声函数 ----------------------------------------------

  void  fs_d ()                                         
    {   
      unsigned int j,y;                        // 声明无符号整型变量j, y        
       {                    
         for(y=0;y<1000;y++)                   //循环1000次,嘀响0.5s
          {  
            SPK=~SPK;                          //反相输出
         for(j=0;j<50;j++);                 //延时约500μs
           }  
        delay(200);                                       
      }                                          
   }
  
//---------------------------------- 判断液晶显示器是否忙函数 ----------------------------------
void CHECK_BF()                                      //判断是否忙碌
{
  do
   {
    LCD=0xff;   
    RS=0;                                       // RS=0,选择指令寄存器
    RW=1;                                       // RW=1,选择读模式
    EN=0;                                       // 执行显示命令
    EN=1;                                       // 允许读/写
   }  
  while(busy);                                  //busy为高电平表示忙,循环等待
}
//--------------------------------------  写命令函数  -----------------------------------
void WR_COMM()                                       //写命令
{
  RS=0;                                         // RS=0,选择指令寄存器
  RW=0;                                         // RW=0,选择写模式
  EN=0;                                         // 执行显示命令
  CHECK_BF();                                   // 等待
  EN=1;                                         // E=1,允许读/写LCD
}
//-------------------------------------- 写数据函数 -------------------------------------
void WR_DATA()                                       //写数据
{
  RS=1;                                         // RS=1,选择数据寄存器
  RW=0;                                         //准备写入数据
  EN=0;                                         //执行显示命令
  CHECK_BF();                                   //判断液晶模块是否忙
  EN=1;                                         // E=1,允许读/写LCD
}
//--------------------------------------- 初始化函数   ----------------------------------
void INIT_LCD()                                       //初始化
{
   unsigned char i=200;
    {
      while(--i);
      LCD=0x01;                                 //清屏并光标复位
      WR_COMM();                                //写入命令
      LCD=0x38;                                 //设置显示模式:8位2行5x7点阵
      WR_COMM();
      LCD=0x0c;                                 //开显示屏
   WR_COMM();
      LCD=0x06;                                 //文字不动,光标自动右移
      WR_COMM();                                //写入命令
    }
}

//------------------------------------------ 显示欢迎用语字符菜单函数 ------------------------------------------------

   void DISP_EXP (void)  
  
    {
    unsigned char i;
    LCD=0x80;                                  //写入显示起始地址                 
       WR_COMM();                                 //写入命令
       for(i=0;i<15;i++)                                
        {
         LCD=TAB1[i];                             //提取字符
         WR_DATA();                               //送出
        }                                    
    }
   
//------------------------------------------- 显示点亮菜单函数 --------------------------------------------
  void DISP1_EXP( )
     {
    unsigned char i;
    LCD=0xc0;                                    //写入显示起始地址                 
       WR_COMM();                                   //写入命令
       for(i=0;i<9;i++)                                
        {
         LCD= TAB2[i];                                //提取字符
         WR_DATA();                                  //送出
        }
  }  
     //--------------------------------------------显示打开函数--------------------------------------------
  void dakai ()  
  
    {
    unsigned char i;
    LCD=0xCE;                                  //写入显示起始地址                 
       WR_COMM();                                 //写入命令
       for(i=0;i<5;i++)                                
        {
         LCD=TAB3[i];                             //提取字符
         WR_DATA();                               //送出
        }                                    
    }
//--------------------------------------------显示关闭函数--------------------------------------------   
    void Shut_down ()  
  
    {
    unsigned char i;
    LCD=0xCE;                                  //写入显示起始地址                 
       WR_COMM();                                 //写入命令
       for(i=0;i<10;i++)                                
        {
         LCD=TAB4[i];                             //提取字符
         WR_DATA();                               //送出
        }                                    
    }   
uchar read_data(void)//读取接收数据
{
// uchar i=0;
   uchar tep = 0;
   if(r_flag == 1)
   {
    r_flag = 0;
    tep = buf[2];
  fs_d ();    //鸣响
}      
   return tep;
}
void uart_init()
{
  TMOD=0x20;
  TH1=0xfd;   //波特率9600
  TL1=0xfA;
  TR1=1;
  SM0=0;
  SM1=1;
  REN=1;
  EA=1;
  ES=1;
}
  /********************************************************************
函数功能:主函数
********************************************************************/
void main()
{
INIT_LCD();                                       //LCD初始化函数
   delay(100);           
   DISP_EXP();            //欢迎用语字符菜单函数
   DISP1_EXP();
    delay(100);
   {
  uchar key=0;
  uart_init(); //串口初始化
  SPK=1;//蜂鸣器关
  DA=1;
  DB=1;
  DC=1;
  DD=1;
  while(1)
  {
   key = read_data();//读取接收数据
if(key == 'A');
{
DA =0;//打开A
    delay(100);
  fs_d();
  LCD=0Xcc;      //写入显示起始地址
  WR_COMM();   //写入命令
  LCD=digit[1];      //提取字符,数组中的1,
  WR_DATA();             //送出
   dakai  ();
   break;
  }
if(key == 'B');
{
DA =1;//关闭A
delay(100);
    fs_d();
  LCD=0Xcc;    //写入显示起始地址
  WR_COMM();   //写入命令
  LCD=digit[1];    //提取字符,数组中的1,
  WR_DATA();            //送出
   Shut_down ();      //显示关闭
   break;
   }
if(key == 'C');
{
  DB =0;//打开B
delay(100);
  fs_d();
  LCD=0Xcc;    //写入显示起始地址
  WR_COMM();     //写入命令
  LCD=digit[2];    //提取字符,数组中的2,
  WR_DATA();            //送出
  dakai();         //显示打开
    break;
  }
  if(key == 'D');
  {
DB =1;//关闭B
  delay(100);
  fs_d ();
  LCD=0Xcc;      //写入显示起始地址
  WR_COMM();     //写入命令
  LCD=digit[2];     //提取字符,数组中的2,
  WR_DATA();             //送出
     Shut_down ();      //显示关闭
  break;
}
  if(key == 'E');
  {
  DC =0;//打开C
  fs_d();
  LCD=0Xcc;    //写入显示起始地址
  WR_COMM();   //写入命令
  LCD=digit[3];      //提取字符,数组中的3,
  WR_DATA();           //送出
  dakai();         //显示打开
    break;
  }
  if(key == 'F');
  {
   DC =1;//关闭C
    delay(100);
    fs_d ();
  LCD=0Xcc;      //写入显示起始地址
  WR_COMM();     //写入命令
  LCD=digit[3];      //提取字符,数组中的3,
  WR_DATA();           //送出
      Shut_down ();      //显示关闭
   break;
}
if(key == 'G');
{
  DD =0;//打开D
   delay(100);
  fs_d();
  LCD=0Xcc;      //写入显示起始地址
  WR_COMM();     //写入命令
  LCD=digit[4];      //提取字符,数组中的4,
  WR_DATA();           //送出
   dakai();           //显示打开
    break;
  }
  if(key == 'H');
  {
  DD =1;//关闭D
    delay(100);
  fs_d();
  LCD=0Xcc;     //写入显示起始地址
  WR_COMM();    //写入命令
  LCD=digit[4];    //提取字符,数组中的4,
  WR_DATA();            //送出
     Shut_down ();     //显示关闭
    break;
  }
}
}
}
void ser()interrupt 4  //接收中断
{
   RI=0; //清除接收标志
   buf[r_x] = SBUF;//接收数据至缓存区
   r_x++;
   if(buf[0]!='O'){r_x=0;}
   if(r_x == 3) //接收完成
   {
    r_x=0;
r_flag=1;
   }
}
回复

使用道具 举报

ID:130231 发表于 2017-9-4 14:07 | 显示全部楼层
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?SHUT_DOWN?MAIN,
这个主程序,没有调SHUT_DOWN(),也就说从下述语句中就开始不能运行了,不知道如何去掉警告。请教各位高手??
if(key == 'B');
{
DA =1;//关闭A
delay(100);
     fs_d();
   LCD=0Xcc;    //写入显示起始地址
  WR_COMM();   //写入命令
  LCD=digit[1];    //提取字符,数组中的1,
  WR_DATA();            //送出
   Shut_down ();      //显示关闭
   break;
    }
回复

使用道具 举报

ID:190832 发表于 2017-9-4 15:38 | 显示全部楼层
哥来告诉你,你的if(key == 'A'/'B'/'C'/'D');这些语句都是错的,if()应该去掉后面的';'。顺便,你好好学学C语言基础。连if都不会用就来写单片机了。。。。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:130231 发表于 2017-9-4 18:56 | 显示全部楼层
hange_v 发表于 2017-9-4 15:38
哥来告诉你,你的if(key == 'A'/'B'/'C'/'D');这些语句都是错的,if()应该去掉后面的';'。顺便,你好好学学 ...

新手级别,见笑了,多谢大哥指教,原来是别人的else if(key == 'B') DA =1;//关闭A。这样的语句。我改成的那样。没有注意到。编译时没提示。
回复

使用道具 举报

ID:130231 发表于 2017-9-4 19:11 | 显示全部楼层
hange_v 发表于 2017-9-4 15:38
哥来告诉你,你的if(key == 'A'/'B'/'C'/'D');这些语句都是错的,if()应该去掉后面的';'。顺便,你好好学学 ...

你说if(key == 'A'/'B'/'C'/'D')这些语句都是错的,去‘;’后。程序没提示警告了,程序能成功运行吗?请求分析一下。
回复

使用道具 举报

ID:130231 发表于 2017-9-4 19:11 | 显示全部楼层
hange_v 发表于 2017-9-4 15:38
哥来告诉你,你的if(key == 'A'/'B'/'C'/'D');这些语句都是错的,if()应该去掉后面的';'。顺便,你好好学学 ...

你说if(key == 'A'/'B'/'C'/'D')这些语句都是错的,去‘;’后。程序没提示警告了,程序能成功运行吗?请求分析一下。
回复

使用道具 举报

ID:130231 发表于 2018-1-11 19:41 | 显示全部楼层
zqy181818 发表于 2017-9-4 19:11
你说if(key == 'A'/'B'/'C'/'D')这些语句都是错的,去‘;’后。程序没提示警告了,程序能成功运行吗? ...

成功了。多谢大哥指导。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表