程序源自我的团队的一个参赛项目,项目文件是一个大工程有很多内容由其他队员编写我也不好直接发上来,所以我只好截取了其中我写的一个小模块放上来供大家分享。
这个程序主要可以实现“任意图片显示”以及“任意视频播放”两个功能,数据都通过串口进行传输(波特率4800,蓝牙或USB均可),当然发送的数据只能是处理好的图像取模数据。(LCD驱动是st7920)
上电后直接显示以下图像:
此时发送53 FF(十六进制发送)即可使用显示单张图片的预设,这时再通过串口发送取模数据就可以实时显示图像。
显示完图片后发送 01 0E即可跳回就绪状态(如果无法退出就定时循环发送01 0E)。
如果在就绪状态下发送53 53就可以进行视频流播放,此时只要将视频流的逐帧取模代码通过串口发过来就行了。
附件压缩包里有我制作的Bad Apple 烂苹果取模BIN文件供大家参考。
由于我的晶振是12MHz的,所以波特率设置为4800,实测播放速度有1帧/秒,大家也可以更改定时器参数来提高波特率。
视频播放完毕后同样循环发送01 0E就可以回到就绪状态了。
下面放出main函数代码,其他代码放在附件中。
#include <reg51.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define tbuf 25
u8 RX_buffer[tbuf]={0}; //全局字符串数组,串口接收缓存,用于记录蓝牙串口发来的信息
u8 RX_num=0; //蓝牙接收的字符个数
u8 RX_value=0; //蓝牙函数处理后返回的值
#include "delay service.h"
#include "driver of LCD12864.h"
#include "bluetooth.h"
#include "resource.h"
void init()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void main()
{
init(); //红外、蓝牙初始化
Initialization(); //LCD初始化
Screen_Clear();
while(1)
{
unsigned char j=0,k=0,l=0,m_flag=0;
RX_buffer[1]=0;
Write_Instruction(0x01);
Display_Text(0x80,text16);
Display_Text(0x98,text15);
while(RX_buffer[1]==0);//跳出此模式的条件
Write_Instruction(0x01);
if(RX_buffer[1]==0xFF) //发送0x53 0xXX(XX表示任意,除01,FF外)默认视频播放模式,发送0x53 0xFF则为图片显示模式
{
m_flag=1;
}
RX_num=1;
while((RX_buffer[1] != 0x01) || (RX_buffer[2] != 0x0E))//发送0x01 0x0E退出
{
while((j != 32) || (l != 1))
{
Write_Instruction(0x36);
while(RX_num != 17);
if((RX_buffer[1]==0x01) && (RX_buffer[2])==0x0E) break;
if((l==0) && (j==32))
{
l=1;
j=0;
}
Write_Instruction(0x80+j);
if(l==0)
{
Write_Instruction(0x80);
}
else
{
Write_Instruction(0x88);
}
for(k=1;k<17;k++)
{
Write_Data(RX_buffer[k]);
}
j++;
RX_num=1;
}
if(m_flag==1)
{
RX_buffer[1]=0x01;
RX_buffer[2]=0x0E;
}
j=0;
l=0;
}
RX_num=0;//接收数组下标指向指令位
RX_buffer[0]=0;
while(RX_buffer[0]==0);
Screen_Clear();
}
}
附件压缩包内容:
图像取模软件我推荐Image2Lcd,新版本支持批量取模。
全部资料51hei下载地址:
多媒体功能演示.zip
(262.09 KB, 下载次数: 181)
|