今天帮公司写个相对简单的单片机程序

来源:互联网 发布:cepii距离数据怎么看 编辑:程序博客网 时间:2024/04/30 14:55

/* 单片机: PIC12C508/ MDT10P52

   功能: 按KEY0  冲汽105S,长按2S结束(第一次按无效)。按下KEY0冲汽,放开不冲汽

  按下KEY2放汽,放开不放汽

*/

//  C语言版

 

#include<pic.h>
#define uchar unsigned char

#define  key0 GP0   //105S充气开关
#define  key1 GP1   //一按一充开关
#define  key2 GP2   //一按一放气开关

#define  LED0 GP4   //模拟放气LED灯
#define  LED1 GP5   //模拟充气LED灯
    
#define LONG_TIME  1050  //充气时间
#define LONG_AN  20  //长按充气开关时间
 
bit key0_flag;    //按键次数奇偶性
uchar count;    //长按充气时间变量
int r;

__CONFIG(0XFF6);
/******************************/
//初始化函数
void Init(void)
{
 TRIS = 0xcf;  //11001111
 LED0 = 0;
 LED1 = 0;
 key0_flag = 0;
 count = 0;
 OPTION = 0X4F;
}
/******************************/
/******************************/
//延时100MS时间函数
void delay(void)
{
 uchar i,j;
 for(i=0;i<50;i++)
  for(j=0;j<177;j++)  //100m
   ;
}

void main()
{
 Init();    //初始化
 while(1)
 {
  asm("CLRWDT");
  if(!key0)  //充气按键按下
  {
   delay();
   if(!key0)
   {
    LED1 = 1;  //开始充气
    for(r=0;r<LONG_TIME;r++)  //延时105S
    {
     delay();
     if(r%20 == 0)
      asm("CLRWDT");
     if(!key0 && key0_flag)  //判断是否为长按
     {
      count++;
      if(count >= LONG_AN)
      {
       LED1 = 0;   //是长按就不充气了
       break;
      }
     }
     else
      count = 0;
    }
    LED1 = 0;
    LED0 = 0;
    while(!key0);
    key0_flag = 1;
   }
  }
  if(!key1)    
  {
   delay();
   if(!key1)
   {
    LED1 = 1;
    LED0 = 0;
    while(!key1);
    LED1 = 0;
   }
  }
  if(!key2)
  {
   delay();
   if(!key2)
   {
    LED0 = 1;
    LED1 = 0;
    while(!key2);
    LED0 = 0;
   }
  }
  
 }
 
}

 

;汇编版

 


GPIO EQU  06H  
TMR0 EQU  01H
STATUS EQU  03H  

DEL1 EQU  11H   ;时间延时变量
DEL2 EQU  12H
DEL3 EQU  13H
COUNT EQU  14H   ;按键KEY0长按时间变量
KEY_NUMBER EQU 15H   ;按键KEY0按键次数变量

KEY0 EQU  0 ;按键0,冲汽105S
KEY1 EQU  1 ;按键1,按下冲汽,放开不冲
KEY2 EQU  2 ;按键2,按下放汽,放开不放汽

LED0 EQU  4
LED1 EQU  5 

 

__CONFIG(0XFF6);

ORG  00H
  NOP
  MOVLW 0CFH  ;11001111
  TRIS GPIO
  MOVLW 47H  ;设置定时器
  OPTION

  MOVLW 0FFH   ;初始化变量
  MOVWF KEY_NUMBER
START: BCF  GPIO,LED0  ;初始化输出口
  BCF  GPIO,LED1
  MOVLW 28H
  MOVWF COUNT

CHECK_KEY0:     ;判断按键0
  BTFSC GPIO,KEY0
  GOTO CHECK_KEY1 
  CALL DELAY
  BTFSC GPIO,KEY0
  GOTO CHECK_KEY1 
 
  INCF KEY_NUMBER ;按键次数加1
  BSF  GPIO,LED1 ;冲汽
  CALL  TIME_105S ;延时105S

CHECK_KEY1:     ;判断按键1
  BTFSC GPIO,KEY1
  GOTO CHECK_KEY2
  CALL DELAY
  BTFSC GPIO,KEY1
  GOTO CHECK_KEY2
  
  BSF  GPIO,LED1 ;冲汽
KEY1_UP:
  BTFSS GPIO,KEY1 
  GOTO KEY1_UP  ;放开按键
  BSF  GPIO,LED1 ;不冲汽

CHECK_KEY2:     ;判断按键2
  BTFSC GPIO,KEY2
  GOTO START
  CALL DELAY
  BTFSC GPIO,KEY2
  GOTO START  
  BSF  GPIO,LED0 ;按下,放汽
KEY2_UP:
  BTFSS GPIO,KEY2
  GOTO KEY2_UP
  BSF  GPIO,LED0 ;放开,不放汽
  GOTO START
  
DELAY:      ;按键去斗延时
  MOVLW 10H
  MOVWF DEL1
DE1: MOVLW 64H
  MOVWF DEL2
DE2: DECFSZ DEL2
  GOTO DE2
  DECFSZ DEL1
  GOTO DE1
  RETURN
  
    
TIME_105S:    ;延时105S
  CLRF TMR0  
  MOVLW 02H
  MOVWF DEL1
LOOP1: MOVLW 10H
  MOVWF DEL2
LOOP2: MOVLW 40H
  MOVWF DEL3
LOOP3: CLRF TMR0
;-----------------------------------  
  MOVLW 00H    ;判断KEY0是否为第一次按
  SUBWF KEY_NUMBER,0
  SKPZ REST  
;---------------------------------- 
  BTFSC GPIO,KEY0  ;判断KEY0是否长按2S
  GOTO LOOP
  DECFSZ COUNT
  GOTO LOOP
  BCF  GPIO,LED1
;--------------------------------
KEY_UP: BTFSS GPIO,KEY0
  GOTO KEY_UP
  GOTO STOP

REST: MOVLW 28H
  MOVWF COUNT
;----------------------------------
LOOP: 
  MOVLW  0C3H ;定时器延时 195*256=5000MS
  SUBWF TMR0,0
  SKPZ OK  
  GOTO LOOP
OK:      
  DECFSZ DEL3
  GOTO LOOP3
  DECFSZ DEL2
  GOTO LOOP2
  DECFSZ DEL1
  GOTO LOOP1
STOP: RETURN 
END     
 

原创粉丝点击