cl_main1.c

来自「51单片机读写nor flash 读出flash 的ID」· C语言 代码 · 共 1,114 行 · 第 1/2 页

C
1,114
字号
/************************************************************/
/* Copyright 2006,北京德彼克创新科技有限公司研发中心
*  All rights reserved.
*
*  文件名:CL_main.c
*  摘  要: 长岭主程序
*
*  当前版本:1.0
*  作    者:赵春生
*  完成日期: 2006/06/20  
*  修改日期: 2006/12/28  
*  修改人     : d-peak R&D  8712
*/
/*****************************************************************/
#include <ABSACC.H>
#include <math.h>
#include "STC89C516.h" 
#include "peripherals_control.h"
#include "test_gui.h"
#include "cl_main.h"
#include "SST39VF088.h"
#include <stdio.h>

BYTE xdata CommandBuf[BufLen];	//
BYTE	count = 0 ;
bit	IsBufFull;
bit	IsBufEmpty;
bit  temp_pre;
BYTE	dataSrc,dataSrcBkup;  
//bit	HaveCursor = 0;
bit	cursorEnable;
BYTE	inputMode=COMMON_MODE;
//BYTE	inputMode=ASCII_MODE;
BYTE	sectorIndex;
BYTE	Receive_in;
BYTE	Receive_out;
BYTE	curCol = 0,curRow = 0;
#ifdef CURSOR_FIXED
BYTE 	curColUsing=0,curRowUsing=0;
#else
#define 	curColUsing 	curCol
#define 	curRowUsing	curRow
#endif
BYTE	curColorFront = 7,curColorBg = 0;
BYTE	COLOR_FRONT = RED,COLOR_BG = WHITE;
BYTE	overlayMode = TRANSPARENT,ZOOMX = 1,ZOOMY=1;	

BYTE xdata 	COLOR_FRONT_BKUP,COLOR_BG_BKUP;
BYTE xdata 	curColBkup=0,curRowBkup=0;
BYTE xdata 	overlayModeBkup,ZOOMXBKUP,ZOOMYBKUP;

WORD	FlashPtr;

BYTE	csflag; //912

BYTE xdata 	INIT_COLOR_FRONT_BKUP,INIT_COLOR_BG_BKUP;
BYTE xdata 	INIT_curColBkup,INIT_curRowBkup;
BYTE xdata 	INIT_overlayModeBkup,INIT_ZOOMXBKUP,INIT_ZOOMYBKUP;


/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------

时钟初始化
实现功能:设定串口模式及波特率

作者:赵春生
 完成日期: 2006/06/20    
----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////////////

void init_clock_9600(void)
{
	EA 	= 0;
	//IE = 0x02;          // Enable Timer 0 interrupt
	SCON 	= 0x50;        // setup serial port control, serial mode 1
	TMOD 	= 0x21;
	TH1 	= 0xfa;         // 9600 BAUD @ 22.1184MHz
	TCON 	= 0x50;        // TR0 = TR1 = 1, start timer   //low interrupt
	//TCON 	= 0x51;        // TR0 = TR1 = 1, start timer   // undershoot  interrupt 
	// TR1 = 1;
//	EA 	= 1;
}

void init_clock_19200(void)
{
	EA = 0;
	//IE = 0x02;          // Enable Timer 0 interrupt
	SCON = 0x50;          // setup serial port control, serial mode 1
	TMOD = 0x21;
	TH1 = 0xfd;           // 9600 BAUD @ 22.1184MHz
	TCON = 0x50;        // TR0 = TR1 = 1, start timer  //low interrupt
	 //TCON = 0x51;          // TR0 = TR1 = 1, start timer   // undershoot  interrupt 
	// TR1 = 1;
//	EA = 1;
}

/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
指针及参数初始化

作者:赵春生
完成日期: 2006/06/20    
----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////////////
void init_process(void)
{
	IsBufFull		= 0; 
	Receive_in	= 1;  // 接收缓冲区指针指向首位
	Receive_out	= 1;
	cursorEnable	= FALSE;
	//IE	= 0x90;      //允许串行中断
	IE	= 0x90;  
	// TCON = 0x51;       // undershoot  interrupt 
	 TCON = 0x50;     //low interrupt
 //  	EA = 1;
}

/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------

读FLASH

作者:赵春生
完成日期: 2006/06/20    
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
BYTE ReadFlashOneByte( BYTE SectorStart,WORD AbsDra)
{  
	BYTE xdata *Temp;
	WORD i;
	WORD iSector;
	BYTE iBlockNum;
	BYTE FlashData; 
	CS_FLASH088_OPEN();
	i = AbsDra ;
	iSector=SectorStart+i/4096;
	iBlockNum=iSector>>4;
	iSector=iSector%16;
	SELECT_PAGE(iBlockNum);//写待读数据页号即A19-A16                           

	Temp=(BYTE xdata*)0x0;
	Temp=(BYTE xdata *) ((iSector<<12)|(int)Temp);
	FlashData = *(Temp+(i%4096));           
	CS_DISPLAY_OPEN();
	return FlashData;
}

/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
接收缓冲管理
作者:赵春生
完成日期: 2006/06/20    
----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////////////
BYTE GetBufData()
{
	BYTE uiData;  
	if(dataSrc==FROM_FLASH)
	{
		uiData = ReadFlashOneByte(sectorIndex,FlashPtr);
		FlashPtr++;
		return  uiData;
		BUSY=1;
	}
	else if(dataSrc==FROM_SERIAL_PORT || dataSrc==FROM_PARALLEL_PORT)
	{
		while (IsBufEmpty);	
		AUXR=0;
		uiData = CommandBuf[Receive_out]; 
		AUXR=0x02;
		S_DTR = 0;
		Receive_out ++;
		if (Receive_out ^ Receive_in) 
			IsBufEmpty = 0;  //接收缓冲区不空
		else 
		{
			IsBufEmpty = 1;
			//SendToPC(0xbb);
		}
		
		if (IsBufFull) 
		{
			IsBufFull = 0;
		   //   BUSY=0;
              }	
              BUSY=0;
		return uiData;	
	}	      
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
串口中断程序
作者:赵春生
完成日期: 2006/06/20    
----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////////////
void SerialPort(void) interrupt 4 using 1
{	
//	EA = 0;
	ES = 0;
	TI = 0;
	if(RI&&~IsBufFull)
	{   
		LED3 = ~LED3;
		AUXR = 0 ;
		CommandBuf[Receive_in] = SBUF;
		AUXR = 0x02;
		IsBufEmpty = 0;
		RI = 0;
		Receive_in ++;
		if( Receive_in == Receive_out )
		{
			IsBufFull = 1;
			S_DTR = 1;
			//SendToPC(0xaa);
		}
	}
    	//EA = 1;
	 ES = 1;
}

/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
并口中断程序
作者:R&D8712
---------------------------------------------------------------------------*/
/////////////////////////////////////////////////////////////////////////////


void ParallelPort(void) interrupt 0 //using 1
{   
    
	EX0=0;
	BUSY=TRUE;
	MCU_ALL_CS=0;
	P0=0x06;
	MCU_CSS_WR=0;
	MCU_CSS_WR=1; 
	MCU_ALL_CS=1;
	//BUSY=1;
	/*
     if(temp_pre)
	 {
	   Delay(2);
	   BUSY =0;
       temp_pre = 0;
	   }
	else while(P_STB==0);
     */
       while(P_STB==0);    //low interrupt  enable
	AUXR = 0 ;
	CommandBuf[Receive_in] =P0;
	AUXR = 0x02;
	Receive_in ++;
	IsBufEmpty =0;
	if( Receive_in == Receive_out )
	{
		IsBufFull = 1;
		BUSY=1;
	}
	else 
	{
		IsBufFull = 0;
		//BUSY=0;
	}
	MCU_ALL_CS=0;
	P0=csflag;
	MCU_CSS_WR=0;
	MCU_CSS_WR=1;
	MCU_ALL_CS=1;

	LED3 = ~LED3;
	//if(IsBufFull==0)
		//BUSY=0;
	EX0=1;
}

/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
发送命令结束字
作者:赵春生
完成日期: 2006/06/20    
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////
void SendToPC(BYTE State)
{
	S_DTR = 1;
	if (!TI) 
		SBUF = State ;
	while (TI);
	TI = 0;
	if (!IsBufFull) 
		S_DTR = 0;
}

/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------

命令解释执行程序
作者:赵春生
 完成日期: 2006/06/20    
----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////////////
//void LoadCommand(void)
//{	
//}


/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
调用FLASH图象

作者:赵春生
 完成日期: 2006/06/20    
----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////////////
/*void LoadP(BYTE n)
{
	FlashPtr = 0;
	dataSrc = 1;
	PictureNumber = n;
	while (dataSrc)
		LoadCommand();
	//LoadPrePicture =0;
}*/

/////////////////////////////////////////////////////////////////////////////////

//使屏翻转和正常显示
//作者:D-PEAK R&D:8712
/////////////////////////////////////////////////////////////////////////////////
void PANEL_NORMAL( )
{
	DISPLAY_RL=0;
	DISPLAY_UD=1;
}

void PANEL_OVERTURN( )
{
	DISPLAY_RL=1;
	DISPLAY_UD=0;
}

void backupData()
{
	AUXR=0;
	dataSrcBkup			=dataSrc;
	curColBkup			=curCol;
	curRowBkup			=curRow;
	COLOR_FRONT_BKUP	=COLOR_FRONT;
	COLOR_BG_BKUP		=COLOR_BG;
	overlayModeBkup		=overlayMode;
	ZOOMXBKUP			=ZOOMX;
	ZOOMYBKUP			=ZOOMY;
	AUXR=2;
}	

void retrieveData()
{
	AUXR=0;
	dataSrc			=dataSrcBkup;
	curCol			=curColBkup;
	curRow			=curRowBkup;
	COLOR_FRONT	=COLOR_FRONT_BKUP;
	COLOR_BG		=COLOR_BG_BKUP;		
	overlayMode		=overlayModeBkup;		
	ZOOMX			=ZOOMXBKUP;			
	ZOOMY			=ZOOMYBKUP;
	curColUsing		=curCol;		// it need to be retrieved too!!!
	curRowUsing		=curRow;
	AUXR=2;
}

void INIT_backupData()
{
	AUXR=0;
	//INIT_dataSrcBkup			=dataSrc;
	INIT_curColBkup			=curCol;
	INIT_curRowBkup			=curRow;
	INIT_COLOR_FRONT_BKUP	=COLOR_FRONT;
	INIT_COLOR_BG_BKUP		=COLOR_BG;
	INIT_overlayModeBkup		=overlayMode;
	INIT_ZOOMXBKUP			=ZOOMX;
	INIT_ZOOMYBKUP			=ZOOMY;
	AUXR=2;
}	

void INIT_retrieveData()
{
	AUXR=0;
	//dataSrc			=INIT_dataSrcBkup;
	curCol			=INIT_curColBkup;
	curRow			=INIT_curRowBkup;
	COLOR_FRONT	=INIT_COLOR_FRONT_BKUP;
	COLOR_BG		=INIT_COLOR_BG_BKUP;		
	overlayMode		=INIT_overlayModeBkup;		
	ZOOMX			=INIT_ZOOMXBKUP;			
	ZOOMY			=INIT_ZOOMYBKUP;
	curColUsing		=curCol;		// it need to be retrieved too!!!
	curRowUsing		=curRow;
	AUXR=2;
}
void initParam()
{
	dataSrc			=FROM_SERIAL_PORT;	//prepare for process after loading the pic in flash
	curCol			=0;
	curRow			=0;
	COLOR_FRONT	=RED;
	COLOR_BG		=WHITE;
	overlayMode		=TRANSPARENT;
	ZOOMX			=1;
	ZOOMY			=1;

	AUXR=0;
	dataSrcBkup			=FROM_SERIAL_PORT;
	curColBkup			=0;
	curRowBkup			=0;
	COLOR_FRONT_BKUP	=RED;
	COLOR_BG_BKUP		=WHITE;
	overlayModeBkup		=TRANSPARENT;
	ZOOMXBKUP			=1;
	ZOOMYBKUP			=1;

	//dataSrcBkup			=FROM_SERIAL_PORT;
	INIT_curColBkup			      =0;
	INIT_curRowBkup			=0;
	INIT_COLOR_FRONT_BKUP	=RED;
	INIT_COLOR_BG_BKUP		=WHITE;
	INIT_overlayModeBkup		=TRANSPARENT;
	INIT_ZOOMXBKUP			=1;
	INIT_ZOOMYBKUP			=1;
	
	AUXR=2;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------

主函数
作者:赵春生
 完成日期: 2006/06/20    
----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////////////
void main( )
{
	//WORD  i;
	BYTE 	firstData;
	BYTE 	L,H,colorFront,colorBg; //前景色,背景色
	WORD	X1,X2,Y1,Y2; 
	BYTE 	R1,pic_x,pic_y; 
	BYTE 	page;//字库高位低位地址,页
	//BYTE  	temp1, temp2 ;	
	WORD 	iSector;
	ULONG 	ulLength; 	
	ULONG xdata Location;
	BYTE xdata *	Addr;
    bit temp_bit;
	ES = 0;
	EX0=0;
	P_STB = 1;
	BUSY=TRUE;
	IsBufEmpty = TRUE;

	if(!P43) 
		PANEL_OVERTURN(); //拨码开关, 3位, on  图象翻转180度
	else 
		PANEL_NORMAL();

	if (!P42) 
		init_clock_9600(); // 拨码开关, 2位,on  波特率9600,否则19200
	else 
		init_clock_19200();

	initParam();
		
	init_process();
    
	

	if(!P40)  //调用1号扇区的预制图片
	{
		backupData();
		dataSrc = FROM_FLASH;
		FlashPtr = 0;
		sectorIndex = 0;
		
//		INIT_backupData();
             //INIT_retrieveData();
	}
	//Draw_Circle (240,80,60,WHITE);
	//Write_Ascii_zoom(20,20,80, BYTE front_c, BYTE back_c,BYTE zoom,BYTE mode);
	//Rectangle_Empty(170,10,310,150,WHITE);

	//for(i=0;i<5;i++){Write_Chinese(4+i*16,4,16,cnlib[i],RED,CYAN);}

	//for(i=0;i<6;i++){Write_Ascii(4+i*8,24,asciilib[i],RED,CYAN);}

	//for(i=0;i<5;i++){Write_Chinese_Zoomout(4+i*16*3,160,16,cnlib[i],GREEN,BLUE,3);}

	//WDT_CONTR = 0X34;  // 喂狗

	//Delay(5);
	CS_ALL_OFF();
	CS_ALL_OPEN();
	//CS_SRAM_OPEN();
	CS_FLASH040_OPEN();
	//CS_FLASH088_OPEN();
	//CS_DISPLAY_OPEN();
	//CS_PCOM_OPEN();
	SELECT_PAGE(0x00);
	CS_DISPLAY_OPEN();
	LED4=0;
	LED3=0;
	LAMP_ON( );
	CS_DISPLAY_OPEN();
	// Clear(BLACK);                 
	IsBufFull	= FALSE;
	S_DTR 	= 0; 
	temp_pre =1;
	// SendToPC(0xbb);
      //  if (dataSrc != FROM_FLASH)
   
	ES = 1;
	EX0=1;
	BUSY	=FALSE;
	
	while(1)
	{
		// WDT_CONTR = 0X34;  // 喂狗
		//BUSY	=FALSE;

		firstData=GetBufData();
		if (firstData==0x1B)
		{
			
			switch(GetBufData())
			{               						              
			case  DrawLine:     // 画线,color线颜色,x1H 起点横坐标高位,x1L起点横坐标低位
				inputMode=COMMON_MODE;
				colorFront= MYCOLOR(GetBufData()) ;
				L	= GetBufData();                      
				H	= GetBufData(); 
				X1 	= MAKEWORD(L, H);/////////////
				L	= GetBufData();
				H	= GetBufData();  
				Y1 	= MAKEWORD(L, H);/////////////
				L	= GetBufData(); 
				H	= GetBufData();	
				X2 	= MAKEWORD(L, H);//////////////
				L	= GetBufData();

⌨️ 快捷键说明

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