?? myproj.c
字號:
#include <reg52.h>
typedef unsigned char BYTE;
BYTE iNum;//當前秒表值
BYTE iInit;//倒計時初值
BYTE iTimes;//用于精確到秒
BYTE iMode;//定時器工作模式
BYTE iFunc;//當前按鈕功能
BYTE iCMD;//接收到的命令
BYTE iDATA0;//接收到的參數0
BYTE iDATA1;//接收到的參數1
bit bState;//功能鍵狀態 0為操作主菜單 1為操作子菜單
BYTE TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
BYTE RECVBUF[16];//接收緩沖區
BYTE iRECVNUM;//接收到的個數
void ExcuteCMD();//處理子程序
void Delay(int i);//延時子程序
void DispNum(void);//顯示LED程序
void DispLed(void);//顯示數碼子程序
void CopyM(char des[],char src[],int iCnt);//顯示LED程序
void ClearM(char src[],int iCnt);//顯示數碼子程序
void main()
{
SP=0x60;
iNum=0x01;
iTimes=0x10;
P2=0x00;
P0=0xff;
TMOD=0x21;
TH1=0xfd;
TL1=0xFd;
TH0=0x00;
TL0=0x00;
SCON=0x50;
PCON=0x80;
IE=0xd7;
IT1=1;
IT0=1;
TR1=1;
TR0=1;
RI=0;
iRECVNUM=0;
bState=0;
iFunc=0;
iInit=30;
iCMD=0xff;
iDATA0=0xff;
iDATA1=0xff;
while(1)
{
if(iRECVNUM>=8)
ExcuteCMD();
DispLed();
DispNum();
}
}
void CopyM(char des[],char src[],int iCnt)
{
int i;
for(i=0;i<iCnt;i++)
des[i]=src[i];
}
void ClearM(char src[],int iCnt)
{
int i;
for(i=0;i<iCnt;i++)
src[i]=0x00;
}
void DoCMD(void)
{
switch(iCMD)
{
case 0x00:
TR0=1;
break;
case 0x01:
TR0=0;
break;
case 0x02:
iNum=0;
break;
case 0x03:
if(iMode==0)
iNum=00;
else
iNum=iInit;
break;
case 0x04:
if(iDATA0>=0&&iDATA0<=1)
iMode=iDATA0;
break;
case 0x05:
if(iDATA0>=0&&iDATA0<=99)
iInit=iDATA0;
break;
default:
break;
}
}
void ExcuteCMD()
{
int i,j=0,k=0;
if(RECVBUF[0]==0x02&&RECVBUF[2]==0x01&&RECVBUF[RECVBUF[1]+1]==0x03)
{
for(i=3;i<=(RECVBUF[1]-1);i++)
j+=RECVBUF[i];
if(j==RECVBUF[RECVBUF[1]])
{
iCMD=RECVBUF[3];
iDATA0=RECVBUF[4];
iDATA1=RECVBUF[5];
DoCMD();
k=iRECVNUM-RECVBUF[1]-2;//剩下的個數
CopyM(RECVBUF,RECVBUF+RECVBUF[1]+2,k);
ClearM(RECVBUF+k,iRECVNUM-k);
iRECVNUM=k;
}
else
{
CopyM(RECVBUF,RECVBUF+1,--iRECVNUM);
ClearM(RECVBUF+iRECVNUM,1);
}
}
else
{
CopyM(RECVBUF,RECVBUF+1,--iRECVNUM);
ClearM(RECVBUF+iRECVNUM,1);
}
}
void serial(void) interrupt 4//定義串行口中斷處理子程序
{
ES=0;
if(TI)
TI=0;
while(RI)
{
RECVBUF[iRECVNUM]=SBUF;
iRECVNUM++;
RI=0;
}
ES=1;
}
void TimeSec(void) interrupt 1//定義定時器0中斷處理子程序
{
TR0=0x0;
TL0=0x00;
TH0=0x00;
if(--iTimes<=0)
{
iTimes=0x10;
switch(iMode)
{
case 0:
if(iNum++>=60)
iNum=0;
break;
case 1:
if(iNum--<=0)
iNum=iInit;
break;
default:
break;
}
}
TR0=0x1;
}
void Int0Add(void) interrupt 0//定義中斷0處理子程序
{
EX0=0;
if(bState)
{
switch(iFunc)
{
case 4:
if(++iMode>1)
iMode=0;
break;
case 5:
if(++iInit>99)
iInit=0;
break;
default:
break;
}
}
else
if(++iFunc>5)
iFunc=0;
EX0=1;
}
void Int1Ent(void) interrupt 2//定義中斷1處理子程序
{
EX1=0;
switch(iFunc)
{
case 0:
TR0=1;
break;
case 1:
TR0=0;
break;
case 2:
iNum=0;
break;
case 3:
if(iMode==0)
iNum=00;
else
iNum=iInit;
TR0=1;
break;
default:
bState^=1;
break;
}
EX1=1;
}
void DispNum(void)
{
BYTE i,j;
i=iNum/10;
j=iNum%10;
P0=TAB[i];
P2=0x40;
Delay(500);
P0=TAB[j];
P2=0x20;
Delay(500);
}
void DispLed(void)
{
P2=0x80;
if(bState)
{
if(iFunc==4)
P0=iMode;
else
P0=iInit;
}
else
P0=iFunc;
Delay(500);
}
void Delay(int i)
{
while(--i);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -