📄 main.c
字号:
/***********************************************************************************
*宁波不良品程序操作说明: 上电--按ENT键启动程序--按1-8键选择不良品类型--按ENT确认不良品
*
* 功能键: 一、按9键+mode键 设置波特率
* 二、按9键+CLR键 清零不良品数据
* 三、EXIT键 退出闪烁状态
四。本机地址 ‘_'
************************************************************************************/
//#include "io430.h"
#include "io430x13x.h"
#include "in430.h"
#include <stdlib.h>
#define Address '_' //本机地址
//#define _Project1 // 工数= number
#define _Project2 工数= number*Target/ConvertCode
unsigned char const AddressIndex[] ={'1','A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V','W',
'X','Y','Z','a','b','c','d','e','f','g','h','i',
'j','k','l','m','n','o','p','q','r','s','t','u',
'v','w','x','y','z'
};
unsigned char const LedCode[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00}; //数码管显示代码
unsigned char const DisplayCode[11] = {0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A};
unsigned char const KeyCode[16] = {0X07,0X08,0X09,0X0F,0X04,0X05,0X06,0X0E,0X01,0X02,0X03,0X0D,0X00,0X0A,0X0B,0X0C};
unsigned char const SelectLed[8] = {0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char const CodeTable[][8] = {{Address,Address, '<','{','?',':','+','~'}, //握手指令
{Address,Address, '<','z','?',':','*','~'}, // 读不良品数据指令
{Address,Address, '<','b','?',':','"','~'}, //不良品数据清零指令
{Address,Address, '>','z'}, //写不良品数据指令
{Address,Address, '0','~'}, //数据发送错误指令
{'|','|','?',':','*','~'}, //主控端通信忙
{Address,Address, '<','{','?',':','+','~'}, //下位机1请求通信
{Address,Address, 'B','U','S','E','N','~'}, //总线申请允许
{Address,Address, 'B','U','S','F','R','~'} //总线空闲,可以允许总线申请
};
unsigned char const AsciiTable[] = {0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39}; //ASCII编码表
unsigned char ProtoCodeCon[] = {'<','{','?',':','*','~'};
unsigned char ProtoCodeCon1[] = {/*Address,*/ '=','{','?',':','+','~'}; //单片机回送握手指令
unsigned char ProtoCode[3] = {Address, '=','z'}; //本机地址
unsigned char CorrectCode[3] = {/*Address,*/ '1','~'}; //接受到正确的指令字
unsigned char ReTxdData[3] = {/*Address,*/ '0','~'}; //要求重发指令
unsigned long const Baud[] = {115200,76800,57600,38400,19200,9600,4800};
unsigned char const BaudRate[][3] = {{0x22,0x00,0xED}, {0x34,0x00,0x40}, {0x45,0x00,0x4A}, {0x68,0x00,0x40},
{0xD0,0x00,0x40}, {0xA0,0x01,0xC0}, {0x41,0x03,0x00}};
unsigned char ReceviceBuff[51]; //数据接收缓冲器
unsigned char TransmitBuff[51]; //数据包打包格式数组缓冲器
unsigned char TotalProTemp[9][4]; //用于数据拆包临时变量
unsigned char DisplayKeyCode[12]; //段显示变量
unsigned int TotalPro[10]; //不良品数累计数
unsigned int TimeSec1[25][2]; //第一时间段数组
unsigned int TimeSec2[9][2]; //第二时间段数组]
unsigned char TimeSectionIndex; //时间段索引
unsigned char SecIndex; //段索引
unsigned char TimeIndex; //时间索引
unsigned int CovertVar; //段显码转换变量
unsigned char Key; //按键
unsigned char KeyTemp; //临时按键
unsigned int Flag; //标志变量
unsigned int UartFlag; //标志变量
signed char i; //变量i
unsigned char count; //记数
unsigned char Index; //波特率选择
unsigned char UartCount=0; //波特率记数
unsigned char UartCounter=0; //用于波特率记数1
unsigned char CheckSum; //校验和
unsigned char TimerCount; //定时器记数
unsigned char CommunicationErr; //通信错误变量
unsigned char ClockCount; //定时时钟记数
unsigned char Second; // 秒
unsigned char Min; //分
unsigned char Hour; //小时
unsigned char DisplayCodeTemp[4]; //临时数据数组
unsigned long DisplayFlg; //用于显示的标志
unsigned int ConvertCode=0;
unsigned int Plan; //计划
unsigned int Target; //目标
unsigned int Real; //实绩
unsigned int Number; //工数
unsigned int SelfAddress; //本机地址变量
signed int ScaleClock; //时钟设定标尺
unsigned int temp; //临时变量
unsigned char temp1; //临时变量
unsigned int CounterForNumber; //工数记数器
unsigned char Counter; //时钟记数器
signed char SearchIndex; //查询索引
unsigned char ConflictFlag; // 冲突标志
#define Baud1 115200 //波特率12
#define Baud2 76800 //波特率2
#define Baud3 57600 //波特率2
#define Baud4 38400 //波特率3
#define Baud5 19200 //波特率4
#define Baud6 9600 //波特率5
#define Baud7 4800 //波特率6
#define Key0 0X0C //数字键0
#define Key1 0X08 //数字键1
#define Key2 0X09 //数字键2
#define Key3 0X0A //数字键3
#define Key4 0X04 //数字键4
#define Key5 0X05 //数字键5
#define Key6 0X06 //数字键6
#define Key7 0X00 //数字键7
#define Key8 0X01 //数字键8
#define Key9 0X02 //数字键9
#define MODE 0X0D //功能键 MODE 用于波特率的设定
#define EXIT 0X0E //功能键 EXIT 用于程序的退出
#define ENT 0X0F //功能键 ENT 用于确认
#define CLR 0X0B //功能键 CLR 用于清除
#define DOWN 0X07 //功能键 DOWN 用于点减
#define UP 0X03 //功能键 UP 用于增加
#define ShrinkFlg 0X01 //显示需要闪烁的标志
#define EntFlg 0X02 //不良品数量确认的标志
#define ResetFlg 0X04 //复位状态的标志
#define KeyFlg 0X08 //获取按键标志
#define FunKey 0X10 //功能按键
#define BandSetFlg 0X20 //波特率设定标志
#define StartFlg 0X40 //启动不良品检测标志
#define BaudSet 0X80 //指令错误
#define LCJ 0X100 //闪烁标志1
#define ShrinkFlg_2 0X200 //闪烁标志2
#define FunClrFlg 0X400 //启动功能键
#define ReceiveFinish 0X800 //接受指令字完成标志
#define RUNFlg 0X1000 //CLR键被按下的标志
#define LowPowerFlg 0X2000 //闪烁标志3
#define ReceiveDataFlg 0X4000 //接收数据标志
#define LOWFlg 0X8000 //低位转换标志
#define LinkHandFlg 0X01 //通信握手标志
#define ResetDataFlg 0X02 //读指令字
#define WriteFlg 0X04 //读指令字
#define ServerBusy 0X08 //指令结束格式 ?
#define Format_2 0X10 //指令结束格式 :
#define Format_3 0X20 //指令结束格式 ~
#define CheckOk 0X40 //指令校验正确标志
#define SendDataFlg 0X80 //发送数据指令
#define BusyState 0X01 //通信繁忙
#define FreeState 0X02 //通信空闲
#define NolinkState 0X04 //接收乱码
#define WaitFlg 0X08 //等待接收
#define ContinueBusy 0X10 //总线继续 繁忙
#define ErrCodeFlg 0X20 //总线上乱码
#define BaudDefault 0X05 //设定默认波特率为 19200
#define ReSendErr 0X01 //发送重发指令丢失
#define SendDataErr 0X02 //发送数据指令丢失
#define ConfirmErr 0X03 //发送正确接收指令丢失
#define LinkHandErr 0X04 //发送握手指令丢失
//新加入的宏定义
#define MaxCount 9999 //显示的最大值
#define ShiftCode 0X80 //串行转换码
//用于显示标志位
#define DShrSetFlg 0X01 //第二行闪烁标志
#define DShrinkFlg 0x02 //数据超范围闪烁标志
#define DClockFlg 0X04 //设置时钟标志
#define PlanSetFlg 0X08 //计划设定标志
#define NumSetFlg 0X10 //工数设定标志
#define FirstFlg 0X20 //闪烁处理标志
#define ClockSetFlg 0X40 //时钟设定标志
#define ErrFlg 0X80 //出错标志
#define AddressSetFlg 0X100 //本机地址设定标志
#define StartShrinkFlg 0X200 //启动闪烁标志
#define TimeSection1SetFlg 0X400 //第一班时间设定
#define TimeSection2SetFlg 0X800 //第二班时间设定
#define TimeIndexFlg 0X1000 //时间检索标志
#define AutoCounterFlg 0X2000 //自动时间检测标志
#define ChangeWorkFlg 0X4000 //换班标志
#define CheckTimeFlg 0X8000 //比较标志
#define TimeFirstFlg 0X10000 // 时间第一次标志
#define P15DelayFlg 0X20000 //实绩开关延时标志
#define P16DelayFlg 0X40000 //启动开关延时标志
#define ShrinkFlg_1 0X00ff //无效标记
void Init(void); //初始化
void SysInit(void); //系统初始化
void Delay10ms(int num); //延时程序
void Clock();
void SetBaud(int baud); //波特率设定
void Disper(void); //高位0消隐
void Disapper(void);
void DisplayLed(void); //显示LED
void SendData(unsigned char * ,unsigned char ); //发送数据
unsigned char DataPack(void); //数据打包处理
unsigned char CovertToAsc(void); //转换到ASCII
void FlashWrite(unsigned int TotalPro[]); //保存数据到闪存
void FlashRead(void);
unsigned char FlashBusy(void);
void FlashErase(unsigned int);
void ConvertData(int data);
void ConfirmData(); //确认数据的合法性
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
FlashRead(); //读地址为0X1080的数据
for(i=0; i<12; i++)
{
DisplayKeyCode[i] =LedCode[0]; //初始显示为0
}
for(i=0; i<10; i++)
TotalPro[i] = 0;
Init();
while(1)
{
//TotalPro[1] = Plan;
//TotalPro[2] = Target;
//TotalPro[3] = Real;
if((P6IN & P6IN_4) != P6IN_4) //如果掉电进入掉电处理
{
Flag |= LowPowerFlg;
DisplayFlg &= ~FirstFlg;
if((DisplayFlg & FirstFlg) == FirstFlg)
{
TACCTL0 &= ~CCIE; //不允许定时器A中断
TBCTL = TBSSEL_1 + MC_1; //定时器B 32768HZ 中断
TBCCTL0 = CCIE; //定时器B 中断允许
TBCCR0 = 32768; //定时时间1s
LPM3;
}
}
if((Flag & ReceiveDataFlg) == ReceiveDataFlg) //接受上位机数据后,解包的处理
{
_DINT();
unsigned char Counter;
unsigned char ii=0;
signed char j=0;
unsigned int k=0;
unsigned int digital=0;
CheckSum=0;
for(ii=0; ii<9; ii++)
{
for(j=0; j<4; j++)
{
TotalProTemp[ii][j]=0; //临时数组初始化
}
}
while(ReceviceBuff[ii++] != '~') ; //获取接收数据指令的长度
j = 0;
for(Counter=4; Counter<(ii-4); Counter++) //截取数据字符
{
CheckSum += ReceviceBuff[Counter];
if((ReceviceBuff[Counter] != ',')) //获取ASCII数据
{
{
TotalProTemp[k][j++] = ReceviceBuff[Counter];
}
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -