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

📄 main.c

📁 一种通过USB将显示数据送入NAND FLASH中
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************
2005.3.9整合屏、NAND、USB、串口
编写人:周望
参考来源:串口下载NAND显示+D12-11。0592

编写记录:

调试记录:

修改记录:


**********************************************.*/

#include <reg53.h>             /* define 8051 registers */
#include <stdio.h>             /* define I/O functions */
#include <absacc.h>
#include <string.h>

#include "visionox.h"

#include "macro.h"
#include "usb100.h"
#define var_globals
#include "varmain.h"

#include "d12.c"
#include "usb.c"
#include "initial.c"


#define uchar unsigned char
#define unit  unsigned int
#define At(x)                     _at_ x

//**********************DELAY
void delay(unsigned int Len);
void delayms(unsigned int Len);
//**************************************************************************************

//**********************串口部分
void UartInit(void);
void SerialTran(unsigned int Len);
void SerialTrans(unsigned int Len);
//**************************************************************************************

//**********************USB部分
xdata unsigned char wr_test[16] _at_ 0x2B0;
xdata unsigned char rd_test[16] _at_ 0x2C0;
unsigned char test_flag=0;
bit re_send_flag=0;
bit Usb_flag=0;
bit Usbpoint1command=0;
bit Usbpoint2command=0;
bit	transmit_begin=0;
bit transmit_over=0;

//bit save_to_nand=0;
unsigned int Nand_save_page_add=32;
unsigned int transmit_num=0;
unsigned int Nand_save_block_add=0;
unsigned int Display_pic=0;
unsigned int erase_page_add=32;
void Usbver_init(void);

//**************************************************************************************

//************************屏显示部分
#define colortable     	0x91        //set look up table for area color
#define bank116color   	0x92      //set color of bank1 to bank16(page 0)
#define bank1732color 	0x93     //set color of bank17 to bank 32(page1)
#define areacolor 		0xd8         //set area color mode on/off
#define compincon 		0xda         //set com pins hardware configuration
#define DCLK      		0Xd5         //set display colck divede ratio/oscillator frequency

//sbit CS_oled=P1^0;                  //#CS#片选信号,低电平有效
//sbit RES_oled=P1^1;                 //#RES#芯片复位信号,低电平有效
sbit DC_oled=P1^2;                  //D/C#,数据命令选择信号,D/C#=0:COMMAND,D/C#=1:DATA

sbit F_led=P3^4;

unsigned char state;
unsigned char temp;
unsigned char page;
unsigned char frame;
unsigned char bmp_temp;
unsigned char s_line;                 //s_line: start line
unsigned char ucFrame1;
static char xdata   point  _at_ 0x9400;
xdata unsigned char ucImageTemp     _at_ 0x2A0;       
xdata unsigned char OLED_DataBuff[128] _at_ 0x220;           

void read_status();
void init_programe();
void oled_display(unsigned int Picture_index);
void oled_display_delay(unsigned int d_t);
void clear_screen();
void all_screen();
void display_visionox();
void Displayver_init(void);

bit oledplay_flag=1;
//**************************************************************************************
//************************NAND存储部分
//定义FLASH大小
#define Nf_Block_Size           2048

/*
//Chip Operation Address
#define NF_ADD_LATCH_ENABLE_ADD		0x2900    	//CE=0,WP=1,CLE=0,ALE=1
#define NF_CMD_LATCH_ENABLE_ADD		0x2a00    	//CE=0,WP=1,CLE=1,ALE=0
#define NF_DATA_ADD					0x2800    	//CE=0,WP=1,CLE=0,ALE=0
*/

//Chip Operation Address for d12-g-oled a v1.2
#define NF_ADD_LATCH_ENABLE_ADD		0x9000    	
#define NF_CMD_LATCH_ENABLE_ADD		0x5400    	
#define NF_DATA_ADD					0x5000    	
/*
#define NF_BUSY		P1_5						//NF BUSY LINE	
#define NF_SE		P1_5
#define	STG_ALE		P2_0
#define	STG_CLE		P2_1
#define	NF_CE		P2_2
//#define	CE	    	P2_2
#define	NF_WP		P2_3
*/
// Read Command
#define READ_A_AREA_CMD           0x00
#define READ_B_AREA_CMD           0x01
#define READ_C_AREA_CMD           0x50
// Read ID Command
#define READ_ID_CMD               0x90
#define RESET_CMD                 0xff
// Program command
#define SEQUENTIAL_DATA_INPUT_CMD 0x80
#define PAGE_PROGRAM_CMD          0x10
//Erase command
#define BLOCK_ERASE_CMD           0x60
#define BLOCK_ERASE_CONFIRM_CMD   0xD0
//Read Status command
#define READ_STATUS_CMD           0x70
//unlock block command
#define Unlock_Block_CMDL         0x23
#define Unlock_Block_CMDH         0x24
//read status of lockBLOCK
#define Read_LockBlock_Status_CMD 0x70

unsigned char xdata  nf_send_cmd At(NF_CMD_LATCH_ENABLE_ADD); // Command 
unsigned char xdata nf_send_add At(NF_ADD_LATCH_ENABLE_ADD); // Address 
unsigned char volatile xdata nf_data At(NF_DATA_ADD);		// Data    

#define Nf_rd_byte()                	(nf_data)
#define Nf_wr_byte(b)               	(nf_data = b)
#define Nf_send_command(command)	(nf_send_cmd = command)
#define Nf_send_address(address)	(nf_send_add = address)
#define Nf_wait_busy()  			{while ( !NF_BUSY);}

bit downflag=0;
bit playscreen_flag=1;
bit picdownover_flag=0;
bit half_over=0;
bit all_over=0;
bit RI_flag=0;
//bit Nandopr_flag=0;

unsigned int  UART_Add=0;
unsigned int  start_page_point=0;
unsigned int  writepage_point=33;
unsigned int  Picture_num=0;

//定义缓存空间
xdata unsigned char  DataBuff[528] _at_ 0x00;
unsigned long xdata  temp_long     _at_ 0x210;
unsigned int xdata   temp_int      _at_ 0x214;
unsigned char xdata  temp_char[6]  _at_ 0x210;

idata unsigned char temp_test[10] ;
idata unsigned char chip_i=0;
idata unsigned char chip_d=0;

//NAND FLASH初始化、功能函数

void Nandver_init(void);

void Nf_Init(void);
void ReadNfID(void);
//void WriteThreeAdd(unsigned char Add1,unsigned char Add2,unsigned char Add3);
void Create_Invalid_Block_Table();
void Unlock_Block(unsigned int BlockAddH,unsigned int BlockAddL);
void Read_LockBlock_status(unsigned int PageAdd);

unsigned char ReadNfStatus(unsigned char Command);
unsigned char Nf_Block_Erase(unsigned int PageAdd);
unsigned char Nf_Write_Byte(unsigned long PageAdd,unsigned int ByteAdd,unsigned char Data);
unsigned char Nf_Write_Page(unsigned long PageAdd,unsigned int DataNum);
unsigned char Nf_ReadByte(unsigned long PageAdd, unsigned int ByteAdd);
unsigned int  Nf_ReadPage(unsigned long PageAdd, unsigned int StartAdd,unsigned int DataNum);
unsigned int  Read_valid_Block_Info(unsigned int BlockAdd);
//*************************************************ADD 05.9.2
bit ask_flash_cap=0;               //
bit ms_delay_flag=0;
code char B1_flash_cap[5]={0x66,0xf1,0xb1,64,0xff};
code char A1_flash_cap[5]={0x66,0xf1,0xA1,0x88,0xff};
code char A2_flash_cap[4]={0x66,0xf2,0xf2,0xff};
code char C1_flash_cap[5]={0x66,0xf1,0xc1,0x88,0xff};
code char D1_flash_cap[5]={0x66,0xf1,0xd1,0x88,0xff};
code char D2_flash_cap[5]={0x66,0xf1,0xd2,0x88,0xff};
code char D3_flash_cap[5]={0x66,0xf1,0xd3,0x88,0xff};
code char D4_flash_cap[5]={0x66,0xf1,0xd4,0x88,0xff};
code char E1_flash_cap[5]={0x66,0xf1,0xe1,0x88,0xff};
code char E2_flash_cap[5]={0x66,0xf1,0xe2,0x88,0xff};
unsigned char xdata col_x=0;
unsigned char xdata seg_y=0;
unsigned int xdata  display_delay=1;
//**********************************************************************************************

//***********************
void main(void)
{
  unsigned char temp1=0x01;
  unsigned char temp2=0;
  unsigned int  i=0;
	P0=0xff;
	P1=0xff;
	P2=0xff;
	P3=0xff;
	AUXR=0x01;
	AUXR1=0x00;

    UartInit();                                  //串口初始化

	Nf_Init();									 //NAND初始化
    Nandver_init();	
	Nf_Block_Erase(32);
//	NF_CE=1;									 //禁止NAND

	CS_oled=0;									 //OLED初始化
  	init_programe();
//	all_screen();
	display_visionox();
    Displayver_init();
//	oled_display_delay(2000);
    CS_oled=1;									 //禁止OLED
    							
    Usbver_init();								 //USB初始化
    P_HWInit();
    P_DataInit();
    reconnect_USB();		//联接USB总线

    while(1)
  {
    if(Usb_flag)
	 {
  		CS_oled=1;
		MCU_D12CS=0;

		oledplay_flag=0;
	    usbserve();			//USB服务数据处理
        if(Usbpoint1command)
		  {
            if(transmit_over)      //USB下载结束,开显示
			  {
			    Usb_flag=0;
//				Nandopr_flag=0;
                oledplay_flag=1;
				transmit_begin=0;
				MCU_D12CS=1;
                CS_oled=0;
				init_programe();
			  }
            if(ask_flash_cap)
			{
			  ask_flash_cap=0;
              D12_WriteEndpoint(3,5,B1_flash_cap);
			}
		  }
		if(Usbpoint2command)
		  {
/*		  	if(save_to_nand)
		 		{
           			save_to_nand=0;
		 		}
*/          ;
		  }

		MCU_D12CS=1;
	 }

	if(oledplay_flag)
	 {
	    MCU_D12CS=1;
//  		CS_oled=0;
		Usb_flag=0;

//        init_programe();
		if(transmit_over)
		  {
			if(i<Display_pic)
			 {
//			   temp_int=Picture_num;
//			   SerialTran(temp_char[5]);
//               delay(2);
//               SerialTran(temp_char[4]);
//               delay(2);
//               SerialTran(Picture_num);
//               delay(2);
               if(Picture_num)
			     i=Picture_num-1;
		   	   oled_display(i);
               F_led=!F_led;
		       oled_display_delay(display_delay);
               i++;
			 }
			else
			 {
			   i=0;
			 }
		  }

//		CS_oled=1;
	 }
/*    if(Nandopr_flag)
     {
  		CS_oled=1;	
		MCU_D12CS=1;
     }
*/
  }
}
void Displayver_init(void)
{
  start_page_point=Nand_save_page_add;
}
void Nandver_init(void)
{

}
void Usbver_init(void)
{

}
//****************************************************************************************************

//*******************DELAY
void delay(unsigned int Len)			//10uS延时
{ 
	unsigned char i;
    while(Len--)
	{
		for(i=0;i<150;i++)
		{
			;
		}
	}
}
/*
void delayms(unsigned int Len)
{
	unsigned char i;
    while(Len--)
	{
		for(i=0;i<2000;i++)
		{
			;
		}
	}
}
*/

//****************************************************************************************************

//*******************串口
void UartInit(void)
{
	unsigned char temp;

	SCON=0x70;
	PCON|=0x80;					//smode1=1
	PS=0;						//low interrupt level

	//if double clock test the uart!
	TMOD|=0x20;               	/* TMOD: timer 1, mode 2, 8-bit reload        */
	TH1=0xfd;					/*			19200bps				*/
	TL1=0xfd;
    TR1=1;                  	/* TR1:  timer 1 run                          */

	temp=SBUF;
//	ES=1;
//	EA=1;
}

void SerialTran(unsigned int Len)
{	
TI=1;
while (!TI);
TI=0;
//TH1=0xf3;
SBUF=Len;
}
                          //*****************没调用到的函数
void SerialTrans(unsigned int Len)
{
unsigned	int i=0;

	TI=1;
	while(1)
	{
		while (!TI);
		TI=0;
		SBUF=DataBuff[i];
		i++;
		if(i==Len)
			return;
	}
}
/*
void send_wr_test(unsigned char i)
{ unsigned char j;
  for(j=0;j<i;j++)
  {
  SerialTran(wr_test[j]);
  delay(2);
  }
}
void send_rd_test(unsigned char i)
{ unsigned char j;
  for(j=0;j<i;j++)
  {
  SerialTran(rd_test[j]);
  delay(2);
  }

}
*/
//****************************************************************************************************

//*******************Oled显示部分


//***********************************OLED显示部分
void all_screen()
{
	uchar m;
	for( page = 0; page<8 ; page++)
	{
		DC_oled = 0;
        	read_status();
        	point = 176+page;             //set page
       		read_status();
       		point = 0x00;                 //set lower column address
       		read_status();
       		point = 0x10;                 //set higher column address
      		for( m=0; m<128;m++)           //set segment 0-127as 0x00
        	{
        		read_status(); 
            		DC_oled = 1;
            		point = 0xff;
            }
        }
}

void display_visionox()
{
	uchar m;
	for( page = 0; page<8 ; page++)
	{
		DC_oled = 0;
        	read_status();
        	point = 176+page;             //set page

⌨️ 快捷键说明

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