📄 common.c
字号:
#include<reg52.h>
#include <intrins.h>
#include "Define.h"
#include "Common.h"
////////////////////////////////////////////////////////////////////////
/****************Switch*******************/
UCHARCODE TestItemArray[TESTITEMCOUNT] = {EEPROM_SERIAL, AD_DA, BEE}; //测试项数组,存储测试项代号
UCHAR CurrentTestItem = EEPROM_SERIAL; //系统默认的测试项为EEPROM_SERIAL
UCHAR CurrentTestMode = AUTORUN; //系统默认的测试模式为自动演示模式
UINTCODE TTLOfEachTestItem[TESTITEMCOUNT] = {20, 20, 6}; //自动模式下各个测试项的生存时间
///////////////////////////////
UCHARDATA ucdLEDDisplayArray[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //LED显示数组,存储将要在LED上显示的数据(从EEPROM中获得的数据),这些数据也会从串口发送出去
UCHARDATA ucdRXArray[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //存储从串口接收的数据
UCHARDATA LengthOfLEDDisplayArray = 16; //LED显示数组中数据的长度
/////////////////////
//CHARCODE cLCDDisplayArray[32] = "CurrentTestItem:";
CHARCODE *pccLCDDisplayArray = 0; //LCD显示指针,指向LCD显示数组的首地址,会随测试项的变化而变化
UCHARIDATA ucidLengthOfLCDDisplayArray = 0; //LCD显示数组的长度
UCHARIDATA LCDFlag = 0; //LCD显示标志
UCHARIDATA LEDFlag = 1; //LED显示标志
UCHARIDATA TestItemNeedInitFlag = 1; //测试项需要初始化标志
UCHARIDATA WriteEEPROMFlag = 0; //EEPROM需要写入数据标志
UCHARIDATA WriteEEPROMComplete = 1;
/////////////////////////////////////////////////////////////////////
CHARCODE LCDMessageOne[36] = "CurrentTestItem: SERIAL_EEPROM"; //将要写入LCD的信息1
CHARCODE LCDMessageTwo[36] = "CurrentTestItem: AD_DA"; //将要写入LCD的信息2
CHARCODE LCDMessageThree[36] = "CurrentTestItem: BEE"; //将要写入LCD的信息3
///////////////////////////////////////////////////////////////////////
/****************Init*******************/
/****************Display*******************/
UCHARIDATA ucidT0Counter0 = 0; //Timer0中的计数器
UCHARIDATA ucidT0Counter1 = 0; //Timer0中的计数器
UCHARIDATA ucidManualTTLCounter = 0; //手动模式超时计数器
UCHARIDATA ucidT1Counter = 0; //Timer1中的计数器
UCHARIDATA ucidT1Acc = 1; //Timer1中的移位变量
UCHARDATA ucdLCDCounter = 0; //LCD显示计数器
UCHARDATA ucdLEDCounter = 0; //LED显示计数器
UCHARDATA ucdLEDCounterStart = 0; //LED显示起始位置(用于在LED上循环显示数据)
/////////////////////////////////////
UCHARIDATA TestItemTTLCounter = 0; //测试项超时计数器
UCHARIDATA TestItemPointer = 0; //测试项指针,与TestItemArray[]配合使用
/*
0x76,/*H
0x3E,/*U
0x6D,/*S
0x07,/*T
0x3F,/*D
0x30,/*I
0x77,/*A
0x37,/*N
0x6D,/*S
0x79,/*E
0x39,/*C
0x38,/*L
*/
/* LED显示段码表 */
UCHARCODE uccTab[40] = {
0x3f,0x06,0x5b,0x4f, /* 0 1 2 3 */
0x66,0x6d,0x7d,0x07, /* 4 5 6 7 */
0x7f,0x6f,0x77,0x7c, /* 8 9 A b */
0x58,0x5e,0x79,0x71, /* c d E f */
0x00,0x0c,0x40,0x3e, /* _| - U */
0x09,0x76,0x6D,0x07, /* = H S T */
0x3F,0x30,0x37,0x38 /* D I N L */
};
/****************Serial*******************/
UCHARIDATA ucidTXCounter = 0; //串口发送计数器
UCHARIDATA ucidRXCounter = 0; //串口接收计数器
/****************EEPROM*******************/
/*有关全局变量*/
sbit Sda= P1^7; //串行数据
sbit Scl= P1^6; //串行时钟
sbit P34= P3^4; //蜂鸣器
/****************AD_DA*******************/
////////////2006.11.08添加///////////////////
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
#define Wait30us {Wait10us;Wait8us;Wait4us;Wait2us;}
///////////////////////////////
UCHAR ADTransValve = 0; //AD转换数字值
UINT DATransValve = 0;
/************定义接口总线**************/
sbit ADClock = P1 ^ 5; //时钟口线
sbit ADDataOut = P1 ^ 4; //数据输出口线
sbit ADChipSelect = P2 ^ 7; //片选口线
/************接口总线定义结束**********/
sbit SPI_CLK = P3^5;
sbit CS_DA = P3^7;
sbit CS_AD = P3^6;
sbit DA_DATAIN = P3^2;
sbit AD_DATAOUT = P3^3;
/****************LCD*******************/
sbit dc=P0^6; //LCD 的RS
sbit rw=P0^7; //LCD 的R/W
sbit cs=P1^4; //LCD 的E
sfr lcdbus=0xA0; //LCD 数据 D0=P20
UCHARIDATA ucidStopWatchHigh = 0; //串口发送计数器
UCHARIDATA ucidStopWatchLow = 0; //串口接收计数器
UCHARIDATA ucidStopWatchSecond = 0; //串口接收计数器
unsigned int sys10mscounter;
unsigned char syslimitcounter;
//char path1[8]={0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f};/*自定义符号横1*/
//char path2[8]={0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00};/*自定义符号横2*/
//char pats1[8]={0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15};/*自定义符号竖1*/
//char pats2[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a};/*自定义符号竖2*/
//////////////////////////////////////
unsigned char data lcdcounter; //LCD计数器
bit lcdusing1,lcdusing2; //LCD用到变量
/****************KBScan*******************/
////////KBScan////////
UCHARIDATA ucdKBScanResult; //键盘扫描结果
//UCHARIDATA ucdKBScanResult;
UCHARIDATA ucdKBScan_Acc; //键盘扫描移位变量
UCHARIDATA ucdReceiver; //给P1口赋值后从P1口获取的数据
UCHARIDATA ucdIncrease; //键盘扫描增量
UCHARIDATA i; //键盘扫描变量
UCHARIDATA j;
UCHARIDATA k;
UCHARIDATA uccRemove[3]={0x03,0x05,0x06}; //键盘扫描赋值数组
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/****************Switch*******************/
void Switch()
{
switch(ucdKBScanResult)
{
case S0:
break;
case S1:
if(CurrentTestMode == MANUAL)
{
ucidManualTTLCounter = 0;
CurrentTestMode = AUTORUN;
TestItemTTLCounter = 0; //重新置零
//////////////////////////
TestItemPointer++;
TestItemPointer = (TestItemPointer)%TESTITEMCOUNT;
CurrentTestItem = TestItemArray[TestItemPointer];
if(CurrentTestItem != BEE)
{
P34 = 1;
}
TestItemNeedInitFlag = 1;
}
else
{
CurrentTestMode = MANUAL;
}
break;
case S2:
if(CurrentTestMode == MANUAL)
{
TestItemTTLCounter = 0; //重新置零
//////////////////////////
ucidManualTTLCounter = 0;
TestItemPointer++;
TestItemPointer = (TestItemPointer)%TESTITEMCOUNT;
CurrentTestItem = TestItemArray[TestItemPointer];
if(CurrentTestItem != BEE)
{
P34 = 1;
}
TestItemNeedInitFlag = 1;
}
break;
case S3:
break;
case S4:
break;
case S5:
break;
case S6:
break;
case S7:
break;
case S8:
break;
default :
{
if(WriteEEPROMFlag == 1)
{
WriteEEPROMFlag = 0;
WriteEEPROMComplete = 1;
PageWrite(ucdRXArray, 0);
WriteEEPROMComplete = 0;
//ByteWrite(ucdRXArray, 0, WriteEEPROMLength);
//mDelay(20);
}
switch(CurrentTestItem)
{
case EEPROM_SERIAL:
if(TestItemNeedInitFlag == 1)
{
TestItemNeedInitFlag = 0;
//SequentialRead(ucdLEDDisplayArray,16);
RandomRead(ucdLEDDisplayArray,0,16);
//mDelay(20);
//cLCDDisplayArray = {'C','u','r','r','e','n','t','T','e','s','t','I','t','e','m',':','E','E','P','R','O','M','_','S','E','R','I','A','L'};
//cLCDDisplayArray = "CurrentTestItem:EEPROM_SERIAL";LCDMessageOne
ucdLEDCounterStart = 0;
pccLCDDisplayArray = LCDMessageOne;
ucidLengthOfLCDDisplayArray = 33; //29
LCDFlag = 1;
TI = 1;
//cs = 1;
}
break;
case AD_DA:
if(TestItemNeedInitFlag == 1)
{
TestItemNeedInitFlag = 0;
ucdLEDCounterStart = 0;
pccLCDDisplayArray = LCDMessageTwo;
//P2 = 2;
ucidLengthOfLCDDisplayArray = 25;
LCDFlag = 1;
//cs = 1;
}
else
{
ADTransValve = ADTrans(); //TLC549
mDelay(20);
DATransValve = (UINT)ADTransValve;
DATransValve = DATransValve<<2;
DATrans(DATransValve); //TLC5615DA转换
TreatLEDDisplayArrayForAD(ADTransValve);
}
break;
case BEE:
if(TestItemNeedInitFlag == 1)
{
TestItemNeedInitFlag = 0;
ucdLEDDisplayArray[0] = 8;
ucdLEDDisplayArray[1] = 14;
ucdLEDDisplayArray[2] = 27;
ucdLEDDisplayArray[3] = 27;
ucdLEDCounterStart = 0;
pccLCDDisplayArray = LCDMessageThree;
//P2 = 3;
ucidLengthOfLCDDisplayArray = 23;
LCDFlag = 1;
//cs = 1;
}
break;
default :
break;
}
}
break;
}
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/****************Init*******************/
void InitTimer()
{
TMOD = 0x11;
EA = 1;
//IP = 2;
ET1 = 1;
TR1 = 1;
ET0 = 1;
TR0 = 1;
}
void InitSerialPortCommunication()
{
//PT2 = 1;
SCON = 0x50;
//IP = 0x20;
PS = 1;
ES = 1;
TR2 = 0; //定时器2停止计数
T2CON = 0x30; //选择T2为串口的波特率产生源
RCAP2H = 0xFE; //1200bps
RCAP2L = 0xC7;
//TH2 = 0xFE; //1200bps
//TL2 = 0xC7;
//RCAP2H = 0xFF; //19200bps
//RCAP2L = 0xEC;
//RCAP2H = 0xFF; //38400bps
//RCAP2L = 0xF6;
//////////////////////////
//////2400--FF63
//////4800--FFB1
/////9600--FFD8
/////////////////////////
TH2 = 0xFE; //1200bps
TL2 = 0xC7;
TR2 = 1; //定时器2开始定时
}
void InitSystem()
{
//lcd_init();
InitTimer();
InitSerialPortCommunication();
///////////////////////
//lcd_moveto(4);
//lcd_wrcmd(0x40);
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/****************Display*******************/
void Timer(void) interrupt 1 // T0中断 LCD DISPLAY
{
TH0=0xd8; /*12M,10ms*/
TL0=0xf6;
ucidT0Counter0++;
ucidT0Counter1++;
ucidStopWatchLow++;
if(ucidStopWatchLow >= 10)
{
ucidStopWatchLow = 0;
ucidStopWatchHigh++;
if(ucidStopWatchHigh >= 10)
{
ucidStopWatchHigh = 0;
ucidStopWatchSecond ++;
}
}
if(ucidT0Counter0 >= 100 ) //1S之后
{
ucidT0Counter0 = 0; //重新置零
/////////////////////////////////
if(CurrentTestMode == AUTORUN)
{
TestItemTTLCounter++;
if(TTLOfEachTestItem[CurrentTestItem] - TestItemTTLCounter <= 0)
{
TestItemTTLCounter = 0; //重新置零
//////////////////////////
TestItemPointer++;
TestItemPointer = (TestItemPointer)%TESTITEMCOUNT;
CurrentTestItem = TestItemArray[TestItemPointer];
if(CurrentTestItem != BEE)
{
P34 = 1;
}
TestItemNeedInitFlag = 1;
}
}
else
{
}
}
if(ucidT0Counter1 >= 100) //n ms之后
{
ucidT0Counter1 = 0; //重新置零
if(CurrentTestItem == EEPROM_SERIAL)
{
ucdLEDCounterStart++;
if(ucdLEDCounterStart >= LengthOfLEDDisplayArray)
{
ucdLEDCounterStart = 0;
}
}
///////////////////////
if(CurrentTestItem == BEE)
{
P34 = !P34;
}
//ucidManualTTLCounter
if(CurrentTestMode == MANUAL)
{
ucidManualTTLCounter++;
if(ucidManualTTLCounter >= MANUALTTL)
{
ucidManualTTLCounter = 0;
CurrentTestMode = AUTORUN;
TestItemTTLCounter = 0; //重新置零
//////////////////////////
TestItemPointer++;
TestItemPointer = (TestItemPointer)%TESTITEMCOUNT;
CurrentTestItem = TestItemArray[TestItemPointer];
TestItemNeedInitFlag = 1;
}
}
//ucdLEDCounterStart = ((ucdLEDCounterStart++)%LengthOfLEDDisplayArray);
}
/////////////////////////////////////////////////////////////////////////////////
/***********************一以下为LCD显示部分********************************/
if(LCDFlag == 1)
{
LEDFlag = 0;
//if(ucdLCDCounter < ucidLengthOfLCDDisplayArray)
if(ucdLCDCounter < 1)
{
if(ucdLCDCounter == 0)
{
lcd_init(); //全黑
}
P1 = 0x00;
//lcd_wrdata(pccLCDDisplayArray[ucdLCDCounter]); // ucidStopWatchHLow
lcd_wrdata(ucidStopWatchSecond);
lcd_wrdata(ucidStopWatchHigh);
lcd_wrdata(ucidStopWatchLow);//ucidStopWatchSecond
//lcd_wrdata(ucidStopWatchSecond);
ucdLCDCounter++;
P2 = 0;
}
else
{
ucdLCDCounter = 0;
//LCDFlag = 0;
//cs = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -