?? flash_write.c
字號:
//-----------------------------------------------------------------------------
// Copyright (C) 2004 Silicon Laboratories, Inc.
//
// AUTH: JS
// DATE: 03 JUL 02
//
// This program flashes the green LED on the C8051F31x target board about
// five times a second using the interrupt handler for Timer2.
//
// Target: C8051F31x
//
// Tool chain: KEIL Eval 'c'
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
//OSC=24.5MHz
/*
; C8051F310
; KEY5 P0.1 1|---=---|32 P0.2 XTAL1
; KEY6 P0.0 2| |31 P0.3 XTAL2
; GND 3| |30 P0.4 KEY1
; VDD 4| |29 P0.5 KEY2
; /RST/C2ACK 5| |28 P0.6 CNVSTR KEY3
; KEY7 P3.0(C2D) 6| |27 P0.7 KEY4
; CS2 P3.1 7| |26 P1.0 D0
; CS1 P3.2 8| |25 P1.1 D1
; RD P3.3 9| |24 P1.2 D2
; WR P3.4 10| |23 P1.3 D3
; RS P2.7 11| |22 P1.4 D4
; MR_B P2.6 12| |21 P1.5 D5
; MWE P2.5 13| |20 P1.6 D6
; MRE P2.4 14| |19 P1.7 D7
; MALE P2.3 15| |18 P2.0 LP
; MCLE P2.2 16|-------|17 P2.1 MCE
;
*/
//=============================
#include <c8051f310.h>
//=============================
#define uchar unsigned char
#define uint unsigned int
//=============================
uchar xdata buffer[513]; //開辟頁緩存數組
uchar *pointer; //建立數組指針
uchar raddrl; uchar raddrh; //頁尋址的高、低位
uchar mydata; //數據
//=============================
sbit KEY4 =P0^7;
sbit RD =P3^3;
sbit RS =P2^7;
sbit WR =P3^4;
sbit MR_B =P2^6;
sbit MWE =P2^5;
sbit MRE =P2^4;
sbit MALE =P2^3;
sbit MCLE =P2^2;
sbit MCE =P2^1;
//================
sbit LED =P0^1;
//=================
uchar autorun;
//=========delay without key==========================================
void DelayX1ms(uchar count)
{
uchar i,j,k;
for(i=0;i<count;i++)
for(j=0;j<40;j++)
for(k=0;k<120;k++)
{
;
}
}
//=====================================================================
void DelayX10ms(uint count)
{
uint i,j,k;
for(i=0;i<count;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++)
{
;
}
}
//====================================================================
void Delay50us(uchar count)
{
uchar i,j;
for(j=0;j<count;j++)
for(i=0;i<6;i++)
{
;
}
}
//=======================================================================
void key_wait(uint count)
{
uint i,j,k;
if(autorun==0)
{
for(i=0;i<count;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++)
{
if(KEY4!=1)
{
autorun=1;
goto next;
}
;
}
}
else
{
while(1)
{
if(KEY4!=1)
{
for(i=0;i<100;i++)
for(j=0;j<100;j++)
{
;
}
goto next;
}
}
}
next:
;
}
//=============K9F5608U0A===============
//=============RESET====================
void reset(void)
{
MCE=0;
MR_B=1;
MRE=1;
MWE=1;
MCLE=0;
MALE=0;
P1=0xff;
MCLE=1;
MALE=0;
MWE=0;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
MWE=1;
MCLE=0;
MALE=0;
while(MR_B==0)
{
;
}
}
//============命令輸出函數=================
void writecomd(unsigned char comd)
{
P1=comd;
MCLE=1;
MALE=0;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
MCLE=0;
MALE=0;
}
//============地址輸出函數====================
void writeaddr(uchar raddrl,uchar raddrh)
{
P1=0x00;
MCLE=0;
MALE=1;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
P1=raddrl;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
P1=raddrh;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
MCLE=0;
MALE=0;
}
//=============數據輸出函數=============
void writedata(void)
{
P1= *pointer;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
pointer++;
}
//=============讀操作==================
uchar readsta(void)
{
unsigned char soop;
P1MDOUT=0x00;
P1=0xff;
DelayX1ms(20);
MRE=0;
MRE=0;
soop=P1;
MRE=1;
P1MDOUT=0xff;
return(soop);
}
//==============整塊擦除1塊=32pages 共2048塊====
uchar blockerase(uint block)
{
unsigned char result;
writecomd(0x60);
block=block*32;
P1=block&0x00ff;
MCLE=0;
MALE=1;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
P1=(block&0xff00)>>8;
MWE=0;
MWE=0;
MWE=1;
MWE=1;
MCLE=0;
MALE=0;
writecomd(0xd0);
while(MR_B==0)
{
;
}
writecomd(0x70);
result=readsta();
if((result&0x01)== 1)
{
return(1);
}//出錯處理
else
return(0);
}
//==============整頁寫入的詳細代碼======
uchar pagewrite(uchar raddrl,uchar raddrh)
{
int i;
unsigned char result;
pointer = &buffer;
writecomd(0x00);//必須指出開始地址
writecomd(0x80);
writeaddr(raddrl,raddrh);
for(i=0;i<512;i++)
{
writedata();
}
writecomd(0x10);
while(MR_B==0)
{
;
}
writecomd(0x70);
result=readsta();
if((result&0x01) == 1)
{
return(1);
}//出錯處理
else
return(0);
}
//===============
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use the internal 24.5MHz / 8
// oscillator as its clock source. Also enables missing clock detector reset.
//
void SYSCLK_Init (void)
{
OSCICN = 0x83; // IOSCEN IFRDY 0 0 0 0 IFCN1 IFCN0 (sfr OSCICN=0xB2;內部振蕩器控制寄存器)
// IOSCEN=1 內部振蕩器使能;IFRDY=0/1 內部振蕩器未運行在編程頻率/內部振蕩器按編程頻率運行.
// IFCN1 IFCN0=00~11 8分頻 4 2 1分頻.
RSTSRC = 0x04; // 0 FERROR C0RSEF SWRSF WDTRSF MCDRSF PORSF PINRSF (sfr RSTSRC=0xEF;復位源寄存器)
// MCDRSF=0/1 禁止時鐘丟失檢測器/使能時鐘丟失檢測器;檢測到時鐘丟失條件時觸發復位.
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
// P3.3 - LED (push-pull)
//
void PORT_Init (void)
{
PCA0MD &= ~0xc0; // CIDL WDTE WDCLK 0 CPS2 CPS1 CPS0 ECF (sfr PCA0MD=0xD9;PCA0 MODE)
// CIDL=0/1 當系統控制器處于空閑方式時,PCA 繼續正常工作/當系統控制器處于空閑方式時,PCA 停止工作.
// WDTE=0/1 看門狗定時器被禁止/PCA 模塊4 被用作看門狗定時器.
// WDCLK=0/1 對看門狗定時器使能位解鎖/鎖定看門狗定時器使能位(當WDCLK 被置‘1’時,在發生下一次系統復位之前將不能禁止WDT).
// CPS2-CPS0=000 系統時鐘的12分頻 001 系統時鐘的4 分頻 010 定時器0 溢出 011 ECI 負跳變(最大速率= 系統時鐘頻率/4)100 系統時鐘 101 外部時鐘的8 分頻.
// ECF=0/1 禁止CF中斷/當CF(PCA0CN.7)被置位時,允許PCA 計數器/定時器溢出的中斷請求.
// disable watchdog timer
// WDTE = 0 (clear watchdog timer enable)
//========================================================
XBR0 = 0x00; // CP1AE CP1E CP0AE CP0E SYSCKE SMB0E SPI0E URT0E (sfr XBR0=0xE1;端口I/O 交叉開關寄存器0)
// no digital peripherals selected
XBR1 = 0x40; // WEAKPUD XBARE T1E T0E ECIE PCA0ME(3位) (sfr XBR1=0xE2;端口I/O 交叉開關寄存器1)
// WEAKPUD=0 弱上拉使能;XBARE=1 交叉開關使能;T1E=0 T1不連到端口引腳;T0E=0 T0不連到端口引腳.
// ECIE(PCA0 外部計數輸入使能位)=0 ECI不連到端口引腳;PCA0ME=000 所有的PCA I/O 都不連到端口引腳.
// Enable crossbar and weak pull-ups
P3MDOUT |= 0x1e; // 000 P3MDOUT[4:0](P3.4–P3.0 輸出方式配置位) (sfr P3MDOUT=0xA7;端口3輸出方式寄存器)
// P3MDOUT[4:0]=0/1 對應的P3.n 輸出為漏極開路/對應的P3.n 輸出為推挽方式.
// enable LED as a push-pull output
P2MDOUT |= 0xff;
P1MDOUT |= 0xff;
P0MDOUT |= 0x02;
P1=0xff;
}
//-----------------------------------------------------------------------------
/*初始化*/
//========================================
uchar xdata ddata[]={
0x42,
};
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
uint i,j;
uchar state;
autorun=0;
KEY4=1;
SYSCLK_Init (); // Initialize system clock to 24.5MHz
PORT_Init (); // Initialize crossbar and GPIO
//===========================
LED=0;
reset();
//========Erase==============
/*for(i=0;i<2048;i++)
{
state=blockerase(i);
}*/
//========Page write=========
for(j=0;j<32;j++)
{
for(i=0;i<512;i++)
{
buffer[i]=0x00;
}
state=pagewrite(j,0);
}
//===========================
LED=1;
while(1)
{
;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -