精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32的小說閱讀器

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-06-02 09:03 ? 次閱讀

1.硬件平臺

2.實現功能

1.SD卡設備檢測,文件系統移植,用戶存儲小說和字庫文件;

2.字庫信息加載檢測,自動完成字庫信息加載與更新。本次采用GBK字庫,字體大小有16*16、24*24、32*32三個字庫;

3.觸摸屏校準,上電檢測觸摸屏校準信息;手動進入觸摸屏校準模式

4.小說文件索引,小說文本切換;

5.小說翻頁,字體大小選擇,顏色選擇,返回主目錄;

3.示例效果

?SD卡檢測和觸摸屏校準

poYBAGKWuTuAJKEyAAhpr0Axaa8252.png

?字庫檢測與更新

pYYBAGKWuVOAB3ZwAAXo7AKeGlA674.png

目錄和小說顯示界面

poYBAGKWuW6AHwsRAAiD7y7IHy8664.png

顏色切換

poYBAGKWuYOAN8MJAAfxcsfMwv4966.png

字體選擇

在這里插入圖片描述

4.軟件設計

?1.SD卡字庫更新加載

/***********************SD卡字庫更新***********************/
u8 SDcard_DownFont(const TCHAR* path,u32 addr,u16 font_size)
{
  FIL fp;
  u8 res;
  UINT br;
  u32 size;
  u32 cnt=0;
	u16 y=0;
	float load=0,load2=0;
  u8 buff[1024];
	char buff2[20];
  /*1.讀取文件大小*/
  FILINFO file_info;
  f_stat(path,&file_info);
  size=file_info.fsize;
  if(size==0)return 1;
  //printf("文件大小:%u byte\r\n",size);
  /*2.打開文件*/
  res=f_open(&fp,path,FA_READ);
  if(res)
  {
   // printf("文件打開失敗res=%d\r\n",res);
    return 2;
  }
	W25Q64_WriteData(addr-10,(u8 *)"        ",9);//清除標志位
	if(font_size==16)y=100;
	else if(font_size==24)y=140;
	else if(font_size==32)y=180;
	LCD_Display_Str2(20,y,16,(u8 *)"更新進度:",BLACK,WHITE);
	LCD_Refresh();
  while(1)
  {
    f_read(&fp,buff,1024,&br);
    W25Q64_WriteData(addr+cnt,buff,br);
    cnt+=br;
		load=(cnt*1.0/size)*100;
		if(load!=load2)
		{
			load2=load;
			LCD_Display_Str2(30+strlen("更新進度")/2*16,y,16,(u8 *)"        ",WHITE,WHITE);
			snprintf(buff2,sizeof(buff2),"%.1f %%",load2);
			LCD_Display_Str2(30+strlen("更新進度")/2*16,y,16,(u8 *)buff2,RED,WHITE);
			LCD_Refresh();
		}
    //printf("更新進度:%d\r\n",cnt);
    if(br!=1024)break;
  }
	/*寫入標志位*/
	if(font_size==16)
	{
		strcpy((char *)buff,"GBK16_OK");
	}
	else if(font_size==24)
	{
		strcpy((char *)buff,"GBK24_OK");
	}
	else if(font_size==32)
	{
		strcpy((char *)buff,"GBK32_OK");
	}
	W25Q64_WriteData(addr-10,buff,9);//GBK16_OK
  f_close(&fp);//關閉文件
	return 0;
}

2.獲取小說文件信息

/*SD卡操作函數*/
typedef struct FILE_info
{
	char file_name[100];
	u32 file_size;
	u16 y;/*在屏幕位置*/
	struct FILE_info *next;
	struct FILE_info *pre;
}FILE_INFO;
FILE_INFO *story_head=NULL;
/*創建鏈表*/
FILE_INFO *List_CreateHead(FILE_INFO *head)
{
	if(head!=NULL)return head;
	head=malloc(sizeof(FILE_INFO));
	head->next=NULL;
	head->pre=NULL;
	return head;
}
/*添加節點*/
FILE_INFO *List_AddNode(FILE_INFO *head)
{
	if(head==NULL)return NULL;//鏈表頭不存在
	FILE_INFO *phead=head;
	while(phead->next!=NULL)
	{
		phead=phead->next;
	}
	FILE_INFO *new_node=malloc(sizeof(FILE_INFO));
	new_node->pre=phead;
	phead->next=new_node;
	new_node->next=NULL;
	return new_node;
}
/*遍歷節點*/
void List_PrintNode(FILE_INFO *head)
{
	u16 x=20,y=50;
	LCD_Display_Str2(LCD_WIDTH/2-24,10,16,(u8 *)"書 架",BLACK,WHITE);
	if(head==NULL)return ;//鏈表頭不存在
	FILE_INFO *phead=head;
	while(phead->next!=NULL)
	{
		phead=phead->next;
		phead->y=y;
		LCD_Display_Str2(x,phead->y,16,(u8 *)phead->file_name,DARKBLUE,WHITE);//顯示字符串
		y+=35;
		//printf("%s,%d\r\n",phead->file_name,phead->file_size);
	}
	LCD_Refresh();
}
u16 List_CheckNode(FILE_INFO *head,u16 y,u8 *file_name)
{
	if(head==NULL)return 0;//鏈表頭不存在
	FILE_INFO *phead=head;
	while(phead->next!=NULL)
	{
		phead=phead->next;
		if(y<=phead->y+26 && y>=phead->y-5)
		{
			strcpy((char *)file_name,phead->file_name);
			return phead->y;
		}
	}
	return 0;//未找到 
}
/*************************************目錄遍歷(讀取小說文件信息)************************/
u8 FATFS_printDir(const TCHAR* path)
{
  DIR dp;
  u8 res;
	u8 stat=0;
	story_head=List_CreateHead(story_head);//創建鏈表頭
  res=f_opendir(&dp,path);
  FILINFO file_info;
  if(res)
  {
    printf("打開目錄失敗res=%d\r\n",res);
		free(story_head);//釋放鏈表頭
    return 1;
  }
	FILE_INFO *temp=NULL;
  while(1)
  {
    res=f_readdir(&dp,&file_info);
    if(res!=FR_OK || file_info.fname[0]==0)break;
		if(strstr(file_info.fname,".txt"))
		{
			temp=List_AddNode(story_head);
			if(temp==NULL)
			{
				stat=2;//動態分配空間失敗
				goto AA;
			}
			//printf("文件名:%s,",file_info.fname);
			strcpy(temp->file_name,file_info.fname);//文件名
			if(file_info.fattrib == AM_ARC)//普通文件
			{
				temp->file_size=file_info.fsize;//文件大小
				//printf("文件大小:%u byte\r\n",file_info.fsize);
			}
		}
  }
AA:
	f_closedir(&dp);//關閉目錄
	List_PrintNode(story_head);
	return stat;
}

3.讀取小說內容,翻頁,字體選擇、顏色切換

/*打開小說*/
u8 buff_read[4098];
const u16 font_corlour[]={BLACK,BLUE,RED,LIGHTGREEN};
void FATFS_ReadFile(const char *file_name)
{
	FIL fp;//文件指針
	u8 res=0;
	UINT br;
	u32 font_buff[20];//保存每頁字節數據
	u16 font_cnt=0;
	u16 font_len=0;
	u16 font_size=16;//字體大小
	u16 x=0,y=20;
	u8 corlour=0;
	char name[100];
	snprintf(name,sizeof(name),"0:/Text/%s",file_name);
	res=f_open(&fp,name,FA_READ);//打開文件
	if(res)
	{
		printf("文件打開失敗res=%d\r\n",res);
		return ;
	}
	u8 *p;
	u16 x1,y1;
	u8 stat=0;
	while(1)
	{	
		if(stat)
		{
			buff_read[0]=stat;
			stat=0;
			res=f_read(&fp,&buff_read[1],4095,&br);
			br++;
			buff_read[br]='\0';
		}
		else
		{
			res=f_read(&fp,buff_read,4096,&br);
			buff_read[br]='\0';
		}
		p=buff_read;
		while(*p)
		{
			font_len=LCD_Display_Str(x,y,font_size,p,font_corlour[corlour]);//顯示字符串
			LCD_Refresh();
			while(1)
			{
				res=XPT2046_ReadXY();//觸摸屏檢測
				if(res)
				{
					x1=xpt2046_info.x;
					y1=xpt2046_info.y;	
					while(T_PEN==0){}//等待松開
					//printf("x1=%d,y1=%d\r\n",x1,y1);
					if((x1>=212 && x1<=320) && (y1>=416 && y1<=480))//返回
					{
						LcdFill(0,0,320,480,WHITE);
						List_PrintNode(story_head);
						return ;
					}
					else if((x1>=106 && x1<=210) && (y1>=416 && y1<=480))//字體顏色
					{
						corlour++;
						if(corlour>=4)corlour=0;
						LcdFill(0,0,320,410,WHITE);
						break;
					}
					else if((x1>=1 && x1<=105) && (y1>=416 && y1<=480))//字體大小調節
					{
						if(font_size==16)font_size=24;
						else if(font_size==24)font_size=32;
						else if(font_size==32)font_size=16;
						LcdFill(0,0,320,410,WHITE);
						break;
					}
					else if(x1>160 && y1<=380)
					{
						p+=font_len&0x7fff;
						if(*p!='\0')
						{
							font_buff[font_cnt++]=font_len&0x7fff;
							LcdFill(0,0,320,410,WHITE);
							break;
						}
						else 
						{
							if(font_len&0x8000)
							{
								stat=*(p-1);
							}
							LcdFill(0,0,320,410,WHITE);
							break;
						}
					}
					else if(x1<160 && y1<=380)
					{
						if(p!=buff_read && font_cnt>0)
						{
							font_cnt--;
							p-=font_buff[font_cnt];
							LcdFill(0,0,320,410,WHITE);
							break;
						}
					}
				}
			}
		}

		font_cnt=0;
		memset(buff_read,0,sizeof(buff_read));
		if(br!=4096)break;
	}
}

4.主函數main.c,硬件初始化,觸摸屏校準,字體檢測與更新,主界面顯示

#include "stm32f10x.h"
#include "beep.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
#include "w25q64.h"
#include "at24c08.h"
#include "timer.h"
#include 
#include "xpt2046.h"
#include "nt35310.h"
#include "sram.h"
#include 
#include "ff.h"http://文件系統頭文件
#include "sdcard.h"
u8 SDcard_DownFont(const TCHAR* path,u32 addr,u16 font_size);//字庫更新
u8 FATFS_printDir(const TCHAR* path);//遍歷目錄
u16 List_CheckNode(FILE_INFO *head,u16 y,u8 *file_name);//查找文件
void FATFS_ReadFile(const char *file_name);//讀文件
FATFS fs;
int main()
{
	u16 y=0;
	char buff[30];
  u8 res=0;
  Beep_Init();
  Led_Init();
  Key_Init();
  Usartx_Init(USART1,115200,72);
  printf("串口初始化完成\r\n");
  W25Q64_Init();
  IIC_Init();
  LCD_Init();
  Sram_Init();
  XPT2046_Init();//初始化
	Touch_Calibration();
AA:
	LCD_Clear(WHITE);//清屏函數
	LCD_Refresh();
	LCD_Display_Str2(20,20,16,(u8 *)"SD卡狀態",RED,WHITE);
  res=f_mount(&fs,"0:",1);//磁盤掛載
  if(res)
	{
		printf("SD卡掛載失敗ERR=%d\r\n",res);
		snprintf(buff,sizeof(buff),"err%d",res);
		LCD_Display_Str2(20+strlen("SD卡狀態")*12+20,20,16,(u8 *)buff,RED,WHITE);
		LCD_Display_Str2(20,50,16,(u8 *)"請檢查SD卡是否插入!",RED,WHITE);
		LCD_Refresh();
		Delay_Ms(500);
		goto AA;
	}
	else LCD_Display_Str2(20+strlen("SD卡狀態")*12+20,20,16,(u8 *)"OK",RED,WHITE);
	/*字庫檢測*/
	LCD_Display_Str2(LCD_WIDTH/2-strlen("字庫檢測")/2*16,40,16,(u8 *)"字庫檢測",RED,WHITE);
	LCD_Refresh();

GBK_16:
	W25Q64_ReadData(GBK_16_ADDR-10,(u8*)buff,9);//GBK16_OK
	if(strstr(buff,"GBK16_OK"))
	{
		LCD_Display_Str2(20,60,16,(u8 *)"GBK16    OK",RED,WHITE);
		LCD_Refresh();
	}
	else 
	{
		LCD_Display_Str2(20,60,16,(u8 *)"GBK16    NO",RED,WHITE);
		LCD_Display_Str2(LCD_WIDTH/2-strlen("更新GBK16字庫")/2*16,80,16,(u8 *)"更新GBK16字庫",RED,WHITE);
		LCD_Refresh();
		if(SDcard_DownFont("0:/font/GBK_16.DZK",GBK_16_ADDR,16))//字庫更新
		{
			LCD_Display_Str2(LCD_WIDTH/2-strlen("                 ")/2*16,80,16,(u8 *)"                 ",WHITE,WHITE);
			LCD_Display_Str2(10,80,16,(u8 *)"請將GBK_16.DZK放到/font/目錄下,重啟!",BLACK,WHITE);
			LCD_Refresh();
		}
		else 
		{
			LCD_Display_Str2(LCD_WIDTH/2-strlen("                 ")/2*16,80,16,(u8 *)"                 ",WHITE,WHITE);
			LCD_Display_Str2(20,100,16,(u8 *)"                   ",WHITE,WHITE);
			LCD_Refresh();
			goto GBK_16;
		}
	}
	/*GBK24_OK*/
GBK_24:
	W25Q64_ReadData(GBK_24_ADDR-10,(u8*)buff,9);
	if(strstr(buff,"GBK24_OK"))
	{
		LCD_Display_Str2(20,100,16,(u8 *)"GBK24    OK",RED,WHITE);
		LCD_Refresh();
	}
	else 
	{
		LCD_Display_Str2(20,100,16,(u8 *)"GBK24    NO",RED,WHITE);
		LCD_Display_Str2(LCD_WIDTH/2-strlen("更新GBK24字庫")/2*16,120,16,(u8 *)"更新GBK24字庫",RED,WHITE);
		LCD_Refresh();
		if(SDcard_DownFont("0:/font/GBK_24.DZK",GBK_24_ADDR,24))//字庫更新
		{
			LCD_Display_Str2(LCD_WIDTH/2-strlen("                 ")/2*16,120,16,(u8 *)"                 ",WHITE,WHITE);
			LCD_Display_Str2(10,120,16,(u8 *)"請將GBK_24.DZK放到/font/目錄下,重啟!",BLACK,WHITE);
			LCD_Refresh();
		}
		else 
		{
			LCD_Display_Str2(LCD_WIDTH/2-strlen("                 ")/2*16,120,16,(u8 *)"                 ",WHITE,WHITE);
			LCD_Display_Str2(20,140,16,(u8 *)"                   ",WHITE,WHITE);
			LCD_Refresh();
			goto GBK_24;
		}
	}
	/*GBK32_OK*/
GBK_32:
	W25Q64_ReadData(GBK_32_ADDR-10,(u8*)buff,9);
	if(strstr(buff,"GBK32_OK"))
	{
		LCD_Display_Str2(20,140,16,(u8 *)"GBK32    OK",RED,WHITE);
		LCD_Refresh();
	}
	else 
	{
		LCD_Display_Str2(20,140,16,(u8 *)"GBK32    NO",RED,WHITE);
		LCD_Refresh();
		LCD_Display_Str2(LCD_WIDTH/2-strlen("更新GBK32字庫")/2*16,160,16,(u8 *)"更新GBK32字庫",RED,WHITE);
		LCD_Refresh();
		if(SDcard_DownFont("0:/font/GBK_32.DZK",GBK_32_ADDR,32))//字庫更新
		{
			LCD_Display_Str2(LCD_WIDTH/2-strlen("                 ")/2*16,160,16,(u8 *)"                 ",WHITE,WHITE);
			LCD_Display_Str2(10,160,16,(u8 *)"請將GBK_32.DZK放到/font/目錄下,重啟!",BLACK,WHITE);
			LCD_Refresh();
		}
		else 
		{
			LCD_Display_Str2(LCD_WIDTH/2-strlen("                 ")/2*16,160,16,(u8 *)"                 ",WHITE,WHITE);
			LCD_Display_Str2(20,180,16,(u8 *)"                   ",WHITE,WHITE);
			LCD_Refresh();
			goto GBK_32;
		}
	}
	Delay_Ms(1000);
	Delay_Ms(1000);
	Delay_Ms(1000);
	LCD_Clear(WHITE);//清屏函數
	LCD_Refresh();
	FATFS_printDir("0:/Text/");
  while(1)
  {  
		res=XPT2046_ReadXY();
		if(res)
		{
			//printf("x,y=%d,%d\r\n",xpt2046_info.x,xpt2046_info.y);
			y=List_CheckNode(story_head,xpt2046_info.y,(u8 *)buff);
			if(y)
			{
				LcdFill(0,y-8,320,y+24,LIGHTGREEN);
				LCD_Display_Str2(20,y,16,(u8 *)buff,DARKBLUE,LIGHTGREEN);//顯示字符串
				LCD_Refresh();
				while(T_PEN==0){}//等待松開
				LcdFill(0,0,320,480,WHITE);
				OLED_DrawRectangle(1, 415, 319,479,BLACK);//繪制矩形
				OLED_DrawRectangle(2, 416, 318,478,BLACK);//繪制矩形
				LCD_DrawLine(105, 415, 105, 479,BLACK);
				LCD_DrawLine(106, 415, 106, 479,BLACK);
				LCD_DrawLine(211, 415, 211, 479,BLACK);
				LCD_DrawLine(212, 415, 212, 479,BLACK);
				LCD_Display_Str2(5,415+20,24,(u8 *)"字體大小",BLACK,WHITE);//顯示字符串
				LCD_Display_Str2(106+5,415+20,24,(u8 *)"字體顏色",BLACK,WHITE);//顯示字符串
				LCD_Display_Str2(212+29,415+20,24,(u8 *)"返回",BLACK,WHITE);//顯示字符串
				LCD_Refresh();
				FATFS_ReadFile(buff);
			}
		}
  }
}



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • lcd
    lcd
    +關注

    關注

    34

    文章

    4414

    瀏覽量

    167131
  • STM32
    +關注

    關注

    2266

    文章

    10876

    瀏覽量

    354910
  • 閱讀器
    +關注

    關注

    0

    文章

    299

    瀏覽量

    27908
  • TFT
    TFT
    +關注

    關注

    10

    文章

    384

    瀏覽量

    110964
收藏 人收藏

    評論

    相關推薦

    基于Labview的完美小說閱讀器

    本帖最后由 eehome 于 2013-1-5 09:51 編輯 使用說明:本小說閱讀器是基于Labview編程,可閱讀txt文件的文檔,適合小說
    發表于 12-16 15:16

    用pdf閱讀器閱讀pdf文件的方法

    ,啟動、加載速度飛快,支持各種pdf格式文件,看pdf小說或者文檔非常方便。是精心打造的一款專用的PDF閱讀軟件,體積小巧,同時對閱讀器進行全面提速,可以達到瞬間啟動。軟件界面采用小清新的風格設計,給您
    發表于 03-31 10:21

    【技術雜談】用python實現自己的小說閱讀器

    -Python于是乎,自己動手豐衣足食,接下來就讓我們實現自己的小說閱讀器吧。語音合成選擇要想讀文字,就必須要用到語音合成。現在這種語音合成的軟件有很多,其中訊飛和百度是比較好的兩種,我們這里就使用百度語音
    發表于 07-16 04:00

    分享一個小說閱讀器

    ,但還有部分亂碼)新手戳作勿見笑供入門者觀摩筆記本拍的照片,太模糊,沒有相機(窮淫啊,傷不起)ALIENTEK MINISTM32 實驗S01 小說閱讀器.zip (3.08 MB )
    發表于 08-03 23:06

    基于STM32設計的小說閱讀器

    一、環境介紹小車主控MCU: STM32F103ZET6STM32程序開發IDE: keil5STM32程序風格: 采用寄存方式開發,注釋齊全,執行效率高,方便移植硬件包含:一塊
    發表于 07-19 06:31

    基于STM32F4的電子閱讀器制作教程

    基于STM32F4的電子閱讀器一、項目功能要求項目說明:項目偏軟件,但是要依賴于自己對硬件的熟悉和驅動才能完成用到的主要技術:SD卡驅動(難–不過可移植SD卡驅動細節可在用完再了解其驅動協議
    發表于 07-21 07:22

    【技術精選】嵌入式STM32原創征文活動精選文章

    應用案例基于PAJ7620和STM32手勢識別應用案例STM32應用案例 基于STM32F103ZE開發的數碼相冊基于STM32小說
    發表于 07-27 18:26

    djvu閱讀器下載

    djvu閱讀器下載djvu文件閱讀器,djvu文檔閱讀器
    發表于 05-06 12:41 ?496次下載
    djvu<b class='flag-5'>閱讀器</b>下載

    基于STM32的LF RFID閱讀器研究

    基于STM32的LF RFID識別系統,可以對電子標簽卡進行檢測、識別,并對識別的信息進行相應的處理。閱讀器硬件由控制模塊、功率模塊、天線、檢波電路和信號轉換電路組成。控制模塊以
    發表于 11-26 15:02 ?54次下載
    基于<b class='flag-5'>STM32</b>的LF RFID<b class='flag-5'>閱讀器</b>研究

    基于圖論的閱讀器防碰撞算法

    射頻識別( RFID)系統的運行往往需要多個閱讀器,以保證覆蓋整個目標區域。在密集的閱讀器的環境中,由于閱讀器之間存在相互干擾,會影響整個RFID系統的工作效率,降低識別效率。針對上述問題,提出一種
    發表于 11-29 11:26 ?1次下載
    基于圖論的<b class='flag-5'>閱讀器</b>防碰撞算法

    電子書閱讀器入門神器,當屬當當閱讀器新銳版

    在現代快節奏的都市生活中,隨著碎片化時間的增加,人們的閱讀習慣也悄然發生了變化,電子書閱讀器從小眾的閱讀方式變成為當下閱讀的流行趨勢。想要體驗這種生活方方式,當當
    發表于 11-26 13:47 ?3844次閱讀

    基于STM32設計的小說閱讀器(翻頁、字體切換、顏色切換、語音播報)

    基于STM32設計的小說閱讀器(翻頁、字體切換、顏色切換、語音播報)
    發表于 11-23 18:06 ?18次下載
    基于<b class='flag-5'>STM32</b>設計的<b class='flag-5'>小說</b><b class='flag-5'>閱讀器</b>(翻頁、字體切換、顏色切換、語音播報)

    基于ST32F103ZET6設計的小說閱讀器詳解

    這是基于ST32F103ZET6設計的小說閱讀器,雖然對于真實的小說閱讀器產品來講,實用性和功能方面還差很多,但是對于剛入門的STM32、單
    的頭像 發表于 02-28 13:37 ?3884次閱讀
    基于ST32F103ZET6設計的<b class='flag-5'>小說</b><b class='flag-5'>閱讀器</b>詳解

    基于STM32的RFID手持式閱讀器的研究與設計

    電子發燒友網站提供《基于STM32的RFID手持式閱讀器的研究與設計.pdf》資料免費下載
    發表于 10-08 09:59 ?0次下載
    基于<b class='flag-5'>STM32</b>的RFID手持式<b class='flag-5'>閱讀器</b>的研究與設計

    基于STM32的LF RFID閱讀器研究

    電子發燒友網站提供《基于STM32的LF RFID閱讀器研究.pdf》資料免費下載
    發表于 10-23 10:00 ?0次下載
    基于<b class='flag-5'>STM32</b>的LF RFID<b class='flag-5'>閱讀器</b>研究