“所有模式功能都有啦,快快把它们联系起来,好激动哦!!”
3.7 模式选择
关于模式选择,就是一个switch函数。通过红外遥控来更改mode的值,之后==switch(mode)==来进行对应的模式切换,不过有些模式需要初始化,所以设置了一个mode_pre来存放上一次模式的值,当mode!=mode_pre时,说明模式切换了,之后进入新模式的初始化,进行mode_pre=mode赋值操作,这样初始化就只进行了一次,之后在进入switch(mode)就会正常的模式运行了。
定义了一些变量
u8 mode=0xff; //当前模式
u8 mode_pre=0xff; //上次模式
正常的模式是从mode=0开始的,单片机上电时先不进行任何模式,所以先设置成0xff。
代码很简单,在这里就不画流程图了,直接上代码图片(完整代码太长,就放最后代码附录里了,下面是模式选择的框架)
3.8 其余的一些小模式
3.8.1 短动画
如果放较长的动画,单片机的存储器不够用,需要用SD卡,但是。。时间不够,一切从简,从网上找了一个短一点的动画,更确切的是表情包,分出来的图片只有6张。
放动画的原理也很简单,也就是很快的刷新图片,根据人眼的视觉暂留效应。只要能成功显示一张图片,那么动画也就是瞬间的事了。
拍的不是很清楚,见谅撒,嘻嘻嘻!
3.8.2 显示正弦,余弦,中心水平垂直线、圆
这个模式纯粹的就是调用LCD12864里的函数,没有什么新奇的东西,具体代码请看链接: LCD12864——基于STC15W5K32S4
“到这里基本就结束啦,最后附上主函数的代码”
3.9 主函数
#include "STC15Fxxxx.h"
#include "delay.h"
#include "LCD12864.h"
#include "picture.h"
#include "HC595.h"
#include "timer.h"
#include "remotecontrol.h"
#include "adc.h"
#include "jisuan.h"
#include "PS2.h"
#include "Tetris.h"
void main(void)
{
u8 i=0;
P0M1 = 0; P0M0 = 0; //设置为准双向口
P1M1 = 0; P1M0 = 0; //设置为准双向口
P2M1 = 0; P2M0 = 0; //设置为准双向口
P3M1 = 0; P3M0 = 0; //设置为准双向口
P4M1 = 0; P4M0 = 0; //设置为准双向口
P5M1 = 0; P5M0 = 0; //设置为准双向口
P6M1 = 0; P6M0 = 0; //设置为准双向口
P7M1 = 0; P7M0 = 0; //设置为准双向口
jisuaninit();
HC595_Init(); //595初始化
//DisableHC595(); //595关闭
Timer_Init(); //定时器初始化
ADCinit(); //ADC初始化
delay_ms(100); //启动等待,等LCD讲入工作状态
LCD12864_Init(); //LCD初始化
delay_ms(5); //延时片刻(可不要)
PS2_Init(); //PS2初始化
EA = 1; //开启总中断
LCD12864_Clear(); //LCD清屏
DisplayListChar(0,1,uctech); //显示字库中的中文数字
DisplayListChar(0,2,net); //显示字库中的中文数字
DisplayListChar(0,3,mcu); //显示字库中的中文
DisplayListChar(0,4,qq); //显示字库中的中文数字
delay_ms(5000); //延时
delay_ms(5000);
LCD12864_Clear(); //LCD清屏
ShowList(); //显示列表目录
while(1)
{
if(B_1ms) //1ms到
{
B_1ms = 0;
if(B_IR_Press) //检测到收到红外键码
{
B_IR_Press = 0;
RemotecontrolSwitch();
/*****显示接收到的红外编码*******/
//要显示红外编码的话要把摇杆的显示部分注释/
// LED8[0] = (u8)((UserCode >> 12) & 0x0f); //用户码高字节的高半字节
// LED8[1] = (u8)((UserCode >> 8) & 0x0f); //用户码高字节的低半字节
// LED8[2] = (u8)((UserCode >> 4) & 0x0f); //用户码低字节的高半字节
// LED8[3] = (u8)(UserCode & 0x0f); //用户码低字节的低半字节
// LED8[6] = IR_code >> 4;
// LED8[7] = IR_code & 0x0f;
/*******************************/
}
Mode_Switch();//模式选择函数
Read_PS2(); //读取PS2函数
delay_ms(150);
if(!PS2_RedLight())
{
LED8[0] = (u8)((out[7] >> 4) & 0x0f); //左摇杆左右模拟值高半字节
LED8[1] = (u8)(out[7]& 0x0f); //左摇杆左右模拟值低半字节
LED8[2] = (u8)((out[8] >> 4) & 0x0f); //左摇杆上下模拟值高半字节
LED8[3] = (u8)(out[8]& 0x0f); //左摇杆上下模拟值高半字节
LED8[4] = DIS_;
LED8[5] = (u8)(Point_L_ShowLine & 0x0f);
LE