⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 51开发板调试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -