请各位大神看看这两个程序哪里出问题了,编译出错

2019-03-25 19:12发布

#include <pic.h>           
#include <string.h>
#include <stdio.h>
#include <math.h>
__CONFIG(HS&WDTDIS&LVPDIS);
#define uint unsigned int
#define uchar unsigned char
#define E   RB3            //1602液晶的E脚接在RB3口上
#define RW  RB4            //1602液晶的RW脚接在RB4口上
#define RS  RB5            //1602液晶的RS脚接在RB5口上
#define BEEP   RC1                       //蜂鸣器报警口
uchar HAND[]="AT";
uchar YING[]="AT+CMGF=1 ";
uchar LENGTH[]="AT+CMGS=18203230290 ";
uchar NR[]="T:  *C Vol:  ,  V W: S";
//A/D转换用寄存器设置
uint  ADbuf,bai,shi,ge;   //设置16位的unsigend int型寄存器用来暂存转换结果
double i_val=0;
uchar adcbuf[16];
uchar buf;
uchar q=0;                           //中断时间控制
uchar d;                             //采样存数组
uchar m=0;                           //控制窗户先开后关
uchar  temp1;                      //采集到的温度高8位
uchar  temp2;                      //采集到的温度低8位
//转换后的温度值小数点部分查表
const uchar tablexiao[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};
const uchar shun[8]=
{                          //定义表格一定要使用const,这样会做到程序存储区中
   
    0x20,                  //表格第1步数据0B00100000
    0x30,                  //表格第2步数据0B00110000
    0x10,                  //表格第3步数据0B00010000
    0x18,                  //表格第4步数据0B00011000
    0x08,                  //表格第5步数据0B00001000
    0x0c,                  //表格第6步数据0B00001100
    0x04,                  //表格第7步数据0B00000100
    0x24,                  //表格第8步数据0B00100100
};
const uchar ni[8]=
{                          //定义表格一定要使用const,这样会做到程序存储区中
    0x04,                  //表格第1步数据0B00000100
    0x0c,                  //表格第2步数据0B00001100
    0x08,                  //表格第3步数据0B00001000
    0x18,                  //表格第4步数据0B00011000
    0x10,                  //表格第5步数据0B00010000
    0x30,                  //表格第6步数据0B00110000
    0x20,                  //表格第7步数据0B00100000
    0x24,                  //表格第8步数据0B00100100
};
void delay35(uint ms)// 延时子程序
{
    uchar i;
    while(ms--)
    {
        for(i=0;i<120;i++);
    }
}
//1602液晶用延时函数
void Delay1602(uint t)
{
     uint k;      //定义一个16位寄存器用来做延时用
     for(k=0;k<t;k++);    //延时
}
//1602液晶忙检测函数
void LCD1602_busy(void)
{
     TRISD7=1;            //将RD7口设置为输入口,为读做准备
     RS=0;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
     RW=1;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
     E=1;                 //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
     while(RD7==1);       //由RD7读入1,表示1602液晶忙,需要等待
     E=0;                 //读完以后,恢复E的电平
     TRISD7=0;            //将RD7口设置为输出口
}
//名称:1602写命令函数
void LCD1602_Write_com(uchar combuf)
{
     RS=0;                //选择指令寄存器
     RW=0;                //选择写状态
     PORTD=combuf;        //将命令字通过RD口送至DB
     E=1;                 //E高电平将命令字写入1602液晶
     asm("NOP");          //添加一个空操作,使高电平至少维持1us
     E=0;                 //写完以后,恢复E的电平
}
//1602写命令函数(带忙检测)
void LCD1602_Write_com_busy(uchar combuf)
{
     LCD1602_busy();            //调用忙检测函数
     LCD1602_Write_com(combuf); //调用忙检测函数
}
//名称:1602写数据函数(带忙检测)
void LCD1602_Write_data_busy(uchar databuf)
{
     LCD1602_busy();      //调用忙检测函数
     RS=1;                //选择数据寄存器
     RW=0;                //选择写状态
     PORTD=databuf;        //将命令字通过RD口送至DB
     E=1;                 //E高电平将命令字写入1602液晶
     asm("NOP");          //添加一个空操作,使高电平至少维持1us
     E=0;                 //写完以后,恢复E的电平
}
//1602液晶显示地址写函数
void LCD1602_Write_address(uchar x,uchar y)
{
     x&=0x0f;             //列地址限制在0-15间
     y&=0x01;             //行地址限制在0-1间
     if(y==0)             //如果是第一行
         LCD1602_Write_com_busy(x|0x80);        //将列地址写入
     else                 //如果是第二行
         LCD1602_Write_com_busy((x+0x40)|0x80); //将列地址写入
}

//1602液晶初始化函数
void LCD1602_init(void)
{
     Delay1602(1500);          //调用延时函数
     LCD1602_Write_com(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
     Delay1602(500);           //调用延时函数
     LCD1602_Write_com(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
     Delay1602(500);           //调用延时函数
     LCD1602_Write_com(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
     LCD1602_Write_com_busy(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
     LCD1602_Write_com_busy(0x08);  //显示功能关,无光标
     LCD1602_Write_com_busy(0x01);  //清屏
     LCD1602_Write_com_busy(0x06);  //写入新的数据后,光标右移,显示屏不移动
     LCD1602_Write_com_busy(0x0C);  //显示功能开,无光标
}
//1602液晶指定地址显示函数
void LCD1602_Disp(uchar x,uchar y,uchar buf)
{
     LCD1602_Write_address(x,y);    //先将地址信息写入
     LCD1602_Write_data_busy(buf);  //再写入要显示的数据
}
//DS18B20用延时函数
void delay(uchar x,uchar y)
{
          uchar z;
          do{
              z=y;
              do{
                      ;
              }while(--z);                  
    }while(--x);     
}

//复位DS18B20函数
uchar reset(void)
{
        uchar outbit;
        TRISA4=0;                                        //设置RA4位输出口
        RA4=0;                                            //设置RA4=0;
    delay(2,70);                //延时503us
    TRISA4=1;                   //设置RA4为输入口,以释放总线等电阻拉高总线
    delay(2,8);                 //延时70us
    if(RA4==1) outbit=0;        //没有接收到应答信号,继续复位
    else outbit=1;              //接收到应答信号
    delay(2,60);                //延时430us
    return outbit;                  //带参数返回,如果接收到应答,返回1,否则返回0
}

//写字节函数
void write_byte(uchar  val)
{
        uchar f;
        uchar temp;
        for(f=8;f>0;f--)
        {
                   temp=val&0x01;              //最低位移出
                   TRISA4=0;                                        //设置RA4位输出口
                RA4=0;                                            //设置RA4=0;
        NOP();NOP();NOP();NOP();NOP();                      //从高拉至低电平,产生写时间隙
                   if(temp==1)  TRISA4=1;      //如果写1,拉高电平
                   delay(2,7);                 //延时63us
                   TRISA4=1;                   //设置RA4为输入口,以释放总线等电阻拉高总线
                   NOP();NOP();
                   val=val>>1;                //右移一位
          }
}

//读字节函数
uchar read_byte(void)
{
uchar e;
uchar value=0;                                //读出温度
for(e=8;e>0;e--)
{
   value>>=1;
   TRISA4=0;                                        //设置RA4位输出口
   RA4=0;                                            //设置RA4=0;
   NOP();NOP();NOP();NOP();NOP();NOP();                      //6us
   TRISA4=1;                   //设置RA4为输入口
   NOP();
   NOP();
   NOP();
   NOP();                      //4us
   if(RA4==1) value|=0x80;     //如果接收到数据为1,从最高位往右移
   delay(2,7);                 //63us
  }
  return(value);
}

//启动读温度函数
void convert_T(void)
{
    if(reset()==1)            //如果复位成功
        {  
        write_byte(0xcc);     // 跳过多器件识别
        write_byte(0x44);     // 启动温度转换
    }
}
//读温度函数
void read_T(void)
{
    uchar Lsb,Msb;            
    if(reset()==1)
        {  
        write_byte(0xcc);      // 跳过多器件识别
        write_byte(0xbe);      // 读暂存器
        Lsb=read_byte();       // 低字节
        Msb=read_byte();             // 高字节
                temp2=Lsb&0x0f;        //LSB的低4位为小数部分
                temp1=(Lsb>>4)|(Msb<<4);//LSB的高4位和MSB拼成整数部分
    }     
}
//电机正反转查表函数
void shun1(void)
{  
  uint a,b;
  for(b=1200;b>0;b--)
   for(a=0;a<7;a++)            //a做加1操作,并限制在0-7以内
    { Delay1602(180);
      PORTC=shun[a];
    }
}
void ni1(void)
{  
  uint a,b;
  for(b=1200;b>0;b--)
     for(a=0;a<7;a++)  
       {Delay1602(180);
        PORTC=ni[a];            
       }  
}  
void USART_BUF(void)
{
    SPBRG=25;              //设置波特率为9600,误差0.16%
    BRGH=1;                //设置高速波特率
    SYNC=0;                //SYNC=0为异步模式,SYNC=1为同步模式
    SPEN=1;                //允许串口操作
    CREN=1;                //CREN=0禁止连续接收,CREN=1允许连续接收
    TXIE=0;                //禁止发送中断
    RCIE=0;                //禁止接收中断
    TX9=0;                 //TX9=0为8位发送,TX9=1为9位发送
    RX9=0;                 //RX9=0为8位接收,RX9=1为9位接收
    TXEN=1;                //TXEN=0为禁止发送,TXEN=1为允许发送
}
void A_D(void)
{
    ADCON1=0B00001110;     //RA0为A/D输入口;ADFM=0,转换后数据左移,ADRESH为高8位数据
    ADIE=0;                //禁止A/D中断
}
Print_Char(uchar ch)//发送单个字符
{
    TXREG=ch; //送入缓冲区
    while(TRMT==0); //等待发送完毕
}
Print_Str(uchar *str)//发送字符串
{
    while(*str!='')
    {
        Print_Char(*str);
        delay35(10);
        str++;
    }
}
void send_mess(void)
{
    delay35(10);
    Print_Str(HAND);      //单片机与TC35模块连接
    delay35(100);
    Print_Str(YING);         //发英文短信
    delay35(200);
    Print_Str(LENGTH);
    delay35(200);
    Print_Str(NR);
    delay35(200);
    Print_Char(0x1a);
    delay35(100);
}
void A_DZHUANHUA(void)
{
      ADCON0=0B00000001;     //选择AN0通道准备进行A/D转换,启动A/D模块
      asm("NOP");asm("NOP");asm("NOP");asm("NOP");            //略做延时            
      ADGO=1;                //开始进行A/D转换
      while(ADGO) continue;  //等待A/D转换结束
      adcbuf[d]=ADRESH;          //将8位A/D转换结果暂存在数组中
}
void tmr1(void)
{
    TMR1CS=1;              //外部计数               
    T1CKPS0=0;             //1:1预分频比,T1CKPS0=0
    T1CKPS1=0;             //1:1预分频比,T1CKPS1=0
    TMR1H=0xFF;            //置初值
    TMR1L=0xD0;            
    TMR1ON=1;              //启动定时器T1
    TMR1IF=0;              //清除T1的中断标志
    TMR1IE=0;              //禁止T1中断
}
void tmr0(void)
{
    T0CS=0;                //TMRO时钟源选择内部指令周期时钟(Fosc/4)
    PSA=0;                 //预分频器分配给TMR0模块
    PS0=1;                 //TMR0预分频比1:256,PS0=1
    PS1=1;                 //TMR0预分频比1:256,PS1=1
    PS2=1;                 //TMR0预分频比1:256,PS2=1
    TMR0=0x0D;             //定时65536微秒,置初值为256-256+13  对于13是怎么来的,请翻阅资料刘和平著书关于定时那部分,会有详细介绍
    T0IF=0;                //清除TMR0的中断标志
    T0IE=0;                //禁止TMR0中断
                     
}
void XIAN(void)
{
        LCD1602_Disp(1,1,'V');          
                LCD1602_Disp(2,1,'o');                  
        LCD1602_Disp(3,1,':');
        LCD1602_Disp(5,1,'.');        
                LCD1602_Disp(8,1,'V');
        LCD1602_Disp(12,1,'W');
        LCD1602_Disp(13,1,':');
        LCD1602_Disp(15,1,'S');
        LCD1602_Disp(1,0,'T');
                LCD1602_Disp(2,0,':');
        LCD1602_Disp(5,0,'.');       
        LCD1602_Disp(7,0,0xdf);     
                LCD1602_Disp(8,0,0x43);         
}
void ad(void)
{
for(d=0;d<16;d++)  //连续采样16次,然后取平均数
                {
        A_DZHUANHUA();          //***启动一次A/D转换***   
                }
                ADbuf=0;
                for(d=0;d<16;d++)            
                {
                        ADbuf+=adcbuf[d];
                }      
                ADbuf=ADbuf/16;
                i_val=(double)ADbuf;
                i_val=(i_val*500)/255;
                if(i_val>999) i_val=999;
                ADbuf=(int)i_val;
        bai=(ADbuf/100)+0x30;
        NR[12]=bai;
        shi=(ADbuf%100)/10+0x30;
        NR[14]=shi;
        ge=(ADbuf%10)+0x30;
        NR[15]=ge;
        LCD1602_Disp(4,1,bai);           //百位
                LCD1602_Disp(6,1,shi);   //十位
                LCD1602_Disp(7,1,ge);       //个位
}
void wendu(void)
{
        convert_T();                //启动温度转换
            delay(25,250);              //延时       
                read_T();                   //读温度数据
                if(temp1>99) temp1=99;            //这里我们只显示2位整数部分,所以限定在99度                 
                if(temp2>15) temp2=0;       //限定范围,以免查表溢出
            buf=temp1/10;                          
                buf+=0x30;
        NR[2]=buf;                       
                LCD1602_Disp(3,0,buf);      //温度整数部分十位
                buf=temp1%10;
                buf+=0x30;
        NR[3]=buf;
                LCD1602_Disp(4,0,buf);      //温度整数部分个位
                buf=tablexiao[temp2&0x0f];
                buf+=0x30;
                LCD1602_Disp(6,0,buf);      //温度小数部分
}
void fengsu(void)
{
   if(T0IF==1)                  //需要进一步判断是否是T0中断
      {
          TMR0=0x13;              //定时器中断后,要重置初值,以备下次中断
          T0IF=0;                 //清中断标志位,以备下次中断
                 if(++q>15)                        //65536us查询一次,再计次15次后就是0.98304s
                {
                        q=0;           
           if(TMR1L>=0xD6)              //显示风级
          {LCD1602_Disp(14,1,'6');NR[20]='6';}                     
          else if(TMR1L>=0xD5)
          {LCD1602_Disp(14,1,'5');NR[20]='5';}                    
          else if(TMR1L>=0xD4)
          {LCD1602_Disp(14,1,'4');NR[20]='4';}                     
          else if(TMR1L>=0xD3)
          {LCD1602_Disp(14,1,'3');NR[20]='3';}                     
          else if(TMR1L>=0xD2)
          {LCD1602_Disp(14,1,'2');NR[20]='2';}                     
          else if(TMR1L>=0xD1)
          {LCD1602_Disp(14,1,'1');NR[20]='1';}                     
          else if(TMR1L>=0xD0)
          {LCD1602_Disp(14,1,'0');NR[20]='0';}
          if((m==0)&&((i_val>100)|(temp1>26)))               
          {
           LCD1602_Disp(11,0,'O');
           LCD1602_Disp(12,0,'P');
           LCD1602_Disp(13,0,'E');
           LCD1602_Disp(14,0,'N');
           BEEP=1;       
           Delay1602(60000);
           Delay1602(60000);
           BEEP=0;  
           send_mess();     
                   ni1();
           m=m+1;
          }         
         if((m==1)&&((TMR1L>0xD3)|(temp1<10)))      
              {
           LCD1602_Disp(11,0,'C');
           LCD1602_Disp(12,0,'L');
           LCD1602_Disp(13,0,'O');
           LCD1602_Disp(14,0,'S');
           LCD1602_Disp(15,0,'E');
           shun1();
           m=m-1;
          }        
           TMR1H=0xFF;        //重置初值  TMR1   16位计数器
           TMR1L=0xD0;        //重置初值         
         }
      }
}
void main(void)            //主函数,单片机开机后就是从这个函数开始运行
{  
    TRISA=0B11111111;      //初始化RA5-RA0的输入输出方向
    PORTA=0B00000000;      //初始化RA5-RA0数值
    PORTB=0B00000000;      //初始化RB7-RB0的数值
    TRISB=0B11000111;      //初始化RB7-RB0的输入输出方向
    TRISC=0B11000001;      //初始化RC7-RC0的输入输出方向
    PORTC=0B00000000;      //初始化RC7-RC0的数值
    TRISD=0B00000000;      //初始化RC7-RC0的输入输出方向
    PORTD=0B00000000;      //初始化RC7-RC0的数值
    LCD1602_init();        //1602液晶初始化函数
    A_D();                   //****A/D模块初始化****
    tmr0();                //定时器TMR0初始化
    tmr1();                //定时器TMR1初始化
    USART_BUF();            //串口初始化
    while(1)               //死循环,单片机初始化后,将一直运行这个死循环
    {
        ad();
        XIAN();
        wendu();
        fengsu();                           
    }
        
}

#include <pic.h>           //调用PIC16F87XA单片机的头文件
__CONFIG(HS&WDTDIS&LVPDIS); //写配置子
unsigned int q;   
void Delay1602(unsigned int t)
{
     unsigned int k;      //定义一个16位寄存器用来做延时用
     for(k=0;k<t;k++);    //延时
}

}
const unsigned char shun[8]=
{                          
   
    0x81,    //表格第1步数据0B10000000   顺时针
    0xc1,    //表格第2步数据0B11000000
    0x41,    //表格第3步数据0B01000000
    0x61,    //表格第4步数据0B01100000
    0x21,    //表格第5步数据0B00100000
    0x31,    //表格第6步数据0B00110000
    0x11,    //表格第7步数据0B00010000
    0x91,    //表格第8步数据0B10010000
};
const unsigned char ni[8]=
{                          
    0x11,     //表格第1步数据0B00010000         逆时针
    0x31,     //表格第2步数据0B00110000
    0x21,     //表格第3步数据0B00100000
    0x61,     //表格第4步数据0B01100000
    0x41,     //表格第5步数据0B01000000
    0xc1,     //表格第6步数据0B11000000
    0x81,     //表格第7步数据0B10000000
    0x91,     //表格第8步数据0B10010000
};

void shun1(void)
{  
  unsigned int a,b;
  for(b=500;b>0;b--)
   for(a=0;a<7;a++)      //a做加1操作,并限制在0-7以内
    { Delay1602(200);
      PORTC=shun[a];
    }
}
void ni1(void)
{  
  unsigned int a,b;
  for(b=500;b>0;b--)
     for(a=0;a<7;a++)  
       {Delay1602(200);
        PORTC=ni[a];            
       }  
}  

//名称:中断服务程序
void interrupt ISR(void)   //PIC单片机的所有中断都是这一个入口
{
    if(T0IF==1)          //需要进一步判断是否是T0中断
    {
        TMR0=0x13;         //定时器中断后,要重置初值,以备下次中断
        T0IF=0;            //清中断标志位,以备下次中断
            //***此处用户自行添加定时器T0中断处理程序***
                if(++q>100)                   //65536us中断一次,再计次100次后就是6.5536秒
                {
                        q=0;
       //***风速计数中断部分程序***
          if(TMR1L>0xE4)          //TMR1   16位计数器
          {      
                   ni1();         
                  }
            TMR1H=0xFF;        //重置初值
            TMR1L=0xE0;        //重置初值   
        }

       
    }
}

void main(void)            //主函数,单片机开机后就是从这个函数开始运行
{   
    TRISC=0B00001111;      //初始化RC7-RC0的输入输出方向
    PORTC=0B00001111;      //初始化RC7-RC0的数


    //***定时器TMR0初始化***
    T0CS=0;                //TMRO时钟源选择内部指令周期时钟(Fosc/4)
    PSA=0;                 //预分频器分配给TMR0模块
    PS0=1;                 //TMR0预分频比1:256,PS0=1
    PS1=1;                 //TMR0预分频比1:256,PS1=1
    PS2=1;                 //TMR0预分频比1:256,PS2=1
    TMR0=0x0D;             //定时65536微秒,置初值为256-256+13
    T0IF=0;                //清除TMR0的中断标志
    T0IE=1;                //TMR0中断允许

    //***定时器TMR1初始化***
    TMR1CS=1;             //外部计数               
    T1CKPS0=0;             //1:1预分频比,T1CKPS0=0
    T1CKPS1=0;             //1:1预分频比,T1CKPS1=0
    TMR1H=0xFF;            //置初值
    TMR1L=0xE0;            
    TMR1ON=1;              //启动定时器T1
    TMR1IF=0;              //清除T1的中断标志
    TMR1IE=0;              //不允许T1中断
        PEIE=0;                //不允许外设中断,TMR1属于外设中断范围
    GIE=1;                 //开全局中断
    while(1)               //死循环,单片机初始化后,将一直运行这个死循环
    {
      
    }
   
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
365495130
2019-03-26 05:38
;*********************************************************************************************************************************************************************************
;项目名称;three
;目标幸好;pic10f200
;功能描述;按键开关控制5个档位
;源文件名称;three.asm
;作者名称;chunjiang
;编程日期;2014.3.25
;**********************************************************************************************************************************************************************************
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;                                                        主程序
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LIST P=10F200                                     ;定义头文件
INCLUDE "P10F200.INC"                             ;列表文件
__CONFIG _MCLRE_OFF&_CP_ON&_WDT_OFF&_OSC_IntRC;字这里全部配置完成 省去烧录界面每次都麻烦的进行配置。
            ORG 0000H                              ;复位向量地址每次复位都指向0000
            BTFSS STATUS,7                         ;检测是否引脚电平导致的复位是的话继续往下执行步骤不是的话跳到执行赋值休眠赋值休眠关闭所有的功能进入省电
            GOTO CALL1                             ;
            BCF STATUS,7                           ;清除状态位置免得每次到这了又来重新判断
            CALL STATRT                            ;调用初始化程序的目的在于初始化了好执行下一步程序
            BTFSC GPIO,1                           ;检测引脚1是否按下
            GOTO SLP                               ;没有按下就跳到休眠模式进入赋值休眠模块
            CALL DELAY10MS                         ;调用延时程序
            BTFSC GPIO,1                           ;检测引脚1上的按键是否按下
            GOTO SLP                               ;跳到休眠模式
            GOTO MAIN                              ;跳到主函数
CALL1       CALL STATRT                            ;调用初始化程序
            GOTO SLP                               ;调用初始化程序模块进入休眠
MAIN        BTFSC GPIO,1                           ;主函数
            GOTO MAIN                              ;按键真的按下了么
            CALL DELAY10MS                         ;调用延时程序
            BTFSC GPIO,1                           ;按键真的按下了么
            GOTO MAIN                              ;
            BSF GPIO,0                             ;电路输出打开
DUTY50      BCF GPIO,2                             ;调光输出关闭
            MOVLW 50H                              ;
            MOVWF 11H                              ;给11单元赋值80D
LOP1        DECFSZ 11H,1                           ;11单元的内容减去1结果放到F寄存器
            GOTO LOP1                              ;
RENEW1      BTFSS GPIO,1                           ;按键真的释放了么
            GOTO DUTY30                            ;
            BSF GPIO,2                             ;调光电路打开
            MOVLW 50H                              ;给12单元赋值80D
            MOVWF 12H                              ;
LOP2        DECFSZ 12H,1                           ;12单元内的内容减去1
            GOTO LOP2                              ;
            BTFSS GPIO,1                           ;按键真的释放了么
            GOTO DUTY50                            ;没有释放就继续打开50档位
            CALL DELAY10MS                         ;
            BTFSS GPIO,1                           ;按键真的释放了么
            GOTO DUTY50                            ;
DUTY30      BTFSC GPIO,1                           ;按键真的按下了么
            GOTO DUTY30                            ;
            CALL DELAY10MS                         ;调用延时程序
            BTFSC GPIO,1                           ;按键真的按下了么
            GOTO DUTY30                            ;
            BSF GPIO,0                             ;
DUTY3       BCF GPIO,2                             ;打开电路输出 关闭调光输出
            MOVLW 30H                              ;
            MOVWF 11H                              ;给11单元赋值48D
LOP3        DECFSZ GPIO,1                          ;
            GOTO LOP3                              ;
            BTFSS GPIO,1                           ;按键真的释放了么
            GOTO DUTY100                           ;
            BSF GPIO,2                             ;调光电路打开
            MOVLW 13H                              ;
            MOVWF 12H                              ;给12单元赋值19d
LOP4        DECFSZ 12H,1                           ;12单元的内容减去1结果放到F寄存器
            GOTO LOP4                              ;
            BTFSS GPIO,1                           ;按键真的释放了么
            GOTO DUTY100                           ;
            CALL DELAY10MS                         ;
            BTFSS GPIO,1                           ;按键真的释放了么
            GOTO DUTY3                             ;
DUTY100     BTFSC GPIO,1                           ;按键真的按下了么
            GOTO DUTY100                           ;
            CALL DELAY10MS                         ;调用延时程序
            BTFSC GPIO,1                           ;按键真的按下了么
            BSF GPIO,0                             ;
LOP6        BSF GPIO,2                             ;打开所有输出
RENEW3      BTFSS GPIO,1                           ;按键真的松开了么
            GOTO SLP                               ;
            CALL DELAY10MS                         ;
            BTFSS GPIO,1                           ;按键真的松开了么
            GOTO SLP                               ;
            GOTO LOP6                              ;
SLP         BCF GPIO,0                             ;关闭所有端口
            BCF GPIO,2                             ;
            MOVF GPIO,1                            ;进入休眠模式读取端口状态,休眠期间一旦引脚的值与上次读入的值不一样容易产生唤醒 在进入休眠状态应该读取端口状态
            SLEEP                                  ;休眠指令后面跟跳NOP指令
            NOP                                    ;
;********************************************************************************************************************************************************************************
STATRT       MOVLW 0AH            ;
             TRIS GPIO            ;设置各个I/O口的输入和输出
             MOVLW 00H            ;
             OPTION               ;初始化程序中关闭引脚电平变化唤醒  但是开启作为数字输入的引脚内部弱上拉功能
             BCF GPIO,0           ;关CE
             BCF GPIO,2           ;同时也关PWM.
             RETLW 00H              ;
;******************************************************************延时10ms的子程序*******************************************************************************
DELAY10MS    MOVLW 0DH            ;实际时间为5乘以256等于3830us.
             MOVWF 15H            ;修改后改为实际时间为3ms  但是标识符号没有更改!将外循环常数41H存于通用数据存储单元10H中。
LOP20        MOVLW 0FFH
             MOVWF 16H            ;内循环常数0FFH保存于通用数据存储单元11H中。
LOP9         DECFSZ 16H,1         ;内循环自减1!
             GOTO LOP9
             DECFSZ 15H,1
             GOTO LOP20            ;
             RETLW 00H            ;
;*******************************************************************************************************************************************************************************
             END                                       









                                                     帮我看看

一周热门 更多>