📄 061219.c
字号:
/*****************************************************************************
* Productor name:
* Write by:kenny_zhou
* Mail address:zhou_vip_1980@163.com
* Write date:2006.12.19
* Version:V0.0
* MCU:EM78P156EL
* Crystal:32.768KHz 4 cycle Mode
* Prescalar be set to TCC 1:64 ,Tcc = 1.5 seconds ,TCC initial value is "64"
*****************************************************************************
* (1)S1 MCU reset
* (2)S2 Power ON/OFF
* (3)P5_0 low power detect
* (4)P5_1 Moto Drive
* (5)P6_0=0 Mode1,dispense every 7 minutes
* (6)P6_1=0 Mode2,dispense every 14 minutes
* (7)P6_2=0 Mode3,dispense every 28 minutes
* (8)P6_6 Yellow LED
* (9)P6_7 Red LED
****************************************************************************/
#include "EM78x156xx.h"
#define DISI() _asm{DISI}
#define ENI() _asm{ENI}
#define NOP() _asm{NOP}
#define WDTC() _asm{WDTC}
#define uchar unsigned char
#define ushort unsigned short
#define ulong unsigned long
static uchar flag@0x20;
static bit timer_28minute@0x20@0;
static bit timer_14minute@0x20@1;
static bit timer_7minute@0x20@2;
static bit replace_bottle@0x20@3;
static bit low_volt@0x20@4;
static bit mode_1@0x20@5;
static bit mode_2@0x20@6;
static bit mode_3@0x20@7;
static uchar dispense_counter_1@0x21;//counter the times of dispense low byte
static uchar dispense_counter_2@0x22;//counter the times of dispense high byte
static uchar timer_1min@0x23;//1 minutes Timer register
static uchar timer_7min@0x24;//7 minutes Timer register
static uchar temp1@0x25;
static uchar temp2@0x26;
static uchar temp3@0x27;
static ushort dispense_counter@0x28;
static uchar flash@0x2A;
void delay_200ms(void);
void main()
{
P5CR=0x00;//set port5 are output
P6CR=0x3F;//set P6.0~p6.5 are input ; the P6.6~P6.7 are output
PHCR=0xF0;//set the P6.0~P6.3,P6.6~P6.7 are pull-high enable ,the P6.4~P6.5 are push-high disable
P5=0xFF;//initial P5
P6=0xFF;//ititial P6
flag=timer_1min=timer_7min=temp1=temp2=temp3=dispense_counter_1=dispense_counter_2=flash=0;//initial register
dispense_counter=0;
/////////////////////////////////////////////////////////
_asm
{//set the TCC
MOV A,@0x05
CONTW //set prescalar to TCC 1:64,
MOV A,@0x40
MOV %TCC,A //set initial value of TCC,T=1.5s
MOV A,@0x01
IOW %IMR //enable the TCCINT
ENI
}
/////////////////////////////////////////////////////////
while(1)
{
if(P6_0==0)
{//Mode1,dispense every 7 minutes
_asm
{//set "mode_1" flag
BS %flag,5
}
}
else
{//clear "mode_1" flag
_asm
{BC %flag,5}
}
if(P6_1==0)
{//Mode2,dispense every 14 minutes,set "mode_2" flag
_asm
{BS %flag,6}
}
else
{//clear "mode_2" flag
_asm
{BC %flag,6}
}
if(P6_2==0)
{//Mode3,dispense every 28 minutes,set "mode_3" flag
_asm
{BS %flag,7}
}
else
{//clear "mode_3" flag
_asm
{BC %flag,7}
}
if(P5_0==0)
{//the battery is low voltage
delay_200ms();//delay 0.5s,filtrate the abmormal wave
if(P5_0==0)
{
temp1++;
if(temp1==50)
{//set "low_voltage" flag
_asm
{BS %flag,4}
temp1=0;//initial register
}
}
}
else
{//clear "low_volt" flag
temp1=0;//initial register
_asm
{BC %flag,4}
}
if(dispense_counter_2==11)
{//11*256+209=3025
if(dispense_counter_1>220)
{//set "replace_bottle" flag
_asm
{BS %flag,3}
dispense_counter_2=0;
dispense_counter_1=0;
}
}
}
}
/* dalay 200ms */
void delay_200ms(void)
{//dalay_200ms
for(temp2=200;temp2>0;temp2--)
{
WDTC();
WDTC();
WDTC();
WDTC();
}
}
/* delay 250ms */
void delay_250ms(void)
{//delay 250ms
for(temp3=250;temp3>0;temp3--)
{
WDTC();
WDTC();
WDTC();
WDTC();
}
}
void _intcall interrupt_l(void) @ 0x08:low_int 0
{
_asm
{//save A --> 0x2D ; R3 --> 0x2E (ram bank 0); R4 --> 0x2F (ram bank 0)
MOV 0x2D,A //backup A to 0x2D
SWAPA 0x04 //backup R4 to 0x2F at bank 0
MOV 0x2F,A //backup R4 to 0x2F at bank 0
SWAPA 0x03
MOV 0x2E,A //backup R3 to 0x2E at bank 0
}
}
//interrupt server
void _intcall interrupt(void) @ int 0
{
// Write your code (inline assembly or C) here
DISI();//disable the intrrupt
timer_1min++;
//if(timer_1min==40)
if(timer_1min==10)
{//1 minutes is finish
timer_1min=0;//then initial register
timer_7min++;
if(timer_7min==7)
{//7 minutes is finish
_asm //set 7 minutes arrive flag
{BS %flag,2}
}
else if(timer_7min==14)
{//14 minutes is finish
_asm //set 14 minutes arrive flag
{BS %flag,1}
}
else if(timer_7min==28)
{//28 minutes is finish
_asm //set 28 minutes arrive flag
{BS %flag,0}
// timer_7min=0;//initial the register
}
}
if((low_volt==1)||(replace_bottle==1))
{
if(low_volt==1)
{//flash 3 second interval
flash++;
if(flash==2)
{
if(P6_7==0)
{P6_7=1;}
else
{P6_7=0;}
flash=0;//intial the register
}
}
else
{//flash 1.5 second interval
if(P6_7==0)
{P6_7=1;}
else
{P6_7=0;}
}
}
else
{
if((mode_1==1)&&(timer_7minute==1))
{//mode 1,despense every 7 minutes
P5_1=0;//moto working
P6_6=1;
delay_250ms();
P6_6=0;
delay_250ms();
P6_6=1;
delay_250ms();
P6_6=0;
delay_250ms();
P6_6=1;
P5_1=1;//moto stop
timer_7min=0;//initial the register
_asm
{
BC %flag,2 //clear the 7_minute falg
INC %dispense_counter_1 //increament the dispense_counter
JBC %STATUS,2
INC %dispense_counter_2
}
}
else if((mode_2==1)&&(timer_14minute==1))
{//mode 2,depense every 14 minutes
P5_1=0;
P6_6=1;
delay_250ms();
P6_6=0;
delay_250ms();
P6_6=1;
delay_250ms();
P6_6=0;
delay_250ms();
P6_6=1;
P5_1=1;
timer_7min=0;//initial the register
_asm
{
BC %flag,1 //clear the 14_minute falg
INC %dispense_counter_1 //increament the dispense_counter
JBC %STATUS,2
INC %dispense_counter_2
}
}
else if((mode_3==1)&&(timer_28minute==1))
{//mode 3,depense every 28 minutes
P5_1=0;
P6_6=1;
delay_250ms();
P6_6=0;
delay_250ms();
P6_6=1;
delay_250ms();
P6_6=0;
delay_250ms();
P6_6=1;
P5_1=1;
timer_7min=0;//initial the register
_asm
{
BC %flag,0 //clear the 28_minute falg
INC %dispense_counter_1 //increament the dispense_counter
JBC %STATUS,2
INC %dispense_counter_2
}
}
}
//restore ACC,R3,R4
_asm
{
BC 0x0F,0 //clear the TCCINT flag
MOV A,@0x40
MOV %TCC,A //reset the initial value of TCC(0x01)
ENI
SWAPA 0x2E //restore R3
MOV 0x03,A
SWAPA 0X2F //restore R4
MOV 0x04,A
SWAP 0x2D //restore A
SWAPA 0x2D
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -