当前位置: 首页 > news >正文

设计网站的企业科技建筑公司网站

设计网站的企业,科技建筑公司网站,广州网站建设报价,wordpress虾米目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键模块3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》#xff0c;一款经典的、怀旧的小游戏#xff0c;单片机入门必写程序。 以《贪吃蛇》为载体#xff0c;熟悉各种屏幕… 目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键模块3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》一款经典的、怀旧的小游戏单片机入门必写程序。 以《贪吃蛇》为载体熟悉各种屏幕的使用。 所用单片机STC32G12K128-Beta。 有两个版本自制独立按键版本和矩阵按键模块版本。 本文代码对应的是矩阵按键模块版本。 效果查看/操作演示B站搜索“甘腾胜”或“gantengsheng”查看。 源代码下载B站对应视频的简介有工程文件下载链接。 一、效果展示 1自制独立按键版本 2矩阵按键模块版本 二、原理分析 游戏原理可以参考以下这篇文章 基于51单片机和8X8LED点阵屏板载74HC595驱动的普中开发板矩阵按键控制的小游戏《贪吃蛇》 这里主要说一下8X8彩色点阵屏WS2812B的显示问题。 一个灯图片中白色正方形里面有三个LED分别是红、绿、蓝白色正方形中其实也集成了WS2812B芯片一个芯片可以存储3个字节Byte的数据接收到3个字节的数据后会把后面接收到的数据传给下一个灯的WS2812B芯片。一个字节控制一种颜色的LED即一个灯需要用24位Bit控制所以一个灯的颜色变化种类有22416777216‬种。 如何发送0和1呢类似DS18B20的数据发送通过高电平的时长来确定发送的是0还是1“0”的高电平时长较短“1”的高电平时长较长具体的时序图可以参考一下其他博主的文章。经过测试高低电平的时长要求不算严格但是需要注意的是如果不注意定时器中断函数打断的影响屏幕会出现“花屏”的情况即一个字节才发送一半就被定时器中断函数打断的话原来要发送的数据就改变了。如果以一个字节为单位发送一个字节前关闭总中断EA0发送完一个字节后再开启中断EA1这样显示就不会出现问题这样即不影响显示也不影响定时器的运行但是要注意定时器中断函数代码的执行时间不能太长太长的话相当于发送了重置RESET指令给WS2812B芯片屏幕会乱闪。 三、各模块代码 1、定时器0 h文件 #ifndef __TIMER0_H__ #define __TIMER0_H__void Timer0_Init(void);#endifc文件 #include STC32G.H/*** brief 定时器0初始化* param 无* retval 无*/ void Timer0_Init(void) { AUXR|0x80; //定时器时钟1T模式TMOD0xF0; //设置定时器模式16位不自动重载高四位不变低四位清零TMOD|0x01; //设置定时器模式16位不自动重载通过低四位设为“定时器0工作方式1”的模式TL00x40; //设置定时初值定时1ms1T24.000MHzTH00xA2; //设置定时初值定时1ms1T24.000MHzTF00; //清除TF0标志TR01; //定时器0开始计时ET01; //打开定时器0中断允许EA1; //打开总中断PT00; //当PT00时定时器0为低优先级当PT01时定时器0为高优先级 }/*定时器中断函数模板 void Timer0_Routine() interrupt 1 //定时器0中断函数 {static unsigned int T0Count; //定义静态变量TL00x40; //设置定时初值定时1ms1T24.000MHzTH00xA2; //设置定时初值定时1ms1T24.000MHzT0Count;if(T0Count1000){T0Count0;} } */2、矩阵按键模块 h文件 #ifndef __MATRIXKEYSCAN_H__ #define __MATRIXKEYSCAN_H__unsigned char Key(void); void Key_Tick(void);#endifc文件 #include STC32G.H #include INTRINS.H //需要用空操作_nop_();来延时#define Matrix_Port P2 //矩阵按键接口unsigned char KeyNumber;/*** brief 获取矩阵按键键码扫描周期内第二次获取键码值会返回0* param 无* retval 按下按键的键码范围0~480表示无按键按下*/ unsigned char Key(void) {unsigned char KeyTemp0;KeyTempKeyNumber;KeyNumber0;return KeyTemp; }/*** brief 检测当前按下按键的状态无消抖及松手检测* param 无* retval 按下按键的键值范围0~16无按键按下时返回值为0*/ unsigned char Key_GetState() {unsigned char KeyValue0;Matrix_Port0x0F; //给所有行赋值0列全为1_nop_();_nop_(); //适当延时若不加延时就不能正确检测按键if(Matrix_Port!0x0F){Matrix_Port0x0F; //测试列_nop_();_nop_();switch(Matrix_Port) //保存行为0时按键按下后的列值{case 0x07:KeyValue1;break;case 0x0B:KeyValue2;break;case 0x0D:KeyValue3;break;case 0x0E:KeyValue4;break;default:break;}Matrix_Port0xF0; //测试行_nop_();_nop_();switch(Matrix_Port) //保存列为0时按键按下后的键值{case 0x70:KeyValueKeyValue;break;case 0xB0:KeyValueKeyValue4;break;case 0xD0:KeyValueKeyValue8;break;case 0xE0:KeyValueKeyValue12;break;default:break;}}else{KeyValue0;}return KeyValue; }/*** brief 矩阵按键驱动函数在中断中调用* param 无* retval 无*/ void Key_Tick(void) {static unsigned char NowState,LastState;LastStateNowState; //按键状态更新NowStateKey_GetState(); //获取当前按键状态//如果上个时间点按键未按下这个时间点按键按下则是按下瞬间if(LastState0){switch(NowState){case 1:KeyNumber1;break;case 2:KeyNumber2;break;case 3:KeyNumber3;break;case 4:KeyNumber4;break;case 5:KeyNumber5;break;case 6:KeyNumber6;break;case 7:KeyNumber7;break;case 8:KeyNumber8;break;case 9:KeyNumber9;break;case 10:KeyNumber10;break;case 11:KeyNumber11;break;case 12:KeyNumber12;break;case 13:KeyNumber13;break;case 14:KeyNumber14;break;case 15:KeyNumber15;break;case 16:KeyNumber16;break;default:break;}}//如果上个时间点按键按下这个时间点按键还是按下则是长按if(LastState NowState){if(LastState1 NowState1){KeyNumber17;}if(LastState2 NowState2){KeyNumber18;}if(LastState3 NowState3){KeyNumber19;}if(LastState4 NowState4){KeyNumber20;}if(LastState5 NowState5){KeyNumber21;}if(LastState6 NowState6){KeyNumber22;}if(LastState7 NowState7){KeyNumber23;}if(LastState8 NowState8){KeyNumber24;}if(LastState9 NowState9){KeyNumber25;}if(LastState10 NowState10){KeyNumber26;}if(LastState11 NowState11){KeyNumber27;}if(LastState12 NowState12){KeyNumber28;}if(LastState13 NowState13){KeyNumber29;}if(LastState14 NowState14){KeyNumber30;}if(LastState15 NowState15){KeyNumber31;}if(LastState16 NowState16){KeyNumber32;}}//如果上个时间点按键按下这个时间点按键未按下则是松手瞬间if(NowState0){switch(LastState){case 1:KeyNumber33;break;case 2:KeyNumber34;break;case 3:KeyNumber35;break;case 4:KeyNumber36;break;case 5:KeyNumber37;break;case 6:KeyNumber38;break;case 7:KeyNumber39;break;case 8:KeyNumber40;break;case 9:KeyNumber41;break;case 10:KeyNumber42;break;case 11:KeyNumber43;break;case 12:KeyNumber44;break;case 13:KeyNumber45;break;case 14:KeyNumber46;break;case 15:KeyNumber47;break;case 16:KeyNumber48;break;default:break;}}}3、8X8彩色点阵屏 h文件 #ifndef __WS2812B_H__ #define __WS2812B_H__extern unsigned char ColorStyle; //extern外部可使用 extern unsigned char xdata WS2812B_Buffer[]; extern unsigned char code MyColor[]; void WS2812B_SetBuf(unsigned char Position,unsigned char R,unsigned char G,unsigned char B); void WS2812B_WriteByte(unsigned char Byte); void WS2812B_Clear(void); void WS2812B_UpdateDisplay(void); void WS2812B_MoveLeft(unsigned char *Array,unsigned char R,unsigned char G,unsigned char B,unsigned int Offset); void WS2812B_MoveUp(unsigned char *Array,unsigned char R,unsigned char G,unsigned char B,unsigned int Offset);#endifc文件 #include STC32G.H #include INTRINS.H //需要用空操作_nop_();来延时sbit WS2812B_DIP5^4;unsigned char ColorStyle; //颜色类型//用64*3192个字节作为WS2812B彩色点阵屏的缓存共有64个灯每个灯需要写入24Bit3个字节控制显示的颜色 //每三个字节为一组每一组分别对应彩色灯的G绿、R红、B蓝三原色 unsigned char xdata WS2812B_Buffer[192];//预设颜色数值设小一些是为了防止太刺眼 unsigned char code MyColor[]{ 16,0,0, //红色 0,16,0, //绿色 0,0,16, //蓝色 8,8,0, //黄色 8,0,8, //紫色 0,8,8, //青色 };/*** brief WS2812B彩色点阵屏私有延时函数1T24.000MHz调用可延时约100us* param 无* retval 无*/ void WS2812B_Delay100Us(void) {unsigned long edata i;i600UL;while(i){i--;} }/*** brief WS2812B彩色点阵屏设置一个点的缓存* param Position 要设置的位置高四位0~7对应1~8列从左到右低四位0~7对应1~8行从上到下* param R 红Red范围0~255* param G 绿Green范围0~255* param B 蓝Blue范围0~255* retval 无*/ /* 本函数适用于以下数据传输顺序的8X8彩色点阵屏如果不是的话需要修改函数 数据从第一列的B7开始往上到B0然后再到第二列的B7再往上到第二列的B0以此类推 每一个B对应一个灯。缓存数组SnakeBuffer的8个字节分别对应这8列高位在下 B0 B0 B0 B0 B0 B0 B0 B0 B1 B1 B1 B1 B1 B1 B1 B1 B2 B2 B2 B2 B2 B2 B2 B2 B3 B3 B3 B3 B3 B3 B3 B3 B4 B4 B4 B4 B4 B4 B4 B4 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B7 B7 B7 B7 B7 B7 B7 B7 */ void WS2812B_SetBuf(unsigned char Position,unsigned char R,unsigned char G,unsigned char B) {WS2812B_Buffer[Position/16*24(21-Position%16*3)]G;WS2812B_Buffer[Position/16*24(22-Position%16*3)]R;WS2812B_Buffer[Position/16*24(23-Position%16*3)]B; }/*** brief WS2812B彩色点阵屏写入一个字节* brief 要求1T24.000MHz频率如果不一样需要调“_nop_();”的数量* param Byte 要写入的字节* retval 无*/ void WS2812B_WriteByte(unsigned char Byte) {unsigned char i;EA0; //关闭总中断时序要求严格不能被打断要求中断函数执行的时间不能太长否则会“花屏”for(i0;i8;i){if(Byte(0x80i)) //高位先发{ //写1WS2812B_DI1; //根据高电平的时长确定发送的是1还是0跟DS18B20类似_nop_();_nop_();_nop_();_nop_();_nop_(); //用空操作进行延时_nop_();_nop_();_nop_();_nop_();_nop_(); //单片机使用不同的频率“_nop_();”的数量就不一样WS2812B_DI0; //经测试数据线拉低后可以不用延时}else{ //写0WS2812B_DI1;_nop_();_nop_();_nop_();_nop_();_nop_();WS2812B_DI0;}}EA1; //开启总中断 }/*** brief WS2812B彩色点阵屏清空缓存* param 无* retval 无*/ void WS2812B_Clear(void) {unsigned char i;for(i0;i192;i){WS2812B_Buffer[i]0;} }/*** brief WS2812B彩色点阵屏更新屏幕显示将缓存数组WS2812B_Buffer的192个字节写入64个灯的芯片内* param 无* retval 无*/ void WS2812B_UpdateDisplay(void) {unsigned char i;for(i0;i192;i){WS2812B_WriteByte(WS2812B_Buffer[i]);} //连续写入192个字节WS2812B_Delay100Us(); //Reset重置信号 }/*** brief WS2812B彩色点阵屏向左滚动显示* param Array 传递过来的数组的指针地址数组名就是数组的首地址* param R 红Red范围0~255* param G 绿Green范围0~255* param B 蓝Blue范围0~255* param Offset 偏移量向左平移Offset个像素* retval 无*/ void WS2812B_MoveLeft(unsigned char *Array,unsigned char R,unsigned char G,unsigned char B,unsigned int Offset) {unsigned char i,j;ArrayOffset;for(i0;i8;i) //每个亮点都写入相同的颜色{for(j0;j8;j){if(*(Arrayi)(0x80j)){WS2812B_Buffer[3*8*i3*j]G; //调了一下顺序数组WS2812B_Buffer中按WS2812B_Buffer[3*8*i3*j1]R; //GRB的顺序放置因WS2812B芯片就是要求按WS2812B_Buffer[3*8*i3*j2]B; //GRB的顺序发送数据的方便数据发送给芯片}else{WS2812B_Buffer[3*8*i3*j]0;WS2812B_Buffer[3*8*i3*j1]0;WS2812B_Buffer[3*8*i3*j2]0;}}} }/*** brief WS2812B彩色点阵屏向上滚动显示* param Array 传递过来的数组的指针地址数组名就是数组的首地址* param R 红Red范围0~255* param G 绿Green范围0~255* param B 蓝Blue范围0~255* param Offset 偏移量向上平移Offset个像素* retval 无*/ void WS2812B_MoveUp(unsigned char *Array,unsigned char R,unsigned char G,unsigned char B,unsigned int Offset) {unsigned char i,j;unsigned char m,n;unsigned char Temp[8];mOffset/8;nOffset%8;Array8*m;for(i0;i8;i) //将偏移后的数据保存到缓存数组Temp中一个Bit对应一个灯{Temp[i](*Arrayn) | (*(Array8)(8-n));Array;}for(i0;i8;i) //每个亮点都写入相同的颜色{for(j0;j8;j){if(Temp[i](0x80j)){WS2812B_Buffer[3*8*i3*j]G;WS2812B_Buffer[3*8*i3*j1]R;WS2812B_Buffer[3*8*i3*j2]B;}else{WS2812B_Buffer[3*8*i3*j]0;WS2812B_Buffer[3*8*i3*j1]0;WS2812B_Buffer[3*8*i3*j2]0;}}} }四、主函数 main.c /* by甘腾胜20241225 效果查看/操作演示可以在B站搜索“甘腾胜”或“gantengsheng”查看 开发环境Keil C251 单片机STC32G12K128-Beta 分频系数及频率1T24.000MHz 外设4X4矩阵按键模块、8X8LED彩色点阵屏WS2812B驱动 原理分析https://blog.csdn.net/gantengsheng/article/details/143581157 注意驱动WS2812B彩色点阵屏需要用1T的单片机传统的12T单片机无法驱动操作说明(1)自制独立按键版本K7 K2 上K7下K6K8 K5 K4 K1 左K8右K5K6 K3 开始/暂停/继续K1返回K2(2)普中开发板矩阵按键版本S1 S2 S3 S4 上S10 下S14 S5 S6 S7 S8 左S13右S15S9 S10 S11 S12 开始/暂停/继续S16返回S12S13 S14 S15 S16 本代码适用于以下数据传输顺序的8X8彩色点阵屏如果不是的话需要修改函数 数据从第一列的B7点阵屏左下角开始往上到B0然后再到第二列的B7再往上到第二列的B0以此类推 每一个B对应一个灯。缓存数组SnakeBuffer的8个字节分别对应这8列高位在下 B0 B0 B0 B0 B0 B0 B0 B0 B1 B1 B1 B1 B1 B1 B1 B1 B2 B2 B2 B2 B2 B2 B2 B2 B3 B3 B3 B3 B3 B3 B3 B3 B4 B4 B4 B4 B4 B4 B4 B4 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B7 B7 B7 B7 B7 B7 B7 B7*/#include STC32G.H //包含寄存器的定义 #include STDLIB.H //包含随机函数的声明 #include WS2812B.h //包含工程目录下的头文件相当于把头文件内容插入此处 #include MatrixKeyScan.h #include Timer0.hunsigned char KeyNum; //存储获得的键码值 unsigned char Mode; //游戏模式0显示流水灯及呼吸灯1显示游戏名“SNAKE”2显示难度的英文“DIFFICULTY”//3难度选择界面难度范围是1~54游戏模式5游戏结束全屏闪烁6显示英文“SCORE”//7循环滚动显示二位数得分8循环滚动显示作者和编程日期 unsigned char Mode0; //Mode0下的子模式0拖尾流水灯显示数据传输顺序1六种颜色的从左到右的拖尾流水灯2六种颜色的呼吸灯 unsigned char MoveFlag; //移动蛇身的标志1移动0不移动 unsigned char NowDirection1; //蛇头移动的方向1向右2向上3向左4向下游戏开始时默认向右移动此处可以不赋初值 unsigned char LastDirection1; //蛇头上一次移动的方向1向右2向上3向左4向下游戏开始时默认向右移动此处可以不赋初值 unsigned char Length2; //蛇的长度初始值为2此处可以不赋初值因为每次游戏开始前会重新赋值一次 unsigned char Head1; //保存整条蛇的数据的数组SnakeBody共64个数据数据索引为0~63中蛇头对应的数据的索引蛇的初始长度为2//开始时只用了两个数据数组的第1个数据和第2个数据蛇头对应的是第2个数据索引为1Head的范围0~63 unsigned char GameOverFlag; //游戏结束的标志1游戏结束0游戏未结束 unsigned char FlashFlag; //闪烁的标志1不显示0显示 unsigned char Food; //保存创造出来的食物的位置高四位0~7对应1~8列从左到右低四位0~7对应1~8行从上到下 unsigned int Offset1; //偏移量用来控制汉字或数字向左滚动显示切换模式后清零 unsigned int Offset2; //偏移量用来控制难度选择界面对应的数字上下滚动显示切换模式后不清零 unsigned char RollFlag; //滚动的标志1滚动0不滚动 unsigned char RollUpFlag; //难度选择界面数字向上滚动的标志1滚动0不滚动 unsigned char RollDownFlag; //难度选择界面数字向下滚动的标志1滚动0不滚动 unsigned char RollCount; //上下滚动的计次 unsigned char ExecuteOnceFlag; //各模式中切换到该模式后切换为其他模式前只执行一次的标志1执行0不执行 unsigned int SnakeMoveSpeed1000; //控制蛇移动的速度值越小速度越快 unsigned int T0Count0,T0Count1,T0Count2,T0Count3,T0Count4,T0Count5; //定时器计数的变量 unsigned char PauseFlag; //暂停的标志1暂停0不暂停 unsigned char SnakeBody[64]; //点阵屏是8*864个像素需要用64个数据记录蛇身的数据 unsigned char SnakeBuffer[8]; //显示缓存一个字节对应8个点屏幕总共64个点所以需要8个字节//阴码亮点为1逐列式取模高位在下//此数组用来保存点阵屏哪些点亮哪些点不亮 unsigned char Breath1; //用来实现呼吸灯的效果 unsigned char BreathInOrOut1; //用来控制呼吸灯变亮还是变暗 unsigned char BreathFlag; //呼吸灯改变亮度的标志定时器中每隔一段时间将此标志置1 unsigned char BreathCount; //用来使呼吸灯熄灭后的时间长一点 unsigned char BreathColor; //控制呼吸灯显示的颜色 unsigned char ExecuteOnceFlag0; //子模式中只执行一次的标志1执行0不执行unsigned char Score[]{ //用来滚动显示得分 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 0x00,0x00,0x00,0x00,0x00,0x00, //游戏结束后将蛇身长度Length的十位的数字字模写入到这一行 0x00,0x00,0x00,0x00,0x00,0x00, //游戏结束后将蛇身长度Length的个位的数字字模写入到这一行 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 };unsigned char code FlowingWaterLight1[]{ //流水灯1拖尾 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,191,0,0,127,0,0,95,0,0,63,0,0,47,0,0,31,0,0,23,0, //红 0,15,0,0,11,0,0,7,0,0,5,0,0,3,0,0,2,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,191,0,0,127,0,0,95,0,0,63,0,0,47,0,0,31,0,0,23, //绿 0,0,15,0,0,11,0,0,7,0,0,5,0,0,3,0,0,2,0,0,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,191,0,0,127,0,0,95,0,0,63,0,0,47,0,0,31,0,0,23,0,0, //蓝 15,0,0,11,0,0,7,0,0,5,0,0,3,0,0,2,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,191,191,0,127,127,0,95,95,0,63,63,0,47,47,0,31,31,0,23,23, //黄 0,15,15,0,11,11,0,7,7,0,5,5,0,3,3,0,2,2,0,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,191,191,0,127,127,0,95,95,0,63,63,0,47,47,0,31,31,0,23,23,0, //紫 15,15,0,11,11,0,7,7,0,5,5,0,3,3,0,2,2,0,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,191,0,191,127,0,127,95,0,95,63,0,63,47,0,47,31,0,31,23,0,23, //青 15,0,15,11,0,11,7,0,7,5,0,5,3,0,3,2,0,2,1,0,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, };unsigned char code FlowingWaterLight2[]{ //流水灯2拖尾 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0, //红 0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0, 0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0, 0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0, 0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0, 0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0, 0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0, 0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255, //绿 0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127, 0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63, 0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31, 0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15, 0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7, 0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3, 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0, //蓝 127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0,127,0,0, 63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0,63,0,0, 31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0,31,0,0, 15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0,15,0,0, 7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0,7,0,0, 3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0, 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255, //黄 0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127, 0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63, 0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31, 0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15, 0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7, 0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3, 0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0, //紫 127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0, 63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0, 31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0, 15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0, 7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0, 3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0, 1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255, //青 127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127, 63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63,63,0,63, 31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31,31,0,31, 15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15,15,0,15, 7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7,7,0,7, 3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3,3,0,3, 1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, };//取模要求阴码亮点为1逐列式取模高位在下 //点阵屏摆放方向不同取模要求也不同很多函数也需要修改 unsigned char code Table1[]{ //“SNAKE” 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 0x00,0x08,0x14,0x22,0x49,0x14,0x22,0x41, // 宽8高8 0x00,0x46,0x49,0x49,0x49,0x31, // S 51 宽6高8 0x00,0x7F,0x04,0x08,0x10,0x7F, // N 46 0x00,0x7C,0x12,0x11,0x12,0x7C, // A 33 0x00,0x7F,0x08,0x14,0x22,0x41, // K 43 0x00,0x7F,0x49,0x49,0x49,0x41, // E 37 0x00,0x41,0x22,0x14,0x49,0x22,0x14,0x08, // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 }; unsigned char code Table2[]{ //“DIFFICULTY”宽6高8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 0x00,0x7F,0x41,0x41,0x22,0x1C, // D 36 0x00,0x00,0x41,0x7F,0x41,0x00, // I 41 0x00,0x7F,0x09,0x09,0x09,0x01, // F 38 0x00,0x7F,0x09,0x09,0x09,0x01, // F 38 0x00,0x00,0x41,0x7F,0x41,0x00, // I 41 0x00,0x3E,0x41,0x41,0x41,0x22, // C 35 0x00,0x3F,0x40,0x40,0x40,0x3F, // U 53 0x00,0x7F,0x40,0x40,0x40,0x40, // L 44 0x00,0x01,0x01,0x7F,0x01,0x01, // T 52 0x00,0x07,0x08,0x70,0x08,0x07, // Y 57 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 0x00,0x00,0x00,0x42,0x7F,0x40,0x00,0x00, // 1 17 如果不按按键跳过则在显示“1”后自动切换到下一个模式 }; unsigned char code Table3[]{ //“123451”宽8高8 0x00,0x00,0x00,0x42,0x7F,0x40,0x00,0x00, // 1 17 0x00,0x00,0x42,0x61,0x51,0x49,0x46,0x00, // 2 18 0x00,0x00,0x21,0x41,0x45,0x4B,0x31,0x00, // 3 19 0x00,0x00,0x18,0x14,0x12,0x7F,0x10,0x00, // 4 20 0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00, // 5 21 0x00,0x00,0x00,0x42,0x7F,0x40,0x00,0x00, // 1 17 }; unsigned char code Table4[]{ //“SCORE”宽6高8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 0x00,0x46,0x49,0x49,0x49,0x31, // S 51 0x00,0x3E,0x41,0x41,0x41,0x22, // C 35 0x00,0x3E,0x41,0x41,0x41,0x3E, // O 47 0x00,0x7F,0x09,0x19,0x29,0x46, // R 50 0x00,0x7F,0x49,0x49,0x49,0x41, // E 37 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 }; unsigned char code Table5[]{ //“0~9”宽6高8 0x00,0x3E,0x51,0x49,0x45,0x3E, // 0 16 0x00,0x00,0x42,0x7F,0x40,0x00, // 1 17 0x00,0x42,0x61,0x51,0x49,0x46, // 2 18 0x00,0x21,0x41,0x45,0x4B,0x31, // 3 19 0x00,0x18,0x14,0x12,0x7F,0x10, // 4 20 0x00,0x27,0x45,0x45,0x45,0x39, // 5 21 0x00,0x3C,0x4A,0x49,0x49,0x30, // 6 22 0x00,0x01,0x71,0x09,0x05,0x03, // 7 23 0x00,0x36,0x49,0x49,0x49,0x36, // 8 24 0x00,0x06,0x49,0x49,0x29,0x1E, // 9 25 }; unsigned char code Table6[]{ //“by gantengsheng at 20241225”宽6高8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 0x00,0x7F,0x48,0x44,0x44,0x38, // b 66 0x00,0x1C,0xA0,0xA0,0xA0,0x7C, // y 89 0x00,0x00,0x00,0x00,0x00,0x00, // 0 0x00,0x18,0xA4,0xA4,0xA4,0x7C, // g 71 0x00,0x20,0x54,0x54,0x54,0x78, // a 65 0x00,0x7C,0x08,0x04,0x04,0x78, // n 78 0x00,0x04,0x3F,0x44,0x40,0x20, // t 84 0x00,0x38,0x54,0x54,0x54,0x18, // e 69 0x00,0x7C,0x08,0x04,0x04,0x78, // n 78 0x00,0x18,0xA4,0xA4,0xA4,0x7C, // g 71 0x00,0x48,0x54,0x54,0x54,0x20, // s 83 0x00,0x7F,0x08,0x04,0x04,0x78, // h 72 0x00,0x38,0x54,0x54,0x54,0x18, // e 69 0x00,0x7C,0x08,0x04,0x04,0x78, // n 78 0x00,0x18,0xA4,0xA4,0xA4,0x7C, // g 71 0x00,0x00,0x00,0x00,0x00,0x00, // 0 0x00,0x20,0x54,0x54,0x54,0x78, // a 65 0x00,0x04,0x3F,0x44,0x40,0x20, // t 84 0x00,0x00,0x00,0x00,0x00,0x00, // 0 0x00,0x42,0x61,0x51,0x49,0x46, // 2 18 0x00,0x3E,0x51,0x49,0x45,0x3E, // 0 16 0x00,0x42,0x61,0x51,0x49,0x46, // 2 18 0x00,0x18,0x14,0x12,0x7F,0x10, // 4 20 0x00,0x00,0x42,0x7F,0x40,0x00, // 1 17 0x00,0x42,0x61,0x51,0x49,0x46, // 2 18 0x00,0x42,0x61,0x51,0x49,0x46, // 2 18 0x00,0x27,0x45,0x45,0x45,0x39, // 5 21 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //无显示 };/*** brief 创造出一个随机位置的食物* param 无* retval 创造出的食物位置的数据高四位0~7对应1~8列从左到右低四位0~7对应1~8行从上到下*/ unsigned char CreateFood(void) {unsigned char FoodTemp;unsigned char i,j,m,n;mrand()%8; //产生一个0~7的随机数nrand()%8; //产生一个0~7的随机数for(i0;i8;i) //产生一个随机位置判断该位置是否是蛇身{ //如果不是就返回该位置所对应的数据如果是蛇身的位置则从该点向周围寻找不是蛇身的空位置for(j0;j8;j){if( ( SnakeBuffer[(mi)%8] (0x01((nj)%8)) ) 0 ){FoodTemp(mi)%8*16(nj)%8;break; //找到了空位置就退出循环}}}return FoodTemp; }/*** brief 改变缓存数组SnakeBuffer的数据* param Position 要设置的位置高四位0~7对应1~8列从左到右低四位0~7对应1~8行从上到下* param State 要修改成的状态范围0~10对应的那个Bit置01对应的那个Bit置1* retval 无*/ void ChangeSnakeBuffer(unsigned char Position,unsigned char State) {if(State){SnakeBuffer[Position/16] | (0x01(Position%16));}else{SnakeBuffer[Position/16] ~(0x01(Position%16));} }/*** brief 控制蛇的移动* param 无* retval 无*/ void MoveSnake(void) {if(NowDirection1) //如果向右移动{//移动前判断一下移动后是否撞墙如果是则游戏结束游戏结束的标志置1if(SnakeBody[Head]/167){GameOverFlag1;}//(Head1)%64取余的目的是为了防止越界SnakeBody数组的索引范围是0~63索引为63后再加1就越界了//SnakeBody数组中索引为(Head1)%64的数据准蛇头等于索引为Head的数据现蛇头加16高四位加1即蛇头移动到了右边这一列else{SnakeBody[(Head1)%64]SnakeBody[Head]16;}}if(NowDirection2) //如果向上移动{if(SnakeBody[Head]%160){GameOverFlag1;}//SnakeBody数组中索引为(Head1)%64的数据准蛇头等于索引为Head的数据现蛇头减1低四位减1即蛇头移动到了上边这一行else{SnakeBody[(Head1)%64]SnakeBody[Head]-1;}}if(NowDirection3) //如果向左移动{if(SnakeBody[Head]/160){GameOverFlag1;}//SnakeBody数组中索引为(Head1)%64的数据准蛇头等于索引为Head的数据现蛇头减16高四位减1即蛇头移动到了左边这一列else{SnakeBody[(Head1)%64]SnakeBody[Head]-16;}}if(NowDirection4) //如果向下移动{if(SnakeBody[Head]%167){GameOverFlag1;}//SnakeBody数组中索引为(Head1)%64的数据准蛇头等于索引为Head的数据现蛇头加1低四位减1即蛇头移动到了下边这一行else{SnakeBody[(Head1)%64]SnakeBody[Head]1;}}Head; //SnakeBody数组中蛇头对应的数据的索引加1Head%64; //蛇头变量Head的范围是0~63if(GameOverFlag0) //如果没撞墙{if(SnakeBody[Head]Food) //判断蛇头移动后的位置是否是食物所在的位置{ //如果是Length; //蛇身长度加1ColorStyle; //蛇身和食物均切换为下一种颜色ColorStyle%6; //预设了6种颜色红、绿、蓝、黄、紫、青ChangeSnakeBuffer(Food,1); //更新缓存数组SnakeBody的数据if(Length64) //如果蛇身长度没有达到最大值64{FoodCreateFood(); //重新创造一个食物}else //如果蛇身长度达到了最大值64{GameOverFlag1; //游戏结束}FlashFlag0; //创造出新的食物时食物暂不闪烁T0Count40; //定时器T0Count4重新计数}else if( SnakeBuffer[SnakeBody[Head]/16] (0x01(SnakeBody[Head]%16)) ){ //如果蛇头移动后的位置不是食物且撞在蛇身上则游戏结束GameOverFlag1; //游戏结束的标志置1}else //如果蛇头移动后的位置不是食物也不是撞墙也不是撞到蛇身的话{ChangeSnakeBuffer(SnakeBody[Head],1);ChangeSnakeBuffer(SnakeBody[(Head64-Length)%64],0);}}}/*** brief IO口初始化全部设置为上拉模式* param 无* retval 无*/ void GPIO_Init(void) {P0M10;P0M00;P1M10;P1M00;P2M10;P2M00;P3M10;P3M00;P4M10;P4M00;P5M10;P5M00;P6M10;P6M00;P7M10;P7M00; }void main() {unsigned char i;WTST0; //不加这句则延时不准确GPIO_Init(); //IO口初始化Timer0_Init(); //定时器初始化ExecuteOnceFlag1;while(1){KeyNumKey(); //获取键码值if(KeyNum) //如果有按键按下{srand(TL0); //以定时器0的低八位数据作为随机数的种子用来产生真随机的数据if(Mode8) //如果是显示作者和编程日期的界面{if(KeyNum44) //如果按下K12松手瞬间{Mode3; //返回难度选择界面ExecuteOnceFlag1; //各模式只执行一次代码的标志置1}}if(Mode7) //如果是滚动显示得分的界面{if(KeyNum41) //如果按下K9松手瞬间{Mode8; //切换到显示作者和编程日期的界面ExecuteOnceFlag1;}if(KeyNum44) //如果按下K12松手瞬间{Mode3; //返回难度选择界面ExecuteOnceFlag1;}}if(Mode6) //如果是滚动显示英文“SCORE”的界面{if(KeyNum!9 KeyNum!25 KeyNum!41 KeyNum!12 KeyNum!28 KeyNum!44){ //如果按下K9和K12以外的按键Mode7; //跳过英文显示切换到滚动显示得分界面ExecuteOnceFlag1;}}if(Mode5) //如果是游戏结束全屏闪烁界面{if(KeyNum48) //如果按下K16松手瞬间{Mode6; //切换到滚动显示英文“SCORE”的界面ExecuteOnceFlag1;}}if(Mode4) //如果是游戏进行中{if(KeyNum48) //按下K16暂停或继续松手瞬间{PauseFlag!PauseFlag;if(PauseFlag0){T0Count30;}}if(PauseFlag0) //如果不是暂停{ //按下瞬间、长按、松手瞬间都进行检测这样控制方向更有效防止按键没检测出来导致没能改变方向if((KeyNum13 || KeyNum29 || KeyNum45) LastDirection!1){ //如果按了“左”键且蛇头原来的移动方向不是向右NowDirection3; //则方向蛇头方向改为向左}if((KeyNum10 || KeyNum26 || KeyNum42) LastDirection!4){ //如果按了“上”键且蛇头原来的移动方向不是向下NowDirection2; //则方向蛇头方向改为向上}if((KeyNum14 || KeyNum30 || KeyNum46) LastDirection!2){ //如果按了“下”键且蛇头原来的移动方向不是向上NowDirection4; //则方向蛇头方向改为向左}if((KeyNum15 || KeyNum31 || KeyNum47) LastDirection!3){ //如果按了“右”键且蛇头原来的移动方向不是向左NowDirection1; //则方向蛇头方向改为向左}}}if(Mode3) //如果是难度选择界面{if(KeyNum42) //如果按了“上”键K10松手瞬间{RollUpFlag1; //数字向上滚动的标志置1}if(KeyNum46) //如果按了“下”键K14松手瞬间{RollDownFlag1; //数字向下滚动的标志置1}if(KeyNum48) //如果按了开始键K16松手瞬间{Mode4; //切换到游戏模式ExecuteOnceFlag1;}}if(Mode2) //如果是显示英文“DIFFICULTY”的界面{if(KeyNum33 KeyNum48) //如果按下任意按键松手瞬间{Mode3; //切换到难度选择界面ExecuteOnceFlag1;}}if(Mode1) //如果是显示游戏名“SNAKE”的界面{if(KeyNum33 KeyNum48) //如果按下任意按键松手瞬间{Mode2; //切换到英文“DIFFICULTY”的显示界面ExecuteOnceFlag1;}}if(Mode0) //如果是显示流水灯界面{if(KeyNum42) //如果按了“上”键K10松手瞬间{Mode0; //切换子模式Mode0%3; //共有三个子模式ExecuteOnceFlag01;}if(KeyNum46) //如果按了“下”键K14松手瞬间{if(Mode00){Mode02;}else{Mode0--;}ExecuteOnceFlag01;}if(KeyNum33 KeyNum48 KeyNum!42 KeyNum!46){ //如果按了K10和K14以外的按键松手瞬间切换为显示游戏名“SNAKE”的模式Mode1; //切换到游戏模式ExecuteOnceFlag1;}}}if(Mode0) //如果是显示彩色流水灯的界面{if(ExecuteOnceFlag) //切换模式前此if的内容只执行一次{ExecuteOnceFlag0;Offset10; //偏移量清零for(i0;i8;i) //呼吸灯需要用到数组SnakeBuffer{SnakeBuffer[i]0xFF;}}if(Mode00) //拖尾流水灯六种颜色红、绿、蓝、黄、紫、青显示数据传输顺序{if(ExecuteOnceFlag0) //切换到Mode00后切换为其他模式前此if的代码只执行一次{ExecuteOnceFlag00;Offset10; //偏移量清零}if(RollFlag){RollFlag0;for(i0;i192;i) //通过查表的方法显示流水灯{WS2812B_Buffer[i]FlowingWaterLight1[191-i3*Offset1];}WS2812B_UpdateDisplay(); //改变缓存WS2812B_Buffer后更新到屏幕的显示Offset1;Offset1%400;}}if(Mode01) //显示从左到右的六种颜色红、绿、蓝、黄、紫、青的拖尾流水灯{if(ExecuteOnceFlag0){ExecuteOnceFlag00;Offset10;} if(RollFlag){RollFlag0;for(i0;i192;i) //通过查表的方法显示流水灯{WS2812B_Buffer[i]FlowingWaterLight2[191-i24*Offset1];}WS2812B_UpdateDisplay();Offset1;Offset1%96;}}if(Mode02) //六种颜色红、绿、蓝、黄、紫、青的呼吸灯{if(ExecuteOnceFlag0){ExecuteOnceFlag00;Breath1;BreathInOrOut1;BreathColor0;}if(BreathFlag){BreathFlag0;if(Breath0 BreathCount15){BreathCount;PauseFlag1;} //完全熄灭后延时一小段时间else{BreathCount0;PauseFlag0;}if(PauseFlag0){if(Breath0){BreathInOrOut1;BreathColor;BreathColor%6;}if(Breath255){BreathInOrOut0;} //Breath的值决定亮度if(BreathInOrOut){Breath;} //变亮else{Breath--;} //变暗switch(BreathColor){case 0:WS2812B_MoveLeft(SnakeBuffer,Breath,0,0,0);break; //红case 1:WS2812B_MoveLeft(SnakeBuffer,0,Breath,0,0);break; //绿case 2:WS2812B_MoveLeft(SnakeBuffer,0,0,Breath,0);break; //蓝case 3:WS2812B_MoveLeft(SnakeBuffer,(unsigned char)(Breath/2),(unsigned char)(Breath/2),0,0);break; //黄case 4:WS2812B_MoveLeft(SnakeBuffer,(unsigned char)(Breath/2),0,(unsigned char)(Breath/2),0);break; //紫case 5:WS2812B_MoveLeft(SnakeBuffer,0,(unsigned char)(Breath/2),(unsigned char)(Breath/2),0);break; //青default:break;}WS2812B_UpdateDisplay();}}}}if(Mode1) //如果是显示游戏名称“SNAKE”的界面{if(ExecuteOnceFlag){ExecuteOnceFlag0;Offset10;}if(RollFlag){RollFlag0;WS2812B_MoveLeft(Table1,16,0,0,Offset1); //红色WS2812B_UpdateDisplay();Offset1;Offset1%54; //循环滚动显示}}if(Mode2) //如果是显示英文“DIFFICULTY”的界面{if(ExecuteOnceFlag){ExecuteOnceFlag0;Offset10;}if(RollFlag) //只向左滚动显示一次不循环滚动显示{if(Offset168) //只向左滚动显示一次不循环滚动显示{RollFlag0;WS2812B_MoveLeft(Table2,0,16,0,Offset1); //绿色WS2812B_UpdateDisplay();Offset1;}else if(Offset176) //只向左滚动显示一次不循环滚动显示{RollFlag0;WS2812B_MoveLeft(Table2,0,0,16,Offset1); //蓝色WS2812B_UpdateDisplay();Offset1;}else //显示数字“1”之后自动切换到难度选择界面{Mode3;ExecuteOnceFlag1;}}}if(Mode3) //如果是难度选择界面{if(ExecuteOnceFlag){ExecuteOnceFlag0;WS2812B_MoveUp(Table3,0,0,16,Offset2); //蓝色WS2812B_UpdateDisplay();}if(RollFlag RollUpFlag) //如果滚动标志为1且向上滚动的标志也为1{RollFlag0;Offset2; //向上移动一个像素Offset2%40; //越界清零总共5个数字每个数字的高度是8所以是5*840WS2812B_MoveUp(Table3,0,0,16,Offset2);WS2812B_UpdateDisplay();RollCount;if(RollCount8) //移动了8个像素后停止移动{RollCount0;RollUpFlag0;Offset2(Offset2/8)*8; //防止移动到一半的时候按下“上”或“下”按键导致数字没有在点阵屏中间//Offset2的值必须是8的整数倍switch(Offset2/8){case 0:SnakeMoveSpeed1000;break; //难度1,1s移动1次case 1:SnakeMoveSpeed750;break; //难度2,0.75s移动1次case 2:SnakeMoveSpeed500;break; //难度3,0.5s移动1次case 3:SnakeMoveSpeed250;break; //难度4,0.25s移动1次case 4:SnakeMoveSpeed120;break; //难度5,0.12s移动1次default:break;}}}if(RollFlag RollDownFlag) //如果滚动标志为1且向下滚动的标志也为1{RollFlag0;if(Offset20){Offset240;}Offset2--;WS2812B_MoveUp(Table3,0,0,16,Offset2);WS2812B_UpdateDisplay();RollCount;if(RollCount8){RollCount0;RollDownFlag0;Offset2(Offset2/8)*8;switch(Offset2/8){case 0:SnakeMoveSpeed1000;break;case 1:SnakeMoveSpeed750;break;case 2:SnakeMoveSpeed500;break;case 3:SnakeMoveSpeed250;break;case 4:SnakeMoveSpeed120;break;default:break;}}}}if(Mode4) //如果是游戏进行模式{if(ExecuteOnceFlag) //游戏初始化{ExecuteOnceFlag0;WS2812B_Clear(); //清除WS2812B显示缓存ColorStylerand()%6; //从预设的六种颜色中随机选一种作为蛇的起始颜色GameOverFlag0; //游戏结束标志清零PauseFlag0; //游戏暂停标志清零NowDirection1; //蛇头默认向右移动LastDirection1; //上一次蛇头默认向右移动Length2; //蛇的初始长度为2Head1; //蛇头对应数组中的第2个数据索引为1for(i0;i8;i){SnakeBuffer[i]0;} //SnakeBuffer显示缓存全部清零SnakeBody[0]1*161; //蛇身数据全部清零后写入蛇身初始的两个数据SnakeBody[1]2*161;ChangeSnakeBuffer(SnakeBody[0],1);ChangeSnakeBuffer(SnakeBody[1],1);WS2812B_SetBuf(SnakeBody[0],MyColor[ColorStyle%6*3],MyColor[ColorStyle%6*31],MyColor[ColorStyle%6*32]);WS2812B_SetBuf(SnakeBody[1],MyColor[ColorStyle%6*3],MyColor[ColorStyle%6*31],MyColor[ColorStyle%6*32]);FoodCreateFood(); //开始游戏前先创造出一个食物WS2812B_SetBuf(Food,MyColor[(ColorStyle1)%6*3],MyColor[(ColorStyle1)%6*31],MyColor[(ColorStyle1)%6*32]);WS2812B_UpdateDisplay(); //更改缓存后更新屏幕的显示MoveFlag0; //蛇移动的标志清零T0Count30; //定时器计数变量T0Count3清零重新计数}if(GameOverFlag0) //如果游戏没结束{if(MoveFlag PauseFlag0){MoveFlag0; //移动标志清零MoveSnake(); //移动一次LastDirectionNowDirection; //保存上一次移动的方向用于按键的判断蛇不能往后移动WS2812B_MoveLeft(SnakeBuffer,MyColor[ColorStyle%6*3],MyColor[ColorStyle%6*31],MyColor[ColorStyle%6*32],0);}if(PauseFlag) //如果暂停了{ //(ColorStyle1)%6食物的颜色是预设模式中蛇的颜色的下一种颜色预设颜色红绿蓝黄紫青WS2812B_SetBuf(Food,MyColor[(ColorStyle1)%6*3],MyColor[(ColorStyle1)%6*31],MyColor[(ColorStyle1)%6*32]); //食物不闪烁一直显示} else if(FlashFlag) //如果不暂停且闪烁标志为1{WS2812B_SetBuf(Food,0,0,0); //不显示食物}else //如果不暂停且闪烁标志为0{WS2812B_SetBuf(Food,MyColor[(ColorStyle1)%6*3],MyColor[(ColorStyle1)%6*31],MyColor[(ColorStyle1)%6*32]); //显示食物}WS2812B_UpdateDisplay();}else //如果游戏结束{Mode5; //切换到全屏闪烁模式ExecuteOnceFlag1; } }if(Mode5) //全屏闪烁{if(FlashFlag) //不显示{WS2812B_Clear();WS2812B_UpdateDisplay();}else //显示{WS2812B_MoveLeft(SnakeBuffer,MyColor[ColorStyle%6*3],MyColor[ColorStyle%6*31],MyColor[ColorStyle%6*32],0);if(Length64) //防止长度为64时有一个点的颜色食物的颜色跟其它的不一样{WS2812B_SetBuf(Food,MyColor[(ColorStyle1)%6*3],MyColor[(ColorStyle1)%6*31],MyColor[(ColorStyle1)%6*32]);}WS2812B_UpdateDisplay(); }}if(Mode6) //如果是显示英文“SCROE”的界面{if(ExecuteOnceFlag){ExecuteOnceFlag0;Offset10;}if(RollFlag){if(Offset138) //只滚动显示一次英文“SCORE”{RollFlag0;WS2812B_MoveLeft(Table4,8,8,0,Offset1); //黄色WS2812B_UpdateDisplay();Offset1;}else //滚动结束后自动切换到循环显示得分的模式{Mode7;ExecuteOnceFlag1;} }}if(Mode7) //如果是滚动显示得分界面{if(ExecuteOnceFlag){ExecuteOnceFlag0;for(i0;i6;i) //将得分即蛇身的长度的十位和个位的字模写入数组ScoreShow中{Score[8i]Table5[(Length/10)*6i];}for(i0;i6;i){Score[14i]Table5[(Length%10)*6i];}Offset10;}if(RollFlag) //如果滚动的标志为1{RollFlag0;WS2812B_MoveLeft(Score,8,0,8,Offset1); //紫色WS2812B_UpdateDisplay();Offset1;Offset1%20; //循环滚动}}if(Mode8) //如果是显示作者和编程日期的界面{if(ExecuteOnceFlag){ExecuteOnceFlag0;Offset10;}if(RollFlag) //如果滚动的标志为1{RollFlag0;WS2812B_MoveLeft(Table6,0,8,8,Offset1); //青色WS2812B_UpdateDisplay();Offset1;Offset1%170; //循环滚动}}} }void Timer0_Routine() interrupt 1 //定时器0中断函数 {TL00x80; //设置定时初值定时2ms1T24.000MHzTH00x44; //设置定时初值定时2ms1T24.000MHzT0Count1;T0Count2;if(PauseFlag0){T0Count3;} //不暂停时T0Count3才计数else{T0Count30;} //暂停后继续游戏时T0Count3重新计数T0Count4;T0Count5;if(T0Count110) //每隔20ms检测一次按键{T0Count10;Key_Tick();}if(T0Count250) //每隔100ms滚动一次{T0Count20;RollFlag1;}if(T0Count3SnakeMoveSpeed/2) //控制蛇的移动速度{T0Count30;MoveFlag1;}if(T0Count4125) //每隔250ms改变FlashFlag的值{T0Count40;FlashFlag!FlashFlag;}if(T0Count53) //每隔6ms呼吸灯的亮度改变一次{T0Count50;BreathFlag1;} }总结 用彩色点阵屏玩《贪吃蛇》更有趣了可以显示不同的颜色弄出很多花样。
文章转载自:
http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn
http://www.morning.qrqdr.cn.gov.cn.qrqdr.cn
http://www.morning.nnjq.cn.gov.cn.nnjq.cn
http://www.morning.bydpr.cn.gov.cn.bydpr.cn
http://www.morning.rwfp.cn.gov.cn.rwfp.cn
http://www.morning.0dirty.cn.gov.cn.0dirty.cn
http://www.morning.nlygm.cn.gov.cn.nlygm.cn
http://www.morning.zkgpg.cn.gov.cn.zkgpg.cn
http://www.morning.bpptt.cn.gov.cn.bpptt.cn
http://www.morning.xtrnx.cn.gov.cn.xtrnx.cn
http://www.morning.gbfuy28.cn.gov.cn.gbfuy28.cn
http://www.morning.hsrch.cn.gov.cn.hsrch.cn
http://www.morning.fcrw.cn.gov.cn.fcrw.cn
http://www.morning.mznqz.cn.gov.cn.mznqz.cn
http://www.morning.gqbks.cn.gov.cn.gqbks.cn
http://www.morning.fhxrb.cn.gov.cn.fhxrb.cn
http://www.morning.bdzps.cn.gov.cn.bdzps.cn
http://www.morning.hnzrl.cn.gov.cn.hnzrl.cn
http://www.morning.pggkr.cn.gov.cn.pggkr.cn
http://www.morning.xrrjb.cn.gov.cn.xrrjb.cn
http://www.morning.cbnxq.cn.gov.cn.cbnxq.cn
http://www.morning.bygyd.cn.gov.cn.bygyd.cn
http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn
http://www.morning.qjfkz.cn.gov.cn.qjfkz.cn
http://www.morning.npxcc.cn.gov.cn.npxcc.cn
http://www.morning.ftcrt.cn.gov.cn.ftcrt.cn
http://www.morning.gfhng.cn.gov.cn.gfhng.cn
http://www.morning.qmfhh.cn.gov.cn.qmfhh.cn
http://www.morning.plqsc.cn.gov.cn.plqsc.cn
http://www.morning.nkkr.cn.gov.cn.nkkr.cn
http://www.morning.sfswj.cn.gov.cn.sfswj.cn
http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn
http://www.morning.trbxt.cn.gov.cn.trbxt.cn
http://www.morning.cfynn.cn.gov.cn.cfynn.cn
http://www.morning.fpkdd.cn.gov.cn.fpkdd.cn
http://www.morning.xnltz.cn.gov.cn.xnltz.cn
http://www.morning.qjngk.cn.gov.cn.qjngk.cn
http://www.morning.xqcbz.cn.gov.cn.xqcbz.cn
http://www.morning.xdlwm.cn.gov.cn.xdlwm.cn
http://www.morning.jtfcd.cn.gov.cn.jtfcd.cn
http://www.morning.nfmlt.cn.gov.cn.nfmlt.cn
http://www.morning.ykbgs.cn.gov.cn.ykbgs.cn
http://www.morning.nzsdr.cn.gov.cn.nzsdr.cn
http://www.morning.ggmls.cn.gov.cn.ggmls.cn
http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn
http://www.morning.gbybx.cn.gov.cn.gbybx.cn
http://www.morning.rwtlj.cn.gov.cn.rwtlj.cn
http://www.morning.rdxnt.cn.gov.cn.rdxnt.cn
http://www.morning.lrflh.cn.gov.cn.lrflh.cn
http://www.morning.mqbdb.cn.gov.cn.mqbdb.cn
http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn
http://www.morning.ycwym.cn.gov.cn.ycwym.cn
http://www.morning.kcsx.cn.gov.cn.kcsx.cn
http://www.morning.xbckm.cn.gov.cn.xbckm.cn
http://www.morning.zhghd.cn.gov.cn.zhghd.cn
http://www.morning.ywpwg.cn.gov.cn.ywpwg.cn
http://www.morning.qnwyf.cn.gov.cn.qnwyf.cn
http://www.morning.nkllb.cn.gov.cn.nkllb.cn
http://www.morning.ryjqh.cn.gov.cn.ryjqh.cn
http://www.morning.yrnll.cn.gov.cn.yrnll.cn
http://www.morning.sgfnx.cn.gov.cn.sgfnx.cn
http://www.morning.yrpg.cn.gov.cn.yrpg.cn
http://www.morning.mhcft.cn.gov.cn.mhcft.cn
http://www.morning.bqyb.cn.gov.cn.bqyb.cn
http://www.morning.pwzzk.cn.gov.cn.pwzzk.cn
http://www.morning.kvzvoew.cn.gov.cn.kvzvoew.cn
http://www.morning.rdgb.cn.gov.cn.rdgb.cn
http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn
http://www.morning.rhph.cn.gov.cn.rhph.cn
http://www.morning.fmrd.cn.gov.cn.fmrd.cn
http://www.morning.lgsfb.cn.gov.cn.lgsfb.cn
http://www.morning.ntyks.cn.gov.cn.ntyks.cn
http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn
http://www.morning.mqgqf.cn.gov.cn.mqgqf.cn
http://www.morning.gmmxh.cn.gov.cn.gmmxh.cn
http://www.morning.dnls.cn.gov.cn.dnls.cn
http://www.morning.cljpz.cn.gov.cn.cljpz.cn
http://www.morning.stbhn.cn.gov.cn.stbhn.cn
http://www.morning.dkbgg.cn.gov.cn.dkbgg.cn
http://www.morning.yybcx.cn.gov.cn.yybcx.cn
http://www.tj-hxxt.cn/news/252780.html

相关文章:

  • 牡丹江建设行业协会网站团购网站管理系统
  • windows7PHP网站建设不知此网站枉做男人
  • 淄博外贸网站建设什么专业可以做网站编辑
  • 网站建设资金管理办法企业网站栏目结构
  • 南宁手机企业网站定制深圳网站公司建设
  • 免费做相册视频网站网站系统维护一个月正常吗
  • 个人网站介绍南宁网站建设搭建
  • 成都网站设计定制北京商场人气排名
  • 旅游网站开发的结论龙岩网站建设要多久
  • 宁波免费建站微信运营有前途吗
  • 南阳网站优化软件做服务网站发展背景
  • 西安网站建设报价phpcms手机网站模板
  • 一份完整的网站策划书闸北做网站公司
  • 个人网站用什么域名好盐城网站开发厂商
  • 现在做什么个人网站好课题组网站怎么做
  • 酷炫网站首页橱柜企业网站模板
  • 如何建自己网站电商网站开发技术
  • asp学习网站网站设计收费标准
  • 做外贸网站渠道网站推广的定义及方法
  • 河北沧州建设官方网站建筑公司企业章程
  • 大理市城乡建设局网站网站建设方案标准模板
  • 班级网站 建设模板山东省工程建设协会网站
  • 怎样开个人网站软件开发net教程免费
  • 从事网站美工建设外贸推广代理
  • 如何设计网站网站风格 颜色搭配
  • 关于网站建设的参考文献慈溪建设公司网站
  • 移动端网站设计规范手机做app的软件有哪些
  • 网站后台排版布局钦州网站建设哪家便宜
  • 电子商务网站建设期末试题及答案wordpress社交分享国内
  • 网站建设后台和前端静态网页生成