📄 main.c
字号:
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 = visionox[((int)page<<7)+m];
}
}
}
//================================================================
//图形显示函数
void oled_display(unsigned int Picture_index)
{
uchar j,i;
uchar page_change=0;
CS_oled=1;
EA=0;
Nf_ReadPage(start_page_point+(Picture_index<<1),0,512);
// SerialTrans(512);
CS_oled=0;
EA=1;
for(page=0;page<8;page++)
{
page_change=page&0x03;
DC_oled=0;
read_status();
point=176+page; //set page address
read_status();
point=0x00; //set low address
read_status();
point=0x10; //set higher address
read_status();
for(i=0;i<128;i++)
{
OLED_DataBuff[i]=DataBuff[128*page_change+i];
}
for(j=0;j<128;j++)
{
ucImageTemp = OLED_DataBuff[j];
read_status();
DC_oled = 1;
point=ucImageTemp;
}
if(page==3)
{
CS_oled=1;
EA=0;
Nf_ReadPage(start_page_point+1+(Picture_index<<1),0,512);
//SerialTrans(512);
CS_oled=0;
EA=1;
}
}
}
//***********************oled延时
void oled_display_delay(unsigned int d_t)
{
unsigned int i;
if(!ms_delay_flag)
{
while(d_t--)
{
for(i=0;i<28500;i++) //i=28500,刚好0.5秒
{
if(!Usb_flag)
{
;
}
else
return ;
}
}
}
else
{
while(d_t--)
{
for(i=0;i<100;i++) //ms
{
if(!Usb_flag)
{
;
}
else
return ;
}
}
}
}
//================================================================
//初始化函数
void init_programe()
{
unsigned char i=0;
CS_oled=0;
RES_oled=0;
i++;
i++;
i++;
i=0;
RES_oled=1;
DC_oled=0;
read_status();
point=0xaf; //10101111: set display on
read_status();
point=0xa4; //10100100: set Entire Display on/off: normal display(POR)
read_status();
point=0xa6; //10100110: set nomal display(POR)
read_status();
point=0x81; /*10000001: set contrast control register */
read_status();
point=0x80; //10000000: contrast set(select from 1 to 256)
read_status();
point=0xa0; //10100000: set segment remap:column address 0 is mapped to SEG0(POR)
read_status();
point=0xc8; //11000000: set com output scan direction:Scan from COM0 to COM(N-1)
read_status();
point=0xd8; /* 11011000: set area color mode on/off */
read_status();
point=0x00; // 00110000: mono mode
read_status();
point=0xda; /* 11011010: set COM pins hardware configuration */
read_status();
point=0x12; // 00010010: alternative COM pin configuration(COM62,60,58,...2,0,SEG0~96,COM1,3,5...61,63)
// read_status();
// point=0xad;
// read_status();
// point=0x8a;
}
//读状态函数
void read_status()
{
DC_oled=0;
state=1;
temp=1;
do
{
state=point;
temp=state & 0x80;
}while(temp != 0);
}
//****************************************************************************************************
//***********************NAND FLASH部分
//nf init
void Nf_Init(void)
{
P1_5=1;
STG_ALE=0;
STG_CLE=0;
NF_CE=0;
NF_WP=1;
NF_SE=1;
Nf_wait_busy();
}
//read nf ID
void ReadNfID(void)
{
EA=0;
Nf_send_command(READ_ID_CMD);
Nf_send_address(0x00);
// delay(2);
chip_i=Nf_rd_byte();
chip_d=Nf_rd_byte();
EA=1;
}
/*
//write three address to nand flash
void WriteThreeAdd(unsigned char Add1,unsigned char Add2,unsigned char Add3) //reentrant
{
Nf_send_address(Add1);
Nf_send_address(Add2);
Nf_send_address(Add3);
}
*/
//read a status
unsigned char ReadStatus(unsigned char Command)
{
unsigned char Statu;
Nf_send_command(Command);
Statu=Nf_rd_byte();
return Statu;
}
//Nf Block Erase
unsigned char Nf_Block_Erase(unsigned int PageAdd)
{
unsigned char Add1,Add2;
unsigned char Status;
unsigned int temp;
// EA=0;
temp=PageAdd;
Add1=temp;
Add2=temp>>8;
EA=0;
Nf_send_command(BLOCK_ERASE_CMD);
Nf_send_address(Add1);
Nf_send_address(Add2);
Nf_send_command(BLOCK_ERASE_CONFIRM_CMD);
Nf_wait_busy();
Status=ReadStatus(READ_STATUS_CMD);
EA=1;
return Status;
}
//read spcified byte in one page from nand flash
unsigned char Nf_ReadByte(unsigned long PageAdd, unsigned int ByteAdd)
{
unsigned char Add1,Add2,Add3;
unsigned char AddCommand;
unsigned char SData;
temp_long=PageAdd;
Add2=temp_char[3];
Add3=temp_char[2]; //看一看这里对吗
if(ByteAdd<256)
{
Add1=ByteAdd;
AddCommand=READ_A_AREA_CMD;
}
else
{
if(ByteAdd<512)
{
Add1=ByteAdd-256;
AddCommand=READ_B_AREA_CMD;
}
else
{
Add1=ByteAdd-512;
AddCommand=READ_C_AREA_CMD;
}
}
EA=0;
Nf_send_command(AddCommand);
Nf_send_address(Add1);
Nf_send_address(Add2);
Nf_send_address(Add3);
Nf_wait_busy();
SData=Nf_rd_byte();//consider sending the datas
EA=1;
return SData;
}
//Read One Whole Page from nf
unsigned int Nf_ReadPage(unsigned long PageAdd, unsigned int StartAdd,unsigned int DataNum)
{
unsigned char Add1,Add2,Add3;
unsigned char AddCommand;
unsigned int i;
temp_long=PageAdd;
Add2=temp_char[3];
Add3=temp_char[2];
if(StartAdd<256)
{
Add1=StartAdd;
AddCommand=READ_A_AREA_CMD;
}
else
{
if(StartAdd<512)
{
Add1=StartAdd-256;
AddCommand=READ_B_AREA_CMD;
}
else
{
Add1=StartAdd-512;
AddCommand=READ_C_AREA_CMD;
}
}
// EA=0;
Nf_send_command(AddCommand);
Nf_send_address(Add1);
Nf_send_address(Add2);
Nf_send_address(Add3);
Nf_wait_busy();
for(i=0;i<DataNum;i++)
{
DataBuff[i]=Nf_rd_byte();
}
// EA=1;
// SerialTrans(512);
return (DataNum-1);
}
//Nf Write one page
unsigned char Nf_Write_Page(unsigned long PageAdd,unsigned int DataNum)
{
unsigned char Add1,Add2;
unsigned char Status;
unsigned int i;
temp_long=PageAdd;
Add1=temp_char[3];
Add2=temp_char[2];
F_led=!F_led;
// EA=0;
Nf_send_command(READ_A_AREA_CMD);
Nf_send_command(SEQUENTIAL_DATA_INPUT_CMD);
Nf_send_address(0x00);
Nf_send_address(Add1);
Nf_send_address(Add2);
for(i=0;i<DataNum;i++)
// Nf_wr_byte(i+5);
{ Nf_wr_byte(DataBuff[i]);}
Nf_send_command(PAGE_PROGRAM_CMD);
Nf_wait_busy();
Nf_send_command(READ_STATUS_CMD);
Status=Nf_rd_byte();
// EA=1;
// SerialTran(0xBB);
// delay(2);
return Status;
}
//Nf write a byte
unsigned char Nf_Write_Byte(unsigned long PageAdd,unsigned int ByteAdd,unsigned char Data)
{
unsigned char Add1,Add2,Add3;
unsigned char SData;
unsigned char AddCommand;
unsigned int temp;
temp=PageAdd;
Add2=temp;
Add3=temp>>8;
if(ByteAdd<256)
{
Add1=ByteAdd;
AddCommand=READ_A_AREA_CMD;
}
else
{
Add1=ByteAdd-256;
AddCommand=READ_B_AREA_CMD;
}
if(ByteAdd>=512)
{
Add1=ByteAdd-512;
AddCommand=READ_C_AREA_CMD;
}
EA=0;
Nf_send_command(AddCommand);
Nf_send_command(SEQUENTIAL_DATA_INPUT_CMD);
Nf_send_address(Add1);
Nf_send_address(Add2);
Nf_send_address(Add3);
Nf_wr_byte(Data);
Nf_send_command(PAGE_PROGRAM_CMD);
Nf_wait_busy();
Nf_send_command(READ_STATUS_CMD);
SData=Nf_rd_byte();
EA=1;
return SData;
}
//Read_valid_Block_Information
unsigned int Read_valid_Block_Info(unsigned int BlockAdd)
{
unsigned int i;
unsigned char BLOCK_GOOD=0;
i=0;
EA=0;
while(i<512&&BlockAdd<Nf_Block_Size)
{
BLOCK_GOOD=Nf_ReadByte(BlockAdd<<5,517);
if(BLOCK_GOOD==0xff)
{
BLOCK_GOOD=Nf_ReadByte((BlockAdd<<5)+1,517); //?<<4
if(BLOCK_GOOD==0xff)
{
temp_int=BlockAdd;
DataBuff[i]=temp_char[4];
i++;
DataBuff[i]=temp_char[5];
i++;
}
}
BlockAdd++;
}
EA=1;
return BlockAdd;
}
//Create_valid_Block_Table and save to 1st block
void Create_Invalid_Block_Table()
{
unsigned int BlockAdd;
unsigned int TablePage;
unsigned int i=0;
BlockAdd=0x00;
TablePage=0x00;
EA=0;
while(BlockAdd<Nf_Block_Size)
{
BlockAdd=Read_valid_Block_Info(BlockAdd);
Nf_Write_Page(TablePage,512);
TablePage++;
}
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -