📄 sdfile.#2
字号:
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); //等待计算机发送信息
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); //等待计算机发送信息
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++; //记录连续的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 系统时钟初始化
//In :none
//Out :none
//---------------------------------------------------
void SYSCLK_init()
{
int x;
OSCXCN = 0x67; //用24MHz晶振作系统时钟
for(x=0;x<256;x++); //等待晶振稳定
while(!(OSCXCN & 0x80));
OSCICN = 0x88; //关闭内部晶振,当时钟失效时触发复位
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//------------------串口初始化-------------------
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; //适用系统时钟
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 + -