前言:这么多天在家做了一个小玩意,里面存了几十张我和对象的照片,还存了近50句。有一种每日快乐的模式,就是随机展示一张照片,然后随机展示一个情话。(女票总是让我说一句好话,我想不起来。让她自己看看。.0 文章内容主要讲解各个环节的难点,具体程序下载自己看。 展示一下:
"每日一乐"模式 句子浏览模式(有密码)
一、前期准备
- 共用设备:STC12C5A60S单片机最小系统开发板,TFT彩屏1.44寸,W25Q128一个(flash),洞洞板7x9cm,按键2个(1k有条件的话可以加一个电阻)RAM芯片
- STC12C5A60S单片机最小系统开发板 这是最小的系统,有一个开关,复位,多一件事TFT因为是11针,所以只能买11针。TFT1.44彩屏。有排座比较方便,不需要单独焊接。
- TFT彩屏1.44寸 这是一个全彩屏幕。使用他给出的函数,颜色深度为16位(R-G-B是5-6-5),8针和11针一样,看手册基本都是ST7735驱动的,用SPI只有8个协议是一样的。为方便安装在板上,用了11针。
- W25Q128一个(flash) flash,可存储128个非易失存储器件Mb,也就是16MB,当然也有小一点的W25Q16(2MB),W25Q32(4MB),W25Q64(8MB),根据自己的需要来。我想我可以放更多的照片,所以我来了大的,但我不能用完。
- 洞洞板7x9cm 这是因为它需要添加到最小系统板上flash,没有直接接口,只能取中最小系统和flash,还有俩按键都焊到板上就行了,就这用途。
- 需要存储的照片和句子取模数据 :
我们没有文件系统,是最基本的字符形式,
- 图片:由于TFT1.这个屏幕只有1284寸x128的分辨率,所以图片只能剪成这个尺寸,然后取模,128*128是16384个像素点,每点16个颜色数据,因此共有32768 Byte一张图,也就是32KB大小存一张图。
- 汉字:16个汉字*16.算法相同,一个字取完模占32 Byte。
- 句子:先前想过两种存储方式,
- 第一种是存一个字库,最常用的汉字是1000-2000,最好按笔画分组,因为在keil他默认将一个汉字存入两个字符(这就是为什么keil 删除汉字要按删除两次),这样索引查找字库的方比较快。 假设是这样的:(假设是这样的:(假设 甲 这个字是0x08,0x我不知道是什么。加上32B字模数据) “甲”,0x00,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08, 0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00, 一个字占用34Byte ,但是,为了对齐,最好直接占用A字符32Byte,一共64Byte一个字。 这样,索引就可以直接在程序中写A、B、C、丁,而不是A字放在第120位,程序写120、121、122、123。
- 第二种是直接存储句子,但由于句子长度不同,存储比9*麻烦,最好对齐,方便我们调用搜索使用 我总共有50多个句子,总共不超过1000个单词。就这样,我的句子最多改成32个单词,只是为了对齐。所以一个句子只是1KB。补充空白不足32个字到32个字。
二、步骤:
-
< >: 焊板,最小系统,flash芯片,按钮都包含在板子上,怎么好看,怎么来,然后记住这段时间用什么引脚。 比如我安排的:TFT彩屏的CS-P2.0,RST-P2.1, TS-P2.2, SDA-P2.3, SCL-P2.4, LED-P2.5 W25Q128的CS-P1.1, DO-P1.2, CLK-P1.4 , DI-P1.5 把电源都接好,按键需要1k电阻,焊接好烙铁什么的就不用了,开始编程。
-
< >: (程序分为两部分,第一部分写入准备好的照片和句子flash中去,第二部分是最后要用的展示。 程序的第一部分–下载部分:
注:这部分内容是学习 无量寿经的《STC51单片机入门(C语言),出版的纸版书名为51单片机轻松入门-基于STC15W4K系列》第24章 2M字节Flash Rom存储器W25Q16/W25X16 的使用。
-
先简要介绍一下W25Q128这个器件 (为了方便,我直接用书W25Q16来说这个flash,我用的是W25Q128只是比他大,一切都一样) W25Q16一共16Mbit,也就是2MB,分为8192页, 1页=256字节 1扇区=16页= 16x256字节=4096字节 (W25X有512个扇区)。 1块 =16扇区 =256x256字节=65536字节 (W25X16有32块)。 : 每次使用页面编程指令编程256字节,页面编程指令是最小的写入指令,即至少256字节,即使你只想写一个字节,剩下的255字节也应该填写。 每次可以用扇区擦除指令擦除16页, 每次可以用块擦除指令擦除256页, 整个芯片可以用整片擦除指令一次擦除,W25X16有512个可擦除扇区或32个可擦除块。
-
为什么flash写作前需要把每一个都写下来byte擦除为0xff? (开始胡说八道,记得看过一些,但是记不清了,欢迎指正)因为这个存储器件的每个存储bit它们都是由基本元件(电容器或电容器)制成的mos管)构成,当存储1变为0时,可以有效存储,即放下电荷,但直接将0变为1 是变不了的,没有办法自主充电荷,所以由之前数据如果是0,那么必须重新擦除都刷成1,然后再重新写。
-
这个时候要考虑一个问题,每次至少写256Byte,如何存储图片数据是一个问题,一个图片数据是32KB,如果将此图片数据放入C文件并放入项目,则编译hex文件要96KB,要知道12C5A60S2单片机ROM只有60KB,放不下。:
第一种: STC12C5A60S单片机1280B的RAM,其中256B是内部RAM,剩下的1024B是内部扩展RAM,内部留作中间计算,不占用,【这是重点,下面用】内部扩展RAM可以用“unsigned char xdata a[1024];"来调用。因为main这么大的数组不能放在函数中,我们最大的数组只能用这个。(单片机内部扩展RAM是否可以访问辅助寄存器AUXR(地址为8EH)中的EXTRAM位控制。) 然后写一个URAT串口收集程序,每次从电脑端发送1024B数据,然后串口接收并逐一放入数组,然后写入W25Q工作量大。 (注:电脑串口助手发送的数据,注意选择字符模式还是hex模式。默认发送文件是字符模式 字符模式很麻烦,发送0x58,也就是58,其实是串口发的 0x35和0x一个数变成两个) 第二种: 安装外部RAM,这样方便多了,一张照片的32通过串口一下子就方便多了。KB发送数据,然后直接写入,工作量小(没有买这个RAM,因为是几年前开始做的,快递就停了,想用最麻烦的方式做) 第三种: (自用)最麻烦的。 图片数据 的一半 放到一个pic.c将文件放入项目,即16384 B使用大小数组code段来保存这个很大的数组。code段是存储程序代码的地方。把数据放在这里是固定的,所以你不能在这一段创建一个大的数组RAM用。 编译出来的hex文件要50KB更多,然后改变pic.c文件数据,然后更改写入地址,下载程序。。pic.c文件数据,然后更改写入地址,下载程序。 损失也可以擦写10万次。。。25张图片 我做了50次,句子50句,句子3次。也就是说,我至少做了53次(当然不仅仅是调试)
-
W25Q128地址相关问题 地址是24位,所以一个long int存储类型的变量 一个图片是32KB,也就是0x大小8000,所以存照可以以这个为基准,#define pic_size 0x8000 然后第一张就是 0x pic_size,第二张就是 1x pic_size。。。以此类推 上面出现了一个问题,在使用W25Q128的写入函数时,我发现传入的地址高8位一直是0(long 型一共32位,最高的8位用不到就不管,低16位是正常的),例如地址是0x10000,最后传入的是0x00000。这个问题我找了好久,后来通过串口发送地址数据检查出来的。。。。 最后用移位的方式解决的,就是需要发送0x10000,我就发送(0x10)<<12; 来完成的,因为低12位是不变的,所以移位12位就好。
-
-
< >: 程序第二部分–展示的程序:
- 所有的界面介绍: 1. 开始界面(放了一张“滑稽”图片,点击确定进入主界面) 2. 主界面(选择界面,三种模式:每日一乐,图片浏览,句子浏览) 3. 每日一乐(做这个的初衷,就是随机显示一张图片,点击确认然后随机显示一句话,然后再显示一个“mua”的图片) 4. 图片浏览(这个是所有图片的一个浏览,不过设置密码了,密码在那些句子里) 5. 句子浏览(就是所有情话的一个浏览,也设置密码了,就俩按键,也就是左右左右左什么的。)
- 图片的显示 这个里面就要说到上面的RAM,因为只有1024B的RAM,而显示一张图片有32K的数据呢,所以就只能分成32次显示,每次从flash中读取1024B的数据,然后显示一行,一行是4x128,每次确定好区域 Lcd_SetRegion(0, n<<2,128-1, (n<<2)-1); // n是32次循环的一个计量,然后就可以挨个传输数据点了。不过这样显示一张图片,加上清屏大概1s,还是挺慢的。(所以如果外加了一块RAM,就更方便了,一次显示。)
- 句子显示 同理,1KB的RAM正好是一句话,32个字,直接显示就行了。字的显示也是描点,不过是就只有两种颜色,字模数据是1那就是字的颜色,0就是背景色。
- 随机数 用定时器来做的,按键按一下来进行选择,做到真正的随机。
三、最后
程序我都放在了CSDN的下载里,设置了0分,取用的,大家在这页点个赞让我看到就好,嘿嘿0.0. 下载链接 不过还要说一句,文档是一定要看的,尤其是单片机的文档,用到别的芯片也要看文档,因为出了问题,查文档是最快的,有时候直接看一眼时序图就什么都理解了。 调试的过程中记住好好的用 ,真的很有用。 上面单片机的RAM部分,我觉得也很重要,码住!