?? sdfile.c
字號:
unsigned char xdata count=0,count_flag,connect_data[5],ch1[90],hzk[1024];
#include <c8051f020.h>
#include "SDfile.h"
#include "LCD12864.h"
//--------------------------------------------------
void SYSCLK_init();
void uart1_init(void);
/****************** Main Routine ******************/
void main()
{
bit flag1=0,flag2=0;
unsigned char xdata pf0,pf1,pf2,pf3,pf4=1,i,j,ASCII_Num=0,hz_num,aa=0,bb;
unsigned char xdata ch[16],ch2[32],ch3[32];
unsigned int xdata n,temp;
unsigned long xdata position=0;
/*unsigned char xdata c1[5]={0x30,0x30,0x30,0x39,0x33};
while(!EA);
n=atoi(c1);
*/
MCU_init();
SD_SPI_init();
SYSCLK_init();
FAT32_Init();
pf4=fopen("ABCDEFGH");
pf0=fopen("ASCII2 "); //打開ASCII字庫
pf2=fopen("HZK16 "); //打開漢字字庫
pf3=fopen("書籍地址"); //打開記錄地址
pf1=fopen("書籍1 "); //打開記錄庫
/* fseek(pf1,file[pf1].file_size-12); //移動到最后一條記錄
fread(pf1,connect_data,5);*/
//--------開啟串口--------------
uart1_init();
loop:
EA=1;
while(EA); //等待串口數據
//-----------處理計算機端事件------------------
if(count_flag==4) //連接計算機標志
{
while(1)
{
for(i=0;i<5;i++)
{
SBUF1=connect_data[i];
while((SCON1&02)==0);
SCON1&=0xFD;//TI1=0;
} //向計算機反饋信息
EA=1;
while(EA); //等待計算機發(fā)送信息
if(count_flag==2) //下載完成后的標志
break;
fwrite(pf1,ch1,90); //向‘書籍1’添加一條記錄
for(i=0;i<5;i++)
connect_data[i]=ch1[78+i];
}
EA=1;
while(EA); //等待計算機發(fā)送信息
fwriteall(pf3,ch1,5); //擦除內容從寫
while(1)
{
EA=1;
while(EA);
if(count_flag<80)//記錄少于20則記錄完成
{
fwrite(pf3,ch1,count_flag-1);
break;
}
fwrite(pf3,ch1,80); //向‘書籍1’添加一條記錄
}
}
position=find1(pf1,pf3,5,ch1,13,90);
if(position==55)//內容不存在;顯示‘不存在’
{
ch1[0]=0xb2;ch1[1]=0xbb;aa=0xaa;
ch1[2]=0xb4;ch1[3]=0xe6;
ch1[4]=0xd4;ch1[5]=0xda;
ch1[6]=0xa1;ch1[7]=0xa3;
for(i=8;i<86;i++)
ch1[i]=0x20;
}
else
{
fseek(pf1,position);
fread(pf1,ch1,90);
}
n=0;
ASCII_Num=0;
//-------------調出字庫-----------------------------------------------------
for(i=0;i<84;i++)
{
if((ch1[i]<0x80)&&(ch1[i]!=0x20)) //文件中出現空格的刪除,出現的是ASCII碼
{
position=(ch1[i]-32)*16;
fseek(pf0,position);
fread(pf0,ch,16);
for(j=0;j<16;j++)
{
hzk[n]=ch[j];
n++;
}
ASCII_Num++; //記錄連續(xù)的ASCII的個數
}
else if(ch1[i]>0x80) //文件中出現的是漢字
{
if(ASCII_Num%2!=0) //如果文字中間是奇數個ASCII碼,則補16個‘0’
{
for(j=0;j<16;j++)
{
hzk[n]=0;
n++;
}
ASCII_Num=0;
}
if(!flag1)
{
aa=ch1[i]-0xA1;bb=ch1[i+1]-0xA1;
temp=aa*0x5e;
position=temp+bb;
position=position*0x20;
//以上計算公式為position=((ch1[i]-0xA1)*0x5E+(ch1[i+1]-0xA1))*0x20;
fseek(pf2,position);
fread(pf2,ch2,32);
HZKLCD(ch2,ch3);
flag1=1;
for(j=0;j<32;j++)
{
hzk[n]=ch3[j];
n++;
}
}
else
flag1=0;
}
else; //文件中出現空格的刪除
}
if(ASCII_Num%2!=0) //如果結尾是奇數個ASCII碼,則補16個‘0’
{
for(j=0;j<16;j++)
{
hzk[n]=0;
n++;
}
}
//-----------------------------------------------------------------------
//液晶顯示----------------------------------------
flag2=0;
hz_num=0;
OSCICN = 0x84; //液晶的初始化頻率是2MHz
lcd_init();
//-----------顯示一行(8個字)----------------
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
displayhz(2*j,2*i,j+i*8);
hz_num++;
// se1=hz_num;
if(hz_num==(n/32))
{
flag2=1;
break;
}
}
if(flag2)
break;
}
OSCICN = 0x88; //回復外部晶振
goto loop;
}
//---------------------------------------------------
//Name :SYSCLK_init
//Fun :C8051F020 系統(tǒng)時鐘初始化
//In :none
//Out :none
//---------------------------------------------------
void SYSCLK_init()
{
int x;
OSCXCN = 0x67; //用24MHz晶振作系統(tǒng)時鐘
for(x=0;x<256;x++); //等待晶振穩(wěn)定
while(!(OSCXCN & 0x80));
OSCICN = 0x88; //關閉內部晶振,當時鐘失效時觸發(fā)復位
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//------------------串口初始化-------------------
void uart1_init(void)
{
SCON1=0X50;
TMOD=0X20;
TH1=0X70; //TH1=256-晶振(24MHz)/9600/16=0x64;TH1=256-晶振(22.1184MHz)/9600/16=0x70;
TR1=1;
CKCON|=0X10; //適用系統(tǒng)時鐘
PCON|=0X90; //SMOD1 是UART1 的波特率加倍控制位
EIE2=0x40; //開串口1中斷
EA=1;
////ES1=1;
}
/****************串口0中斷**************************/
void serial_int1(void) interrupt 20
{
unsigned char a;
a=SCON1;
if(a&1==1) //即RI1=1;這是接收中斷
{
SCON1=a&0xFE; //RI1=0
ch1[count]=SBUF1; //-0x40
if(ch1[count]==0x0A) //結束時的換行標志
{
EA=0; //關串口1中斷
count_flag=count;
count=0;
}
else
count++;
}
else
{
SCON1=a&0xFD; //TI1=0
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -