综合设计——基于STC15W4K32S4(第三部分)
“所有模式功能都有啦,快快把它们联系起来,好激动哦!!”
文章目录
- 3.7 模式选择
- 3.8 其余的一些小模式
- 3.8.1 短动画
- 3.8.2 显示正弦,余弦,中心水平垂直线、圆
- 3.9 主函数
- 附录代码
- 模式选择的代码
- 短动画和波形显示代码
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);LED8[6] = DIS_; //按键高半字节(右按键的上下左右,L1,L2,L3,R1,R2,R3)LED8[7] = (u8)(Point_R_ShowLine & 0x0f); //按键低半字节(右按键的上下左右,L1,L2,L3,R1,R2,R3)}else{LED8[0] = (u8)((out[3] >> 4) & 0x0f); //按键高半字节(左按键的上下左右)LED8[1] = (u8)(out[3]& 0x0f); //按键低半字节(左按键的上下左右)LED8[2] = DIS_;LED8[3] = DIS_;LED8[4] = DIS_;LED8[5] = DIS_;LED8[6] = (u8)((out[4] >> 4) & 0x0f); //按键高半字节(右按键的上下左右,L1,L2,R1,R2)LED8[7] = (u8)(out[4]& 0x0f); //按键低半字节(右按键的上下左右,L1,L2,R1,R2)}}}
}
附录代码
模式选择的代码
/********************************
功能:模式选择
*********************************/
void Mode_Switch(void)
{u8 i;switch(mode){case 0://计算器if((B_list==1)||(mode!=mode_pre)){B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;lie=2;LCD12864_Clear();}else{jisuan();//计算器函数break; }case 1://遥控画线if((B_list==1)||(mode!=mode_pre)){B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;lie=3;LCD12864_fill_GDRAM(0x00);LCD12864_Clear();LCD12864_Circle(Tantan_x,Tantan_y,Tantan_r,0);Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//左摇杆坐标起始点显示Jiahao(Point_R_x,Point_R_y,Point_R_r,1);//右摇杆坐标起始点显示}else{if(out[4]==0xFB)//L1{Fangxing(Point_L_x,Point_L_y,Point_L_r,0);Point_L_r++;if(Point_L_r>=6)Point_L_r=6;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);}if(out[4]==0xFE)//L2{Fangxing(Point_L_x,Point_L_y,Point_L_r,0);Point_L_r--;if(Point_L_r<=1)Point_L_r=1;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);}if(out[4]==0xF7)//R1{Point_R_ShowLine=!Point_R_ShowLine; if(!Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,Point_R_r,1);else {Jiahao(Point_R_x,Point_R_y,Point_R_r,0);LCD12864_Fill_Point(Point_R_x,Point_R_y,1);}}if(out[4]==0xFD)//R2{LCD12864_fill_GDRAM(0x00);//设置GDRAMFangxing(Point_L_x,Point_L_y,Point_L_r,1);//左摇杆坐标起始点显示if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//左摇杆左右i=PS2_AnologData(7);//读取一次左摇杆左右的模拟值(out[7]中)0~255 //(模拟值小于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中if((i<=0x40)||(out[3]==Left_L)){Fangxing(Point_L_x,Point_L_y,Point_L_r,0);//上次的点灭掉Point_L_x--;if(Point_L_x<Point_L_r)Point_L_x=Point_L_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//(模拟值大于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中else if((i>=0xBF)||(out[3]==Right_L)){Fangxing(Point_L_x,Point_L_y,Point_L_r,0);//上次的点灭掉Point_L_x++;if(Point_L_x>(127-Point_L_r))Point_L_x=127-Point_L_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//右摇杆左右i=PS2_AnologData(5);//读取一次右摇杆左右的模拟值(out[5]中)0~255 //(模拟值小于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中if((i<=0x40)||(out[4]==Left_R)){if(!Point_R_ShowLine) Jiahao(Point_R_x,Point_R_y,Point_R_r,0);//上次的点灭掉Point_R_x--;if(Point_R_x<Point_R_r)Point_R_x=Point_R_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//(模拟值大于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中else if((i>=0xBF)||(out[4]==Right_R)){if(!Point_R_ShowLine) Jiahao(Point_R_x,Point_R_y,Point_R_r,0);//上次的点灭掉Point_R_x++;if(Point_R_x>(127-Point_R_r))Point_R_x=127-Point_R_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//左摇杆上下i=PS2_AnologData(8);//读取一次左摇杆上下的模拟值(out[7]中)0~255 //(模拟值小于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中if((i<=0x40)||(out[3]==Up_L)){Fangxing(Point_L_x,Point_L_y,Point_L_r,0);//上次的点灭掉Point_L_y--;if(Point_L_y<Point_L_r)Point_L_y=Point_L_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//(模拟值大于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中else if((i>=0xBF)||(out[3]==Down_L)){Fangxing(Point_L_x,Point_L_y,Point_L_r,0);//上次的点灭掉Point_L_y++;if(Point_L_y>(63-Point_L_r))Point_L_y=63-Point_L_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//右摇杆上下i=PS2_AnologData(6);//读取一次右摇杆上下的模拟值(out[6]中)0~255 //(模拟值小于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中if((i<=0x40)||(out[4]==Up_R)){if(!Point_R_ShowLine) Jiahao(Point_R_x,Point_R_y,Point_R_r,0);//上次的点灭掉Point_R_y--;if(Point_R_y<Point_R_r)Point_R_y=Point_R_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}//(模拟值大于自己定的值)|| (左按键(out[3]中)的值==PS2中规定的值)//关于out,模拟值的定义在PS2.c中else if((i>=0xBF)||(out[4]==Down_R)){if(!Point_R_ShowLine) Jiahao(Point_R_x,Point_R_y,Point_R_r,0);//上次的点灭掉Point_R_y++;if(Point_R_y>(63-Point_R_r)) Point_R_y=63-Point_R_r;Fangxing(Point_L_x,Point_L_y,Point_L_r,1);//刷新点if(Point_R_ShowLine)Jiahao(Point_R_x,Point_R_y,0,1);//刷新点elseJiahao(Point_R_x,Point_R_y,Point_R_r,1);//刷新点}break;}case 2://弹一弹if((B_list==1)||(mode!=mode_pre))//第一次进入当前模式{B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;lie=4;//列表箭头指向当前模式i=TL0;//获取当前定时器的值,作为伪随机数Tantan_x=(u8)( i & 0x7f);//获取定时器的后7位作为圆的起始横坐标xTantan_y=(u8)( i & 0x3f);//获取定时器的后6位作为圆的起始纵坐标yTantan_r=(u8)( i & 0x07);//获取定时器的后3位作为圆的半径rTantan_dx=(u8)( i & 0x01);//获得起始横坐标移动方向dxTantan_dy=(u8)( (i>>1) & 0x01);//获得起始纵坐标移动方向dyif(!Tantan_dx)Tantan_dx=-1;//左方向-1if(!Tantan_dy)Tantan_dy=-1;//上方向-1if(Tantan_r==0) Tantan_r=1;//确保半径最小为1if(Tantan_x<=Tantan_r) Tantan_x=Tantan_r+1;//防止初始圆被边界错位else if(Tantan_x>=127-Tantan_r)Tantan_x=127-Tantan_r-1;//防止初始圆被边界错位if(Tantan_y<=Tantan_r) Tantan_y=Tantan_r+1;//防止初始圆被边界错位else if(Tantan_y>=63-Tantan_r)Tantan_y=63-Tantan_r-1;//防止初始圆被边界错位LCD12864_Clear();//清屏LCD12864_fill_GDRAM(0x00);//清除GDRAMLCD12864_Circle(Tantan_x,Tantan_y,Tantan_r,1);//显示初始圆break;}else//第二次以及以后进入模式{LCD12864_Circle(Tantan_x,Tantan_y,Tantan_r,0);//清除上次的圆if(Tantan_x<=Tantan_r) Tantan_dx=1;//碰到边界坐标移动方向变为相反else if(Tantan_x>=127-Tantan_r)Tantan_dx=-1;if(Tantan_y<=Tantan_r) Tantan_dy=1;else if(Tantan_y>=63-Tantan_r)Tantan_dy=-1;Tantan_x+=Tantan_dx;//更新坐标Tantan_y+=Tantan_dy;LCD12864_Circle(Tantan_x,Tantan_y,Tantan_r,1);//显示当前圆break;}case 3://俄罗斯方块if((B_list==1)||(mode!=mode_pre)){B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;lie=5;//列表箭头指向当前模式LCD12864_Clear();//清屏LCD12864_fill_GDRAM(0x00);//清除GDRAMLCD12864_Clear();//清屏SysFlag=0; KeyCode=0;Score=0;SysFlag^=1<<PAUSEFLAG;//开启时暂停Game_Init();//游戏初始化DrawBoard();//画界面break;}else {GamePlay();//游戏进行break; }case 4://动画if((B_list==1)||(mode!=mode_pre)){B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;picture_num=0;//第0张图片LCD12864_Clear();//清屏DisplayImage(gImage1[picture_num]);//显示第picture_num张图片break;}else{picture_num++;//更新当前图片数if(picture_num>=6)picture_num=0;//图片数复位DisplayImage(gImage1[picture_num]);//显示第picture_num张图片break;}case 5://正弦,余弦,中心水平垂直线、圆if((B_list==1)||(mode!=mode_pre)){B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;LCD12864_Clear();//清屏LCD12864_fill_GDRAM(0x00);//清除GDRAMLCD12864_Circle(64,32,30,1);//画圆LCD12864_Verticalline(63,0,63,1);//画垂线LCD12864_Horizontalline(0,127,31,1);//画水平线LCD12864_fsin();//画正弦波LCD12864_fcos();//画余弦波break;}else break; case 6:if((B_list==1)||(mode!=mode_pre)){B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;break;}else break;case 7:if((B_list==1)||(mode!=mode_pre)){B_list=0;//清除列表标志位mode_pre=mode;cmode=mode;break;}else break;case 8: break;case 9: break;default:break; }
}
短动画和波形显示代码
这些代码分别在上面Mode_Switch中的case 4,case 5中。
“完成啦!庆贺吧!!”
“其余部分在这里哦”
综合设计——基于STC15W5K32S4(第一部分)
综合设计——基于STC15W5K32S4(第二部分)
综合设计——基于STC15W4K32S4(第三部分)相关推荐
- 数字电子技术课程设计之基于触发器的三位二进制同步减法计数器无效态000/110
基于触发器的三位二进制同步减法计数器无效态000/110 1 课程设计的目的与作用 掌握用multisim 的电路仿真程序 熟悉同步计数器工作原理和逻辑功能 熟悉计数器电路的分析和设计方法 掌握161 ...
- 电子技术综合实践——基于Proteus的抢答器设计
目录 1 设计任务 1.1 设计目的 1.2 设计要求 1.2.1 基本要求 1.2.2 功能增强内容 2 主要过程 2.1概述 2.2主要流程框图 3.元器件选择与清单 3.1元器件 3.2使用清单 ...
- 计算机组成原理认识fpga,计算机组成原理课程设计-基于EDA和FPGA技术的8位模型计算机的设计与实现_精品.doc...
计算机组成原理课程设计-基于EDA和FPGA技术的8位模型计算机的设计与实现_精品 目录 前言2 第一章 课程设计内容2 1.1 实验要求2 1.2 实验目的2 第二章 实验原理及方案2 2.1 实验 ...
- python cnn图像分类_关于CNN图像分类的一份综合设计指南
摘要: 本文是一篇关于使用CNN完成图像分类的综合设计指南,涵盖了一些模型设计.模型优化以及数据处理经验,是一份适合图像分类方向研究者参考的综合设计指南. 对于计算机视觉任务而言,图像分类是其中的主要 ...
- 关于CNN图像分类的一份综合设计指南
摘要: 本文是一篇关于使用CNN完成图像分类的综合设计指南,涵盖了一些模型设计.模型优化以及数据处理经验,是一份适合图像分类方向研究者参考的综合设计指南. 对于计算机视觉任务而言,图像分类是其中的主要 ...
- 看完这篇电磁兼容分层与综合设计法,EMC你还不懂就没救了
摘要 按照产品在电磁兼容设计时所采取的各项措施的重要性为先后,分为若干层次进行设计,并加以综合分析进行适当调整直到完善,这就是本文提出的" 电磁兼容分层与综合设计法".可以做到电磁 ...
- 项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四)
系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...
- c语言编写闹钟主程序流程图,课程设计基于单片机的定时闹钟.docx
课程设计基于单片机的定时闹钟.docx 课程设计 设计题目:基于单片机的定时闹钟 院 系:电气工程 专 业:电子信息工程 年 级: 姓 名: 指导教师: 课程设计任务书 专业电子信息工程姓名学号 开题 ...
- android媒体播放器课程设计,基于android的多媒体播放器课程设计报告.doc
基于android的多媒体播放器课程设计报告.doc /* 附源码.希望此文能帮助到一些新手.也希望更多的人在网络上 分享自己的学习成果.互相交流,扣扣70876398 */ 1. 开发环境 Andr ...
最新文章
- C++数组名做函数形参/指针
- 大型电商网站详情页是如何支撑亿级流量访问的?
- R语言all函数、any函数判断逻辑向量(logical vector)实战
- Github上十大热门可视化面板!再也不用担心画图啦!
- 毕业设计第四次任务书
- Dataset之CamVid:CamVid数据集的简介、下载、使用方法之详细攻略
- 安可与普通测评的区别_PRINCE王子TeXtreme Tour 100系列网球拍测评(文末有福利)
- ops中set_sysclk set_clkdiv set_pll详解
- [云炬创业学笔记]第二章决定成为创业者测试8
- JSBinding + SharpKit / 实战:转换 Stealth
- cad镜像后标注尺寸数字反了_CAD画法大全
- C++_程序内存模型_内存四区_代码区_全局区_每种区域都存放什么样的变量---C++语言工作笔记028
- html5 渐变按钮练习
- 英康手机订单系统APP使用说明
- 通过云服务器实现淘宝京东抢拍器
- 电脑拖机,win10一台电脑两人用
- atmega 128 单片机 开发 例子 例程 教程 ADC PWM 呼吸灯
- 人脸识别的loss总结
- 财会法规与职业道德【5】
- [pillow]透明图片和不透明图片叠加合成--添加透明度
热门文章
- SQL Server 复制表及数据的两种方法
- java 数组 字符串 编程_如何将数组转化为字符串,编程怎么实现呢
- 【报错】关于[Error] cannot bind non-const lvalue reference of type ‘std::String‘ to an rvalue……的一个解决方案
- 如何修改Tomcat默认端口号8080的方法
- boost::thread编程实战(2)——获取线程id并转化为DWORD类型
- 解决Hyper-V虚拟磁盘VHDX无法压缩/收缩(Compact)的故障
- win32编程里面的APC怎么用?
- JAVA数据结构 之 BitSet 类的使用方法
- 几种常见的跨域解决方法
- 智行小车(基于51单片机)——避障+循迹+停