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

📄 function.c

📁 单片机的主控端
💻 C
📖 第 1 页 / 共 2 页
字号:
//#include "sys.h"
#include "user.h"
#include "ShowLcd.h"

#define MCUCALLPC       0x5b
#define RECEIVEFILEOK   0x55

//extern UCHAR arrayNum;                     //???????
extern UCHAR groupCurrent;      //已采集得数据组数
UCHAR AddressL,AddressH;
UCHAR UIData[8] = {0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30};//比基站数据多两个字节,估计当时是为了凑足EEPROM的整数地址 //save the data from the cell
bit receiveFlag,responseFlag,sendFlag;
data UCHAR *p;
typedef struct
{
	UCHAR cellStack[CELLMAXNUM];
	UCHAR length;
	UCHAR point;
}ASTACK;
ASTACK cellInfo; 

void UserInit()
{
	cellInfo.length = 0;
	cellInfo.point  = 0;
	cellInfo.cellStack[0] = 0;
	receiveFlag = 0;
	responseFlag = 0;
	sendFlag = 0;
	SEND_RECEIVE    = 1;           //send status
}

void Write_Display(UCHAR *Display_Addr)
{
    UCHAR tmp;
    Write_Addr(0);
    for(tmp = 0;tmp < 16;tmp ++)
	{
	    Write_Data(Display_Addr[tmp]);
		Delay(1);
	}
	Delay(100);
    Write_Addr(16);
    for(tmp = 16;tmp < 32;tmp ++)
	{
	    Write_Data(Display_Addr[tmp]);
		Delay(1);
	}
}




void PC_CellDisplay()
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(selectString);
}

void EEPQ_Display()
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(EEPQMover);
}

void EEPnum_Display()
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(EEPnum);
}

void NUM_GROUG_DISPLAY()
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(GROUP);
}

void Err_Display()
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(ErorrMessage);
}
void TOPC_display(void)
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(TOPCSMessage);
}

void DELROM_display(void)
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(delterom);
}

void CELLCALL_display(void)
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(CALLCELLMessage);
}
void EEPROMquery_display(void)
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(EEPROMQURRYMess);
}
void EEPROMDELE_display(void)
{
	Init_LCD();
    Delay(50);
    LCDClr();
    Delay(50);
    Write_Display(backspack);	 
    Delay(50);
    Write_Display(EEPROMMessage);
}

//the frequency of MCU is 12MHz;
void Delay(UCHAR n)         
{
	UCHAR i;
	for(i=0;i<n;i++)
	{
	_nop_();
	_nop_();
	}
}
void Delay5s()
{
    UCHAR tmp;
	for(tmp=0;tmp<255;tmp++)
	{
		Delay(255);
	}
	for(tmp=0;tmp<255;tmp++)
	{
		Delay(255);
	}

}

void Init_LCD(void)
{
    Delay(3);
    Write_Com(0x28);    /*设置工作方式*/
    Delay(3);
    Write_Com(0x06);    /*设置输入方式*/
    Delay(3);
    Write_Com(0x0d);    /*设置显示方式*/
    Delay(3);
    Write_Com(0x01);    /*清屏*/
    Delay(3);
}

void LCDClr(void)
{
	Write_Com(0x01);             //0x01
	Delay(3);
	Write_Com(0x02);             //0x02
}

void Write_Com(UCHAR Com)
{
    UCHAR tmp;
    LCD_RS = 0;
    LCD_R_W = 1;
    do
    {
    	P0 = 0xf0 | P0;      /*读BF,AC高四位*/
        LCD_E = 1;
        LCD_E = 1;
        tmp = P0;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;          /*读BF,AC低4位*/
        LCD_E = 1;
        LCD_E = 0;
        LCD_E = 0;
    }
    while(tmp & 0x80);
    LCD_R_W = 0;
    P0 = (P0 & 0x0f) | (Com & 0xf0);
    LCD_E = 1;
    LCD_E = 1;
    LCD_E = 0;
    LCD_E = 0;
    P0 = (P0 & 0x0f) | (Com << 4);
    LCD_E = 1;
    LCD_E = 1;
    LCD_E = 0;
    LCD_E = 0;
}

void Write_Addr(UCHAR Dis_Addr)
{

	if((Dis_Addr >=0) && (Dis_Addr <16))
		Write_Com((Dis_Addr ) | 0x80);
	else if((Dis_Addr >=16) && (Dis_Addr <32))
			Write_Com(((Dis_Addr-16) + 0x40) | 0x80 );
}

void Write_Data(UCHAR Ddata)
{
    UCHAR tmp;
    LCD_RS = 0;
    LCD_R_W = 1;
    do
	{
        P0 = 0xf0 | P0;      /*读BF,AC高四位*/
        LCD_E = 1;
        LCD_E = 1;
        tmp = P0;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;          /*读BF,AC低4位*/
        LCD_E = 1;
        LCD_E = 0;
        LCD_E = 0;
    }
	while(tmp & 0x80);
    LCD_RS = 1;
    LCD_R_W = 0;
    P0 = (P0 & 0x0f) | (Ddata & 0xf0);
    LCD_E = 1;
    LCD_E = 1;
    LCD_E = 0;
    LCD_E = 0;
    P0 = (P0 & 0x0f) | (Ddata << 4);
    LCD_E = 1;
    LCD_E = 1;
    LCD_E = 0;
    LCD_E = 0;
}

void LCDChar(UCHAR position,UCHAR asc)
{
	Write_Addr(position);
	Write_Data(asc);
}

void LCDString(UCHAR position,UCHAR *parrow,UCHAR num)
{
    UCHAR tmp;
	if(position<16)
	{
		Write_Addr(position);
    	for(tmp=0;tmp<num;tmp++)
           {
              Write_Data(parrow[tmp]);
           }
	}
    if(position>=16)
    {
        Write_Addr(position);
        for(tmp=0;tmp<num;tmp++)
        {
        	Write_Data(parrow[tmp]);
        }
    }
}




UCHAR  Kb_Scan(void) 
{
	UCHAR Sccode=0;
    UCHAR Recode=0;
	bit keyOn = 0;
 	P2 = 0x0f;/*发0x00行扫描码,列线输入*/
 	if(((P2&0x0f) != 0x0f)&& (keyOn == 0))/*若有键按下*/
    {  
    	Delay(200);/*延时去抖*/
        if(((P2&0x0f) != 0x0f)&& (keyOn == 0))
        {
        
            Sccode = 0x7f;/*逐行扫描初值*/
            while(((Sccode&0x08) !=0 ) && (keyOn == 0))/*扫描完毕*/
            {
            	P2 = Sccode;/*输出行扫描码*/
                if((P2&0x0f) !=0x0f )/*本行有键按下*/
                {
                    keyOn = 1; 
                	Recode = (P2&0x0f)|0xf0;/*|0xe1;*/ //modify 2nd,mar
                    Sccode = ~Sccode;
                    Recode = ~Recode;
                }
                else
			    	Sccode = (Sccode>>1)|0x80;/*行扫描码右移*/
            }
        }
       // goto END;
    }
   /* END:*/  keyOn = 0;
    return(Sccode+Recode);/*返回特征字节码*/
}

void CommunicatePC(void)                   //communicate with PC   
{
    TOPC = 1;    
    Delay(255);
    SerialInit();
    Write_Display(dataGetProcess);
	Delay5s();
    if(SendAllToPC())
	{
		Write_Display(connectUnsuccess);
		Delay5s();
	}
	else
	{
    	Write_Display(overString);
    	Delay5s();
	}
}

bit SendAllToPC(void)  //发送EEPROM中的所有数据到PC
{
    UINT EEPaddr;
	UINT addTmp;
	bit com_good;
    UCHAR temp;
	UCHAR TIMECALL=10;
    Write_Display(communicateToPC);//"COMMUNICATING     WITH PC....   ";
	Delay5s();
    do
    {
        if (TIMECALL==0)
		{
			
			com_good=1;
			break;
		}
		Delay(200);
        SBUF = MCUCALLPC;
        while(TI == 0)
		{	
			Write_Display(TRANSing);
		}
        TI = 0;
		       
		while(RI == 0)
		{
			Write_Display(RECIEVing);
		}
        RI = 0;
        temp= SBUF;
		TIMECALL--;
		com_good=0;
	}while(temp!= MCUCALLPC);//0x5b
	if(com_good)
		return com_good;
	else
	{
	Write_Display(connectSuccess);
	Delay5s();
	Write_Display(dataGetProcess);
	Delay5s();
    for(EEPaddr = 0; EEPaddr < (8*EEPROMSIZE); )    //发送全部的数据
    {
		addTmp = EEPaddr;
        AddressL= (UCHAR)(addTmp&0x00ff);
        AddressH= (UCHAR)(addTmp>>8);
        Read_I2c_Page(UIData,8);
		addTmp = EEPaddr;
        for(temp=0; temp<8; temp++) //发送已经读取的数据
        {
            SBUF = UIData[temp];
            while(TI == 0);
            TI = 0;
        }
		temp = (addTmp%10) + 0x30;
	    LCDChar(31,temp);
		addTmp /= 10;

		temp = (addTmp%10) + 0x30;
	    LCDChar(30,temp);
		addTmp /= 10;

		temp = (addTmp%10) + 0x30;
	    LCDChar(29,temp);
		addTmp /= 10;

		temp = (addTmp%10) + 0x30;
	    LCDChar(28,temp);
		
		EEPaddr+=8;
    }
    SBUF = RECEIVEFILEOK;    //发送结束标志
    while(TI == 0);
    TI = 0;
	}
	return com_good;
}

void SerialInit(void)
{
	EA = 0;
	SCON = 0x50;//RECIEVE DISABLE,MODE1,R/T
 	TR1 = 1;
 	RI = 0;
 	TI = 0;
}

void Read_I2c_Page(UCHAR * Tmp_Data,UCHAR num_array)         
{
    UCHAR num;
    StartIic;
    Write_8bit(Iic_Write);
    Write_8bit(AddressH);
    Write_8bit(AddressL);    
    StartIic;
    Write_8bit(Iic_Read);
    for(num=0;num<num_array-1;num++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -