欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 用STC單片機DIY 3D立體數(shù)字滑塊推盤游戲 3d Puzzle 4x4x4 串口版 全球首發(fā)! [打印本頁]

作者: npn    時間: 2016-10-10 17:53
標題: 用STC單片機DIY 3D立體數(shù)字滑塊推盤游戲 3d Puzzle 4x4x4 串口版 全球首發(fā)!
用STC單片機DIY 3D立體數(shù)字滑塊推盤游戲 3d Puzzle 4x4x4 串口版 全球首發(fā)!
傳統(tǒng)的2D數(shù)字滑塊推盤現(xiàn)已有百年歷史,現(xiàn)3D立體數(shù)字推盤正式于2016年誕生!
由4個平面推盤組成,只有一層有空區(qū),其余的沒有。
平面移動方法與傳統(tǒng)推盤一致,立體移動方法是層之間進行移動。
可移植到數(shù)碼管進行顯示,共需要128個數(shù)碼管進行顯示,只用IO口驅(qū)動大量數(shù)碼管是不可能的,而且動態(tài)掃描亮度影響非常大,所以要用到74系列芯片或者其他LED數(shù)碼管驅(qū)動芯片進行驅(qū)動。
還原技巧以及算法比傳統(tǒng)的更加復雜,可能會難倒世界頂級拼圖還原高手!
3D數(shù)字推盤由于機械式設(shè)計非常復雜,采用單片機和數(shù)碼管和按鍵實現(xiàn)了電子式設(shè)計。
若發(fā)現(xiàn)建議意見以及BUG等問題請在下面回復,謝謝合作!
以下源碼用Keil4編譯后直接燒寫到單片機內(nèi)即可運行,根據(jù)晶振頻率修改串口位延時時間即可。


  1. #include "reg51.h"
  2. #include "intrins.h"
  3. sbit rxd=P3^0; //數(shù)據(jù)接收口
  4. sbit txd=P3^1; //數(shù)據(jù)發(fā)送口

  5. unsigned char l1[16]={ //推盤層1
  6. 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  7. };
  8. unsigned char l2[16]={ //推盤層2
  9. 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
  10. };
  11. unsigned char l3[16]={ //推盤層3
  12. 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47
  13. };
  14. unsigned char l4[16]={ //推盤層4
  15. 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
  16. };

  17. unsigned char code xyd[64] = { //拼圖板移動方向與0交換坐標數(shù)據(jù),請勿修改否則數(shù)字會無法正常移動。
  18. 0x04, 0x10, 0x01, 0x10, 0x05, 0x10, 0x02, 0x00, 0x06, 0x10, 0x03, 0x01, 0x07, 0x10, 0x10, 0x02,
  19. 0x08, 0x00, 0x05, 0x10, 0x09, 0x01, 0x06, 0x04, 0x0A, 0x02, 0x07, 0x05, 0x0B, 0x03, 0x10, 0x06,
  20. 0x0C, 0x04, 0x09, 0x10, 0x0D, 0x05, 0x0A, 0x08, 0x0E, 0x06, 0x0B, 0x09, 0x0F, 0x07, 0x10, 0x0A,
  21. 0x10, 0x08, 0x0D, 0x10, 0x10, 0x09, 0x0E, 0x0C, 0x10, 0x0A, 0x0F, 0x0D, 0x10, 0x0B, 0x10, 0x0E
  22. };

  23. sfr AUXR   = 0x8E; //定義AUXR寄存器
  24. sfr INT_CLKO = 0x8F; //定義下降沿中斷寄存器

  25. //------------------------軟串口驅(qū)動程序------------------------
  26. /*
  27. void init_uart(){ //初始化串口 使用硬件下降沿中斷必須初始化
  28.       AUXR |= 0x80;        //設(shè)置AUXR寄存器
  29.       INT_CLKO |= 0x40;           //開串口中斷 (允許串口接收數(shù)據(jù))
  30.        EA = 1;        //啟用I/O口外部中斷功能
  31. }
  32. */
  33. void delay_uart(){ //延時時間1除以波特率秒 1/9600秒
  34.     unsigned char a,b;
  35.     for(b=114;b>0;b--)
  36.         for(a=1;a>0;a--);
  37. }
  38. void txd_data(unsigned char i){  //發(fā)送數(shù)據(jù)
  39. unsigned char j=1;//控制移位
  40. unsigned char k=8;//控制循環(huán)次數(shù)
  41.   delay_uart();//延時時間
  42.   txd=0; //發(fā)送起始位,低電平
  43.   while(k--){ //下面循環(huán)8次
  44.   delay_uart();//延時時間
  45.   txd=(i&j)/j; //發(fā)送數(shù)據(jù)
  46.   j<<=1; //左移1位,發(fā)送下1位數(shù)據(jù)
  47.   }
  48.   delay_uart();//延時時間
  49.   txd=1;  //發(fā)送停止位
  50. }
  51. unsigned char rxd_data(){ //接收數(shù)據(jù)
  52. unsigned char j=1;//控制移位
  53. unsigned char k=8;//控制循環(huán)次數(shù)
  54. unsigned char d=0;//存放數(shù)據(jù)
  55.   while(rxd == 1); //等待起始位低電平
  56.   while(k--){//下面循環(huán)8次
  57.   delay_uart(); //延時時間
  58.   d|=(rxd*j); //存入數(shù)據(jù)
  59.   j<<=1;  //左移1位,接收下1位數(shù)據(jù)
  60.   }
  61.   delay_uart();//延時時間
  62.   if(rxd == 1){ //停止位為高電平
  63.   return d; //返回數(shù)據(jù)
  64.   } else {
  65.   return 0; //無效數(shù)據(jù) 返回0
  66.   }
  67. }
  68. void send_text(unsigned char *text){ //發(fā)送字符串
  69. for(;*text!=0;text++){  //遇到停止符0結(jié)束發(fā)送
  70.   txd_data(*text); //發(fā)送數(shù)據(jù)
  71. }
  72. }
  73. void send_enter(){ //發(fā)送換行
  74.   txd_data(0x0D);
  75.   txd_data(0x0A);
  76. }
  77. //------------------------3D推盤驅(qū)動程序------------------------
  78. //0的坐標:0~15 移動方向:1234 表示上下左右
  79. unsigned char get_adj_coo(unsigned char zero_adj,unsigned char mov_dir){ //獲取相鄰坐標
  80. return xyd[zero_adj*4+mov_dir-1];
  81. }
  82. unsigned char get_0_lay(){ //獲取0所在的層數(shù) 返回1~4
  83. unsigned char add=0;
  84. for(add=0;add<16;add++){
  85.   if(l1[add] == 0){
  86.    return 1;
  87.    }
  88.   if(l2[add] == 0){
  89.    return 2;
  90.    }
  91.   if(l3[add] == 0){
  92.    return 3;
  93.    }
  94.   if(l4[add] == 0){
  95.    return 4;
  96.    }
  97. }
  98. return 0;
  99. }
  100. unsigned char get_0_pla(){ //獲取0的平面坐標 返回0~15
  101. unsigned char lay=0;
  102. unsigned char add=0; //當前掃描的坐標
  103. lay=get_0_lay(); //獲取0所在的層數(shù)
  104. for(add=0;add<16;add++){
  105.   if(lay == 1){
  106.    if(l1[add] == 0){
  107.    return add;
  108.    }
  109.   }
  110.   if(lay == 2){
  111.    if(l2[add] == 0){
  112.    return add;
  113.    }
  114.   }
  115.   if(lay == 3){
  116.    if(l3[add] == 0){
  117.    return add;
  118.    }
  119.   }
  120.   if(lay == 4){
  121.    if(l4[add] == 0){
  122.    return add;
  123.    }
  124.   }


  125. }
  126. return 0;
  127. }
  128. //平面交換數(shù)字位置 層數(shù):1~4 坐標A 坐標B
  129. void pec(unsigned char s,unsigned char a,unsigned char b){
  130. unsigned char ad=0; //坐標A數(shù)據(jù)
  131. unsigned char bd=0; //坐標B數(shù)據(jù)
  132. if(a > 15 || b > 15) {
  133.   return;
  134.   }
  135.   if(s == 1){ad=l1[a];bd=l1[b];l1[a]=bd;l1[b]=ad;return;}
  136.   if(s == 2){ad=l2[a];bd=l2[b];l2[a]=bd;l2[b]=ad;return;}
  137.   if(s == 3){ad=l3[a];bd=l3[b];l3[a]=bd;l3[b]=ad;return;}
  138.   if(s == 4){ad=l4[a];bd=l4[b];l4[a]=bd;l4[b]=ad;return;}
  139. return;
  140. }
  141. void up_mov(){ //拼圖上移
  142. unsigned char lay0=0;
  143. unsigned char pla0=0;
  144. unsigned char adj=0;
  145. lay0=get_0_lay(); //獲取0的坐標所在層數(shù)
  146. pla0=get_0_pla(); //獲取0的平面坐標
  147. adj=get_adj_coo(pla0,1); //獲取相鄰坐標
  148. pec(lay0,pla0,adj); //平面交換數(shù)字位置

  149. }
  150. void down_mov(){ //拼圖下移
  151. unsigned char lay0=0;
  152. unsigned char pla0=0;
  153. unsigned char adj=0;
  154. lay0=get_0_lay(); //獲取0的坐標所在層數(shù)
  155. pla0=get_0_pla(); //獲取0的平面坐標
  156. adj=get_adj_coo(pla0,2); //獲取相鄰坐標
  157. pec(lay0,pla0,adj); //平面交換數(shù)字位置

  158. }
  159. void left_mov(){ //拼圖左移
  160. unsigned char lay0=0;
  161. unsigned char pla0=0;
  162. unsigned char adj=0;
  163. lay0=get_0_lay(); //獲取0的坐標所在層數(shù)
  164. pla0=get_0_pla(); //獲取0的平面坐標
  165. adj=get_adj_coo(pla0,3); //獲取相鄰坐標
  166. pec(lay0,pla0,adj); //平面交換數(shù)字位置

  167. }
  168. void right_mov(){ //拼圖右移
  169. unsigned char lay0=0;
  170. unsigned char pla0=0;
  171. unsigned char adj=0;
  172. lay0=get_0_lay(); //獲取0的坐標所在層數(shù)
  173. pla0=get_0_pla(); //獲取0的平面坐標
  174. adj=get_adj_coo(pla0,4); //獲取相鄰坐標
  175. pec(lay0,pla0,adj); //平面交換數(shù)字位置

  176. }
  177. void in_mov(){ //拼圖里移
  178. unsigned char lay0=0; //0的坐標所在層數(shù)
  179. unsigned char pla0=0; //0的平面坐標
  180. unsigned char add=0; //累加計數(shù)

  181. lay0=get_0_lay(); //獲取0的坐標所在層數(shù)
  182. pla0=get_0_pla(); //獲取0的平面坐標
  183.   if(lay0 < 4){
  184.    if(lay0 == 3){l3[pla0]=l4[pla0];l4[pla0]=0;}
  185.    if(lay0 == 2){l2[pla0]=l3[pla0];l3[pla0]=0;}
  186.    if(lay0 == 1){l1[pla0]=l2[pla0];l2[pla0]=0;}
  187.   }
  188. }
  189. void out_mov(){ //拼圖外移
  190. unsigned char lay0=0; //0的坐標所在層數(shù)
  191. unsigned char pla0=0; //0的平面坐標
  192. unsigned char add=0; //累加計數(shù)

  193. lay0=get_0_lay(); //獲取0的坐標所在層數(shù)
  194. pla0=get_0_pla(); //獲取0的平面坐標
  195.   if(lay0 > 1){
  196.    if(lay0 == 4){l4[pla0]=l3[pla0];l3[pla0]=0;}
  197.    if(lay0 == 3){l3[pla0]=l2[pla0];l2[pla0]=0;}
  198.    if(lay0 == 2){l2[pla0]=l1[pla0];l1[pla0]=0;}
  199.   }
  200. }

  201. void send_puzzle_l1(){
  202. unsigned char a=0;

  203. send_text("┏━┳━┳━┳━┓");send_enter(); //發(fā)送頂部表格框架
  204.   for(a=0;a<16;a++){
  205.   send_text("┃");
  206.   if(l1[a] == 0){ //讀取到的數(shù)字為0則發(fā)送2個空格
  207.    txd_data(0x20);
  208.    txd_data(0x20);
  209.   } else { //不為0則發(fā)送數(shù)字
  210.    txd_data((l1[a]/10)|0x30);  //發(fā)送數(shù)字十位
  211.    txd_data((l1[a]%10)|0x30);  //發(fā)送數(shù)字個位
  212.   }
  213.   
  214.     if(a==3 || a==7 || a==11){ //讀取到第3 7 11個數(shù)字
  215.     send_text("┃"); //發(fā)送分隔符
  216.     send_enter();
  217.     send_text("┣━╋━╋━╋━┫"); //發(fā)送中間表格框架
  218.     send_enter();
  219.     }
  220.   }
  221. send_text("┃");
  222. send_enter();
  223. send_text("┗━┻━┻━┻━┛"); //發(fā)送底部表格框架

  224. }
  225. void send_puzzle_l2(){
  226. unsigned char a=0;

  227. send_text("┏━┳━┳━┳━┓");send_enter(); //發(fā)送頂部表格框架
  228.   for(a=0;a<16;a++){
  229.   send_text("┃");
  230.   if(l2[a] == 0){ //讀取到的數(shù)字為0則發(fā)送2個空格
  231.    txd_data(0x20);
  232.    txd_data(0x20);
  233.   } else { //不為0則發(fā)送數(shù)字
  234.    txd_data((l2[a]/10)|0x30);  //發(fā)送數(shù)字十位
  235.    txd_data((l2[a]%10)|0x30);  //發(fā)送數(shù)字個位
  236.   }
  237.   
  238.     if(a==3 || a==7 || a==11){ //讀取到第3 7 11個數(shù)字
  239.     send_text("┃"); //發(fā)送分隔符
  240.     send_enter();
  241.     send_text("┣━╋━╋━╋━┫"); //發(fā)送中間表格框架
  242.     send_enter();
  243.     }
  244.   }
  245. send_text("┃");
  246. send_enter();
  247. send_text("┗━┻━┻━┻━┛"); //發(fā)送底部表格框架

  248. }
  249. void send_puzzle_l3(){
  250. unsigned char a=0;

  251. send_text("┏━┳━┳━┳━┓");send_enter(); //發(fā)送頂部表格框架
  252.   for(a=0;a<16;a++){
  253.   send_text("┃");
  254.   if(l3[a] == 0){ //讀取到的數(shù)字為0則發(fā)送2個空格
  255.    txd_data(0x20);
  256.    txd_data(0x20);
  257.   } else { //不為0則發(fā)送數(shù)字
  258.    txd_data((l3[a]/10)|0x30);  //發(fā)送數(shù)字十位
  259.    txd_data((l3[a]%10)|0x30);  //發(fā)送數(shù)字個位
  260.   }
  261.   
  262.     if(a==3 || a==7 || a==11){ //讀取到第3 7 11個數(shù)字
  263.     send_text("┃"); //發(fā)送分隔符
  264.     send_enter();
  265.     send_text("┣━╋━╋━╋━┫"); //發(fā)送中間表格框架
  266.     send_enter();
  267.     }
  268.   }
  269. send_text("┃");
  270. send_enter();
  271. send_text("┗━┻━┻━┻━┛"); //發(fā)送底部表格框架

  272. }
  273. void send_puzzle_l4(){
  274. unsigned char a=0;

  275. send_text("┏━┳━┳━┳━┓");send_enter(); //發(fā)送頂部表格框架
  276.   for(a=0;a<16;a++){
  277.   send_text("┃");
  278.   if(l4[a] == 0){ //讀取到的數(shù)字為0則發(fā)送2個空格
  279.    txd_data(0x20);
  280.    txd_data(0x20);
  281.   } else { //不為0則發(fā)送數(shù)字
  282.    txd_data((l4[a]/10)|0x30);  //發(fā)送數(shù)字十位
  283.    txd_data((l4[a]%10)|0x30);  //發(fā)送數(shù)字個位
  284.   }
  285.   
  286.     if(a==3 || a==7 || a==11){ //讀取到第3 7 11個數(shù)字
  287.     send_text("┃"); //發(fā)送分隔符
  288.     send_enter();
  289.     send_text("┣━╋━╋━╋━┫"); //發(fā)送中間表格框架
  290.     send_enter();
  291.     }
  292.   }
  293. send_text("┃");
  294. send_enter();
  295. send_text("┗━┻━┻━┻━┛"); //發(fā)送底部表格框架

  296. }
  297. void send_3dpuzzle(){ //通過串口發(fā)送拼圖數(shù)據(jù)
  298. txd_data(0x0C);
  299. send_text("3D立體數(shù)字滑塊推盤游戲 4x4x4 串口版 WASD控制上下左右 Q里 E外,全球首發(fā)! ");
  300. send_enter();
  301. send_text("第一層(最里層):");send_enter();
  302. send_puzzle_l1();send_enter();send_enter();
  303. send_text("第二層:");send_enter();
  304. send_puzzle_l2();send_enter();send_enter();
  305. send_text("第三層:");send_enter();
  306. send_puzzle_l3();send_enter();send_enter();
  307. send_text("第四層(最外層):");send_enter();
  308. send_puzzle_l4();send_enter();send_enter();
  309. }
  310. void exint4() //interrupt 16
  311. { //P3.0下降沿中斷 (串口接收到數(shù)據(jù))
  312. unsigned char dat=0;  //數(shù)據(jù)存放變量
  313. // INT_CLKO &= 0xBF;  //關(guān)閉中斷,避免重復觸發(fā)中斷程序。
  314. dat=rxd_data();    //串口接收數(shù)據(jù)。
  315.   if(dat == 0x57 || dat == 0x77) up_mov(); //W 上
  316.   if(dat == 0x41 || dat == 0x61) left_mov(); //A 左
  317.   if(dat == 0x53 || dat == 0x73) down_mov(); //S 下
  318.   if(dat == 0x44 || dat == 0x64) right_mov(); //D 右
  319.   if(dat == 0x51 || dat == 0x71) in_mov(); //Q 里
  320.   if(dat == 0x45 || dat == 0x65) out_mov(); //E 外
  321.   send_3dpuzzle();
  322. // INT_CLKO |= 0x40; //開啟中斷,允許下次接收數(shù)據(jù)。        
  323. }

  324. void main(){ //入口函數(shù)

  325. //init_uart();
  326. send_3dpuzzle(); //發(fā)送拼圖數(shù)據(jù)
  327. while(1){
  328.   if(rxd == 0){ //串口收到低電平
  329.    exint4(); //處理數(shù)據(jù)
  330.   }
  331. }
  332. }

復制代碼


作者: uuxl    時間: 2016-10-10 19:17
學習一下!!
作者: xsjysm888    時間: 2016-10-14 21:24
新產(chǎn)品,看看
作者: ZHANGJINGYU    時間: 2016-12-24 10:22
學習一下!謝樓主分享!
作者: ZHANGJINGYU    時間: 2016-12-24 10:23
樓主你的硬件圖呢?求分享!謝謝!
作者: 東北那誰    時間: 2016-12-24 20:24
學習一下!!
作者: ZHANGJINGYUU    時間: 2016-12-27 19:37
再回復一次!只求資料
作者: mrliangg    時間: 2016-12-30 16:01

再回復一次!只求資料
作者: 湘?zhèn)?nbsp;   時間: 2016-12-31 15:04
這個東西沒看過
作者: 孤獨有藕    時間: 2016-12-31 15:34
看看。。。。
作者: zzz741    時間: 2016-12-31 16:10
學習一下

作者: 新手小蘇    時間: 2018-6-16 11:59
覺得是個好東西,先看看
作者: ecpc    時間: 2018-8-21 20:10
謝謝,研究研究
作者: 386912599    時間: 2018-8-21 21:18

學習一下!!
作者: 花開不敗111    時間: 2018-9-9 13:49
學習一下
作者: INSIST    時間: 2018-9-9 20:10
不錯不錯不錯
作者: g1979476073    時間: 2019-4-2 22:08
想看這嗎厲害的東西
作者: 喜悅的春天66    時間: 2019-4-3 16:57
學習一下!!
作者: zp631078306    時間: 2019-4-5 23:10
學習一下
作者: zsf333666    時間: 2019-4-6 02:05
瞅瞅咋樣
作者: lvlv99    時間: 2019-4-6 09:29
我就看看,OK!
作者: 王冰珂    時間: 2019-4-6 09:52
學習一下

作者: qzyhlf    時間: 2025-4-29 09:25
學習一下!!
作者: raymondau    時間: 2025-5-4 15:51
謝謝樓主分享,學習

作者: kscheang    時間: 2025-5-5 01:04
新產(chǎn)品,學習一下
作者: mashuiyou    時間: 2025-5-5 08:11
學習一下!!
作者: pzwyf    時間: 2025-5-5 12:49

學習一下!!
作者: shuma520    時間: 2025-5-5 13:23
一起學習一下
作者: wbwcf13e    時間: 2025-5-6 06:38
我是來學習一下!
作者: csgtli    時間: 2025-5-6 09:41
什么游戲,學習下
作者: yyzf998    時間: 2025-5-8 17:10
不錯,學習一下大俠的杰作了
作者: yyzf998    時間: 2025-5-8 17:11
不錯!學習一下大俠的杰作了!謝謝!
作者: hzd530    時間: 2025-5-9 10:18
學習一下!
作者: IdeaMing    時間: 2025-10-24 16:38
頂一下,看看啥東西




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1