⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdfile.#2

📁 在单片机keil编辑其中如何创建自己的函数库。方便以后自己调用
💻 #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 + -