📄 main.c
字号:
/***********************************
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 + -