plc51x.c
来自「PLC源代码」· C语言 代码 · 共 621 行 · 第 1/3 页
C
621 行
0x4,0x26,0x3,0xc5,0x3,0x25,0x5,0x6,0xa,0x80,0x0,0x80,0x5,0x26,0x4,0xc5,0x4,0x25,0x6,0x6,0xa,0x80,
0x0,0x80,0x6,0x26,0x5,0xc5,0x5,0x25,0x7,0x6,0xa,0x80,0x0,0x80,0x7,0x26,0x6,0xc5,0x6,0x25,0x8,0x6,
0xa,0x80,0x0,0x80,0x8,0x26,0x7,0xc5,0x7,0x25,0x0,0x6,0xa,0x80,0x0,0x80,0x0,0x26,0xc,0x0,0x1,0x86,
0xc,0x0,0x2,0x86,0xc,0x0,0x3,0x86,0xc,0x0,0x4,0x86,0xc,0x0,0x5,0x86,0xc,0x0,0x6,0x86,0xc,0x0,0x7,
0x86,0xc,0x0,0x8,0x86,0xc,0x0,0x9,0x86,0xc,0x0,0x0,0x86,0x0f,0x0
};
*/
#endif
//-----------------------------------------------------------------------------------------//
// 子函数名: void inc_CODE_p(void) //
// //
// 注 释: 指向 PLC 运行程序的当前指针 CODE_p 值加 1 //
// //
// 入口参数: 无 //
// 出口参数: 无 //
//-----------------------------------------------------------------------------------------//
//void inc_CODE_p(void)
//{ CODE_p++;
//}
//-------------------------------------------------------------------------------------//
// 10ms延时子程序 //
//-------------------------------------------------------------------------------------//
void Time_10ms(void)
{ volatile unsigned char i;
for(i=0; i<10; i++)
{ ; }
}
//-------------------------------------------------------------------------------------//
// 74HC166并入串出芯片输入键盘扫描程序 //
//-------------------------------------------------------------------------------------//
unsigned char Get_EX_BIT(void)
{ unsigned char i;
unsigned char EX_data = 0;
HC166_SL = 0; // HC166_Disable; 将并行口的数据锁存
Time_10ms();
HC166_CLK = 0; // CLK : 0->1
Time_10ms();
HC166_CLK = 1;
Time_10ms();
HC166_SL = 1; // HC166_Enable; 转为串行
Time_10ms();
for(i=0; i<8; i++)
{ EX_data <<= 1;
if (HC166_DATA == 1) // DATA : QH
{ EX_data |= 0x01; }
HC166_CLK = 0; // CLK : 0->1
Time_10ms();
HC166_CLK = 1;
}
return(EX_data);
}
//-------------------------------------------------------------------------------------//
// 74HC595串入并出芯片输出(16bit数据)LED显示扫描程序 //
//-------------------------------------------------------------------------------------//
void Out_EY_BIT(void)
{ static unsigned char con;
unsigned char i;
unsigned int Ia;
if (++con >=5) { con = 0; }
switch(con)
{ case 0: Ia =( Value & 0x000f);
Ia = TYPE_BCD[Ia];
Ia |= 0x0800;
if (Vc0 == 1) { Ia |= 0xff; }
else { if (Vb0 == 1) { Ia &= 0xff7f; }
}
break;
case 1: Ia =((Value >> 4) & 0x000f);
Ia = TYPE_BCD[Ia];
Ia |= 0x0400;
if (Vc1 == 1) { Ia |= 0xff; }
else { if (Vb1 == 1) { Ia &= 0xff7f; }
}
break;
case 2: Ia =((Value >> 8) & 0x000f);
Ia = TYPE_BCD[Ia];
Ia |= 0x0200;
if (Vc2 == 1) { Ia |= 0xff; }
else { if (Vb2 == 1) { Ia &= 0xff7f; }
}
break;
case 3: Ia =((Value >>12) & 0x000f);
Ia = TYPE_BCD[Ia];
Ia |= 0x0100;
if (Vc3 == 1) { Ia |= 0xff; }
else { if (Vb3 == 1) { Ia &= 0xff7f; }
}
break;
default:
Ia = (~((Va4 << 4) | (Va3 << 3) | (Va2 << 2) | (Va1 << 1) | Va0) & 0x00ff) | 0x1000;
break;
}
for (i = 16; i > 0; i--)
{ HC595_SCLK = 0; //拉低74HC595时钟
Time_10ms();
if ((Ia & 0x8000) == 0) //先送高bit位数据
{ HC595_SDATA = 0; }
else //送74HC595的数据
{ HC595_SDATA = 1; }
Time_10ms();
Ia <<= 1;
HC595_SCLK = 1; //拉高74HC595时钟
Time_10ms();
}
HC595_SDATA = 1; //释放数据总线
Time_10ms();
HC595_RCLK = 0; //锁存数据
Time_10ms();
HC595_RCLK = 1;
Time_10ms();
}
//-------------------------------------------------------------------------------------//
// 100ms 定时子函数 //
//-------------------------------------------------------------------------------------//
void _T100mS(void)
{ unsigned char i;
if (Timer_100ms != 0)
{ Timer_100ms--;
Pulse_val_Sec++;
if (Pulse_val_Sec == 5)
{ Pulse_Sec = ~Pulse_Sec;
}
if (Pulse_val_Sec == 10)
{ Pulse_Sec = ~Pulse_Sec;
Pulse_val_Min++;
Pulse_val_Sec = 0;
}
for (i=0; i<_T_num; i++ )
{ if ((rTF[i/8].BYTE & (1 << (i%8))) != 0)
{ if (_T[i][0] < _T[i][1]) { _T[i][0]++; }
}
}
}
}
//-------------------------------------------------------------------------------------//
// 1Set 定时子函数 //
//-------------------------------------------------------------------------------------//
void _T1Set(void)
{ if ((Pulse_val_Min == 30) && (Pulse_val_Sec == 0))
{ Pulse_Min = ~Pulse_Min;
}
if ((Pulse_val_Min == 60) && (Pulse_val_Sec == 0))
{ Pulse_Min = ~Pulse_Min;
Pulse_val_Min = 0;
}
}
//-------------------------------------------------------------------------------------//
// 5ms 定时中断 子函数,使用定时器 0 //
//-------------------------------------------------------------------------------------//
void timer0(void) interrupt 1 using 1
{ TH0 = (Value_T0_cons >> 8);
Pulse_10ms = ~Pulse_10ms;
if ((++Timer_5ms & 0x01) != 0) { Timer_10ms++; }
if (Timer_5ms == 10) { Pulse_100ms = ~Pulse_100ms; }
if (Timer_5ms == 20)
{ Pulse_100ms = ~Pulse_100ms;
Timer_100ms++;
Timer_5ms = 0;
}
if(UartRxTimerStartFlag) // 接收超时...50ms
{ if(UartWaitForCounter>=10)
{ UartWaitForCounter=0;
UartRxTimerStartFlag=0;
UartDataReadyFlag=1;
REN=0; // 禁止UART接收器
}
else UartWaitForCounter++;
}
}
//-------------------------------------------------------------------------------------//
// 初始化,输入输出,内存处理 子函数 //
//-------------------------------------------------------------------------------------//
void input_IO(void) // X输入,Y输出刷新
{ unsigned char i;
i = P2;
i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
rX[0].BYTE = ~((P1 & 0x0f) | (i & 0xf0));
rX[1].BYTE = ~(i & 0x0f) & 0x0f;
rX[2].BYTE = ~Get_EX_BIT();
P0 = rY[0].BYTE;
Out_EY_BIT();
_M8011_ = Pulse_10ms;
_M8012_ = Pulse_100ms;
_M8013_ = Pulse_Sec;
_M8014_ = Pulse_Min;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?