单片机程序c语言控制家电,用义隆C语言写的一个简单小家电控制器

#include "EM78x156xx.h"

#define DISI()    _asm{disi}

#define ENI()    _asm{eni}

#define SLEP()    _asm{slep}

#define NOP()    _asm{nop}

#define WDTC()  _asm{wdtc}

#define uchar unsigned int

#define uint  unsigned short

#define Key  R53

#define Bz   R51

#define Out  R50

#define Com1 R60

#define Com2 R61

#define Com3 R62

#define Seg1 R63

#define Seg2 R64

#define Seg3 R65

#define Seg4 R66

#define Seg5 R67

#define InCom1 (P6CR|=0x01)

#define InCom2 (P6CR|=0x02)

#define InCom3 (P6CR|=0x04)

#define OutCom1 (P6CR&=0x0E)

#define OutCom2 (P6CR&=0x0D)

#define OutCom3 (P6CR&=0x0B)

bit OkFlag;

bit BzOutFlag;

bit StartFlag;

bit KeyFlag;

uchar Count @0x2F;

uint BzOutTime;

uint TimeFlag;

uchar Minute;

uchar Second;

uchar BiasTime;

const uchar Number1[10]={

0x6F,0x06,0x3D,0x37,0x56,0x73,0x7B,0x26,0xFF,0x77};

const uchar Number2[10]={

0xF7,0x03,0x5E,0x1F,0x8B,0x9D,0xFD,0x13,0xFF,0xBF};

void SysInt(void);

void KeyProcess(void);

void Delayms(uint ms);

void BzOut(void);

void LcdDisplay(uchar Num1,uchar Num2);

void TimeDisplay(void);

void main()

{

SysInt();

while(1)

{

KeyProcess();

TimeDisplay();

}

}

void TimeDisplay(void)

{

uchar temp1,temp2;

//Count++;

Out=!StartFlag;

if(BzOutFlag==1)

{

if((BzOutTime%1000)==0)

BzOut();

if(BzOutTime&gt=20000)

{

BzOutTime=0;

BzOutFlag=0;

}

BzOutTime++;

}

if((Count&gt=249)&&(StartFlag==1))//Count&gt=249

{

Count=0;

if(Second&gt0)

Second--;

if(Second==0)

{

if(Minute&gt0)

{

Minute--;

Second=60;

}

else

{

StartFlag=0;

BzOutFlag=1;

OkFlag=1;

}

}

}

if(OkFlag==1)

{

LcdDisplay(0x0,0x0);

}

else if(Minute&gt=1)

{

if((Minute&gt=1)&&(Second&gt0)&&(StartFlag==1))

{

temp2=(Minute+1)/10;

temp1=(Minute+1)%10;

}

else

{

temp2=Minute/10;

temp1=Minute%10;

}

if((StartFlag==1)&&(Count&gt125))

{

LcdDisplay(0x00,0x00);

}

else

{LcdDisplay(Number1[temp1],Number2[temp2]);}

}

else

{

temp2=Second/10;

temp1=Second%10;

LcdDisplay(Number1[temp1],Number2[temp2]);

}

}

void SysInt(void)

{

WDTCR=0;

DISI();

_asm

{

mov a,@0x44

contw

}

ISR=0;

IMR=0x01;

TCC=5;

PHCR=0xFF;

PDCR=0xFF;

P5CR=0x08;

P6CR&=0x07;

InCom1;

InCom2;

InCom3;

Seg1=0;

Seg2=0;

Seg3=0;

Seg4=0;

Seg5=0;

BiasTime=0;

BzOutTime=0;

TimeFlag=0;

OkFlag=0;

StartFlag=0;

BzOutFlag=0;

Count=0;

Second=0;

Minute=0;

Bz=0;

Out=1;

KeyFlag=0;

ENI();

}

void LcdDisplay(uchar Num1,uchar Num2)

{

switch(BiasTime)

{

case 0:

OutCom1;

Com1=1;

InCom2;

InCom3;

if((Num1&0x01)==0)Seg1=1;

else Seg1=0;

if((Num1&0x08)==0)Seg2=1;

else Seg2=0;

if((Num2&0x01)==0)Seg3=1;

else Seg3=0;

if((Num2&0x04)==0)Seg4=1;

else Seg4=0;

if((Num2&0x20)==0)Seg5=1;

else Seg5=0;

break;

case 1:

OutCom1;

Com1=0;

InCom2;

InCom3;

if((Num1&0x01)==0)Seg1=0;

else Seg1=1;

if((Num1&0x08)==0)Seg2=0;

else Seg2=1;

if((Num2&0x01)==0)Seg3=0;

else Seg3=1;

if((Num2&0x04)==0)Seg4=0;

else Seg4=1;

if((Num2&0x20)==0)Seg5=0;

else Seg5=1;

break;

case 2:

InCom1;

OutCom2;

Com2=1;

InCom3;

if((Num1&0x02)==0)Seg1=1;

else Seg1=0;

if((Num1&0x10)==0)Seg2=1;

else Seg2=0;

if((Num2&0x02)==0)Seg3=1;

else Seg3=0;

if((Num2&0x08)==0)Seg4=1;

else Seg4=0;

if((Num2&0x40)==0)Seg5=1;

else Seg5=0;

break;

case 3:

InCom1;

OutCom2;

Com2=0;

InCom3;

if((Num1&0x02)==0)Seg1=0;

else Seg1=1;

if((Num1&0x10)==0)Seg2=0;

else Seg2=1;

if((Num2&0x02)==0)Seg3=0;

else Seg3=1;

if((Num2&0x08)==0)Seg4=0;

else Seg4=1;

if((Num2&0x40)==0)Seg5=0;

else Seg5=1;

break;

case 4:

InCom1;

InCom2;

OutCom3;

Com3=1;

if((Num1&0x04)==0)Seg1=1;

else Seg1=0;

if((Num1&0x20)==0)Seg2=1;

else Seg2=0;

if((Num1&0x40)==0)Seg3=1;

else Seg3=0;

if((Num2&0x10)==0)Seg4=1;

else Seg4=0;

if((Num2&0x80)==0)Seg5=1;

else Seg5=0;

break;

case 5:

InCom1;

InCom2;

OutCom3;

Com3=0;

if((Num1&0x04)==0)Seg1=0;

else Seg1=1;

if((Num1&0x20)==0)Seg2=0;

else Seg2=1;

if((Num1&0x40)==0)Seg3=0;

else Seg3=1;

if((Num2&0x10)==0)Seg4=0;

else Seg4=1;

if((Num2&0x80)==0)Seg5=0;

else Seg5=1;

default:break;

}

Delayms(1);

BiasTime++;

if(BiasTime&gt=6)

BiasTime=0;

}

void KeyProcess(void)

{

if((TimeFlag&gt0)&&(TimeFlag&lt2000))

{

OkFlag=0;

TimeFlag++;

if(TimeFlag&gt=2000)

StartFlag=1;

}

if((Key==0)&&(KeyFlag==0)&&(StartFlag==0))

{

TimeFlag=1;

Minute++;

if(Minute&gt99)

Minute=0;

if(OkFlag==1)

{

//OkFlag=0;

// Minute=0;

SysInt();

}

KeyFlag=1;

}

else

{

if(Key==1)

KeyFlag=0;

if((Key==0)&&(KeyFlag==0)&&(StartFlag==1))

{

SysInt();

KeyFlag=1;

}

}

}

void BzOut(void)

{

uchar i,j;

for(i=0;i&lt150;i++)

{

Bz=!Bz;

for(j=0;j&lt58;j++)

{NOP();NOP();}

}

/*Delayms(50);

for(i=0;i&lt100;i++)

{

Bz=!Bz;

for(j=0;j&lt50;j++)

{NOP();NOP();}

}*/

Bz=0;

}

void Delayms(uint ms)

{

uint i,j;

for(i=0;i&ltms;i++)

for(j=0;j&lt120;j++)

NOP();

}

void _intcall interrupt_l(void) @0x08:low_int 0

{

_asm

{

//save A --&gt 0x1F ; R3 --&gt 0x3E (ram bank 1); R4 --&gt 0x3F (ram bank 1)

MOV 0X1F,A   ;backup A to 0x1F

SWAPA 0X04   ;backup R4 to 0x3F at bank 3

MOV 0X3F,A   ;backup R4 to 0x3F at bank 3

SWAPA 0X03

MOV 0X3E,A   ;backup R3 to 0x3E at bank 3

}

}

void _intcall interrupt(void) @int 0

{

if(TCIF==0)return;

DISI();

ISR=0;

_asm

{

mov a,@0x44

contw

}

TCC=5;

_asm

{

SWAPA 0X3E   ;restore R3

MOV 0X03,A

SWAPA 0X3F   ;restore R4

MOV 0X04,A

SWAP 0X1F    ;restore A

SWAPA 0X1F

}

_asm{INC 0X2F}

ENI();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值