?? icl7135_fin99.c
字號:
/*
winson
*/
/**************************************通信函數庫*******************************************/
#include <reg2051.H>
#include <string.h>
/**************************************串口通信宏定義*******************************************/
#define frameStar 0x0a //幀起始地址
#define frameEnd 0x2a //幀結束地址
typedef unsigned char uchar ;
typedef unsigned int uint ;
/**************************************串口通信變量聲明**************************************/
char data m_dataBuffer[5] ={"99999"}; //全部數據信息(N維數組形式)
char data pre_dataBuffer[5] ={"99999"}; //全部數據信息(N維數組形式)
char data disp_dataBuffer[5]={"54321"}; //全部數據信息(N維數組形式)
/**************************************串口通信子程序聲明*******************************************/
initcom(void);
void com_data_send(char dataBuffer[]);
/**************************************通用函數的聲明*******************************************/
void delaymsec(unsigned int x);
/**************************************通用端口地址定義*******************************************/
sbit D1 = P3^7; //IO口位聲明
sbit D2 = P1^4;
sbit D3 = P1^5;
sbit D4 = P1^6;
sbit D5 = P1^7;
enum
{
STATE_D5,
STATE_D4,
STATE_D3,
STATE_D2,
STATE_D1
};
uchar next_state= STATE_D5;
uchar pre_state;
uchar count = 0;
uint disp_timer = 20;
//定時器0中斷子程序
timer0_isp(void)interrupt 1 using 2 //interrupt service pocess 中斷服務程序(數據)
{
TH0 = 0X4B; //置初值
TL0 = 0X6A;
TR0 = 1; //開定時器0
ET0 = 1;
if(disp_timer != 0)
{
disp_timer--;
}
}
main(void)
{
initcom();
EA = 1;
do
{
switch(next_state)
{
case STATE_D5:
while(D5); //D5高電平等待
delaymsec(1);
m_dataBuffer[0] = ((~P1)&0x0f)|0x30;
pre_state = STATE_D5;
next_state = STATE_D4;
while(!D5);
break;
case STATE_D4:
while(D4);
delaymsec(1);
m_dataBuffer[1] = ((~P1)&0x0f)|0x30;
if(pre_state == STATE_D5)
{
pre_state = STATE_D4;
next_state = STATE_D3;
}
else
{
next_state = STATE_D5;
}
while(!D4);
break;
case STATE_D3:
while(D3);
delaymsec(1);
m_dataBuffer[2] = ((~P1)&0x0f)|0x30;
if(pre_state == STATE_D4)
{
pre_state = STATE_D3;
next_state = STATE_D2;
}
else
{
next_state = STATE_D5;
}
while(!D3);
break;
case STATE_D2:
while(D2);
delaymsec(1);
m_dataBuffer[3] = ((~P1)&0x0f)|0x30;
if(pre_state == STATE_D3)
{
pre_state = STATE_D2;
next_state = STATE_D1;
}
else
{
next_state = STATE_D5;
}
while(!D2);
break;
case STATE_D1:
while(D1);
delaymsec(1);
m_dataBuffer[4] = ((~P1)&0x0f)|0x30;
//校驗是否為正確的接收碼
if((m_dataBuffer[0]=='0')||(m_dataBuffer[0]=='1'))
if('0'<=m_dataBuffer[1]&&m_dataBuffer[1]<='9')
if('0'<=m_dataBuffer[2]&&m_dataBuffer[2]<='9')
if('0'<=m_dataBuffer[3]&&m_dataBuffer[3]<='9')
if('0'<=m_dataBuffer[4]&&m_dataBuffer[4]<='9')
if(strcmp(m_dataBuffer,pre_dataBuffer))
{
count = 0;
memcpy(pre_dataBuffer,m_dataBuffer,5);
}
else
{
count++;
}
if(count == 5)
{
memcpy(disp_dataBuffer,pre_dataBuffer,5);
count = 0;
}
if(disp_timer == 0)
{
disp_timer = 20;
com_data_send(disp_dataBuffer);
}
next_state = STATE_D5;
while(!D1);
break;
}
}while(1);
}
/**************************************串口通信子程序**************************************/
//初始化串口
initcom(void)
{
EA = 0;
TMOD = 0x21; //定時器T1定義為模式2
PCON = 0x80;
SCON = 0X58; //設置串行口控制字,方式1,允許接收;允許方式2、3第9位數據
ES = 0; //允許串口中斷
PS = 1; //設置串口中斷優先級
TH1 = 0xFD; //置初值
TL1 = 0XFD;
TR1 = 1; //開定時器1
TH0 = 0X4B; //置初值
TL0 = 0X6A;
TR0 = 1; //開定時器0
ET0 = 1;
/*EA=1; //打開單片機中斷允許*/
}
//發送子程序
void com_data_send(char dataBuffer[])
{
uchar m;
ACC=frameStar;
TB8=P;
SBUF=ACC; //發送幀起始標志
while(TI != 1);
TI = 0;
for(m=0;m<5;m++)
{
ACC=dataBuffer[m];
TB8=P;
SBUF=ACC; //發送數據信息
while(TI != 1);
TI = 0;
}
ACC=frameEnd;
TB8=P;
SBUF=ACC; //發送幀結束標志
while(TI != 1);
TI = 0;
}
/**************************************通用子程序**************************************/
void delaymsec(unsigned int x) //延時ms級
{
uchar j;
while((x--)!=0)
{
for(j=0;j<125;j++)
{}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -