找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3841|回复: 1
收起左侧

带红外51单片机光立方源程序 功能很多

[复制链接]
ID:221791 发表于 2017-7-23 16:27 | 显示全部楼层 |阅读模式
带红外 51单片机   源程序     功能很多.
0.png

单片机源程序如下:
  1. /*---------------------------------------------------------------------------------------------------
  2. -----------------------------------------------------------------------------------------------------
  3. * 上升沿电子科技
  4. * 时间2015.8.1
  5. *Build target 'Target 1'
  6. *compiling stc8x8x8.c...
  7. *linking...
  8. *Program Size: data=17.1 xdata=355 code=53475
  9. *creating hex file from "stc8x8x8"...
  10. *"stc8x8x8" - 0 Error(s), 0 Warning(s).
  11. *没有关闭本店字样的显示函数 FLASH_12        FLASH_14  FLASH_18 如果需要自己关闭函数即可
  12. ------------------------------------------------------------------------------------------------------
  13. -----------------------------------------------------------------------------------------------------*/

  14. #include "STC12C5A.H"  //包含单片机的头文件使用KEIL必须添加进来否则编译不了
  15. #include "intrins.h"   //包含NOP延时头文件
  16. #include"main.h"       //主程序头文件
  17. #include "shuju.h"     //包含字模数据数组
  18. #include "flash.h"     //动画部分程序
  19. #include "hongwai.h"   //红外部分程序
  20. #include "key.h"       //按键部分程序


  21. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@定义变量@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
  22. uchar xdata display[8][8];
  23. uchar xdata msd=4;
  24. uint ld=500;
  25. uchar test=0,key1=0,key2=0,key3=0,key4=0;
  26. bit pu;
  27. uchar xsdsq=0;
  28. uchar cd=0,cnt=0,errd_flag=0,read_flag=0,layerr=0,saom=0;
  29. unsigned int CYCLE=100,PWM_LOW=1110,shan=0,shuzi1=0,shuzi2=0,shuzi3=0,shuzi4=0,m=0;//定义周期并赋值
  30. unsigned short T_PCA0;      // unsigned short 范围是0至65535
  31. unsigned short T_PCA1;


  32. /*##########################################################################################*/
  33. //************************************上升沿电子科技************************************
  34. //函数名称:void init();
  35. //功    能:定义IO口功能
  36. //出口参数:无
  37. //编 写 人:上升沿电子科技
  38. //编写日期:2015-08-1
  39. //修改历史:V1.0
  40. //************************************上升沿电子科技************************************
  41. void init()
  42. {
  43.         P4SW=0xff;                //定义P4口为I/O口
  44.         P0M1=0x00;                                   
  45.         P0M0=0xff;                //定义P0为强上拉输出.
  46.         P1M1=0x01;
  47.         P1M0=0xfe;                //定义P1为强上拉输出.   P1.0作为AD此时不能作为强上蜡
  48.         P2M1=0x00;
  49.         P2M0=0xff;                //定义P2为强上拉输出.
  50.         P3M1=0x00;
  51.         P3M0=0xf8;                //定义P2为强上拉输出.
  52.         P4M1=0x00;
  53.         P4M0=0xff;                //定义P4为强上拉输出.        
  54. }
  55. /********************* AD初始化************************/
  56. void ADC0_Init (void)
  57. {
  58.     P1ASF = 0x01;                   //Open 8 channels ADC function
  59.     ADC_RES = 0;                    //Clear previous result        清零ADC的8位数据
  60.         AUXR1 &=0xFB;                   //1111,1011, 令 ADRJ=0 (10位A/D转换结果的高8位放在ADC_RES寄存器, 低2位放在ADC_RESL寄存器)
  61.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//配置ADC寄存器  
  62.     _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  63.     _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  64. }
  65. /********************* 使用PCA定时初始化************************/
  66. void PCA_init()
  67. {
  68.     CCON = 0;               //Initial PCA control register
  69.                             //PCA timer stop running
  70.                             //Clear CF flag
  71.                             //Clear all module interrupt flag
  72.     CL = 0;                 //Reset PCA base timer
  73.     CH = 0;
  74.     CMOD = 0x00;

  75.     T_PCA0 = 1024;//46080;      //定时50ms,11.0592MHZ晶振,T_Value=46080.要2秒需循环40次
  76.     CCAP0L = T_PCA0;
  77.     CCAP0H = T_PCA0 >> 8;   //Initial PCA module-0
  78.     T_PCA0 += 1024;        //PCA module-0 work in 16-bit timer mode
  79.     CCAPM0 = 0x49;                     //and enable PCA interrupt            //Set PCA timer clock source as Fosc/12
  80.         CR = 0;                 //PCA timer start run
  81.         PPCA = 1; //高优先级
  82.         EA=1;   
  83. }
  84. /********************* 串口初始化************************/
  85. void init_uart(void)
  86. {
  87.         PCON |= 0x80;
  88.         SCON = 0x50;
  89.         AUXR |= 0x40;
  90.         AUXR &= 0xFE;
  91.         TMOD &= 0x0F;
  92.         TMOD |= 0x20;                                          
  93.         TL1 = 0xE8;
  94.         TH1 = 0xE8;
  95.         ET1 = 0;
  96.         TR1 = 1;
  97.         ES=1;
  98.         EA=1;
  99. }

  100. /*##########################################################################################*/
  101. //************************************上升沿电子科技************************************
  102. //函数名称:void sinter()
  103. //功    能:中断初始化
  104. //出口参数:无
  105. //编 写 人:上升沿电子科技
  106. //编写日期:2015-08-1
  107. //修改历史:V1.0
  108. //************************************上升沿电子科技************************************
  109. void sinter()
  110. {
  111.         IE=0x82;
  112.         TCON=0x01;
  113.         TH0=0x10;
  114.         TL0=0x00;
  115.         EX0 = 1;
  116.         init();                         
  117.         PWM_POW=1;         
  118.         ADC0_Init();
  119.         PCA_init();
  120.         init_uart();
  121.         EA=1;
  122. }

  123. /*##########################################################################################*/
  124. //************************************上升沿电子科技************************************
  125. //函数名称:void delayus(unsigned int yanshi);
  126. //功    能:根据yanshi值的大小进行延时等待操作,1默认为2uS
  127. //入口参数:yanshi的值,范围0-65535
  128. //出口参数:无
  129. //编 写 人:上升沿电子科技
  130. //编写日期:2015-08-1
  131. //修改历史:V1.0
  132. //************************************上升沿电子科技************************************
  133. void delayus(unsigned int yanshi)
  134. {
  135.         unsigned int wmys;                 //定义延时循环控制变量
  136.         for(wmys=0;wmys<=yanshi;wmys++);        //根据延时参数进行空循环操作,达到延时功能
  137. }
  138. void delay10us(void)   //误差 -0.026765046296us STC 1T 22.1184Mhz
  139. {
  140.     unsigned char a,b;
  141.     for(b=1;b>0;b--)
  142.         for(a=2;a>0;a--);           //默认的速度为5,变速1-5-25-125
  143. }
  144. void delay5us(void)   //误差 -0.026765046296us STC 1T 22.1184Mhz
  145. {
  146.     unsigned char a,b;
  147.     for(b=1;b>0;b--)
  148.         for(a=5;a>0;a--);           //默认的速度为5,变速1-5-25-125
  149. }
  150. void delay(uint ihk)
  151. {   
  152.         if(key3==2){return;}
  153.         else
  154.     {                                                                                             
  155.             while(ihk--)
  156.                 {
  157.                          delay5us();   //12t的mcu 注释这个延时即可
  158.                 }
  159.         }
  160. }

  161. void delays(int t)
  162. {
  163.         int i;
  164.         while(t--)
  165.                 for(i=0;i<700;i++);
  166. }
  167. /*##########################################################################################*/
  168. //************************************上升沿电子科技************************************
  169. //函数名称:void hansao(unsigned char hs);         138驱动程序
  170. //功    能:根据入口参数hs的值,进行判断选择哪一行,选通1-8行的选通
  171. //入口参数:hs的值,范围0-7
  172. //出口参数:无
  173. //编 写 人:上升沿电子科技
  174. //************************************上升沿电子科技************************************
  175. void hansao(unsigned char hs)     
  176. {
  177.         if(hs<8)                          //判断hs的值是否在行扫描的值范围内,不在范围内不执行任何操作
  178.         {
  179.                 if(hs==7)                  //选通第1行
  180.                 {
  181.                         M_A=0;M_B=0;M_C=0;M_D=0;   return;
  182.                 }
  183.                 if(hs==6)                  //选通第2行
  184.                 {
  185.                         M_A=1;M_B=0;M_C=0;M_D=0;   return;
  186.                 }
  187.                 if(hs==5)                  //选通第3行
  188.                 {
  189.                         M_A=0;M_B=1;M_C=0;M_D=0;   return;
  190.                 }
  191.                 if(hs==4)                  //选通第4行
  192.                 {
  193.                         M_A=1;M_B=1;M_C=0;M_D=0;   return;
  194.                 }
  195.                 if(hs==3)                  //选通第5行
  196.                 {
  197.                         M_A=0;M_B=0;M_C=1;M_D=0;   return;
  198.                 }
  199.                 if(hs==2)                  //选通第6行
  200.                 {
  201.                         M_A=1;M_B=0;M_C=1;M_D=0;   return;
  202.                 }
  203.                 if(hs==1)                  //选通第7行
  204.                 {
  205.                         M_A=0;M_B=1;M_C=1;M_D=0;   return;
  206.                 }
  207.                 if(hs==0)                  //选通第8行
  208.                 {
  209.                         M_A=1;M_B=1;M_C=1;M_D=0;   return;
  210.                 }
  211.         }
  212. }
  213. //************************************595芯片驱动程序1************************************
  214. void sendbyte(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4)
  215. {   
  216.     unsigned char c;        
  217.     for(c=0;c<8;c++)                       
  218.    {
  219.       CLK=0;                                  
  220.       M_LR_DS0=num1&0x80;                         
  221.           M_LG_DS0=num2&0x80;                       
  222.           M_HR_DS0=num3&0x80;                       
  223.           M_HG_DS0=num4&0x80;                       
  224.       CLK=1;                                
  225.           num1<<=1;               
  226.       num2<<=1;               
  227.       num3<<=1;               
  228.       num4<<=1;                       
  229.     }
  230. }
  231. //************************************595芯片驱动程序2************************************
  232. void sendbyte1(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4)
  233. {
  234.     unsigned char c;
  235.     for(c=0;c<8;c++)
  236.     {
  237.                 CLK=0;         //模拟时钟控制端口
  238.                 M_LR_DS0=num1&0x01;           //模拟数据发送端口
  239.                 M_LG_DS0=num2&0x01;
  240.                 M_HR_DS0=num3&0x01;
  241.                 M_HG_DS0=num4&0x01;
  242.                 CLK=1;
  243.                 num1>>=1;
  244.                 num2>>=1;
  245.                 num3>>=1;
  246.                 num4>>=1;
  247.     }
  248. }
  249. //************************************595芯片驱动程序3 上位机控制部分***********************************
  250. void sendbyteck(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4)
  251. {
  252.     unsigned char c;
  253.     for(c=0;c<8;c++)
  254.            {
  255.                 CLK=0;
  256.                 M_LR_DS0=num1&0x01;
  257.                 M_LG_DS0=num2&0x01;
  258.                 M_HR_DS0=num3&0x01;
  259.                 M_HG_DS0=num4&0x01;
  260.                 CLK=1;
  261.                 num1>>=1;
  262.                 num2>>=1;
  263.                 num3>>=1;
  264.                 num4>>=1;
  265.     }
  266. }

  267. /************************************呼吸灯************************************/
  268. void Delaypwm(unsigned int tpwm)
  269. {
  270.          while(--tpwm);
  271. }
  272. /************************************呼吸灯************************************/
  273. void PWM_LED()
  274. {
  275.         unsigned int CYCLE=100,PWM_LOW=1110,xhs=60000;
  276.         PWM_POW=0;
  277.         if (xhs>1)
  278.         {
  279.                 CYCLE=1950,PWM_LOW=201;
  280.                 PWM_POW=1;
  281.                 Delaypwm(60000);
  282.                 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  283.                 {
  284.                         PWM_POW=0;
  285.                         Delaypwm(PWM_LOW);
  286.                         PWM_POW=1;
  287.                         Delaypwm(CYCLE-PWM_LOW);
  288.                 }
  289.                 for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  290.                 {
  291.                         PWM_POW=0;
  292.                         Delaypwm(PWM_LOW);
  293.                         PWM_POW=1;
  294.                         Delaypwm(CYCLE-PWM_LOW);
  295.                 }
  296.                 xhs--;
  297.         }
  298. }
  299. /************************************扫描一面************************************/
  300. void turn_on(uchar v)
  301. {
  302.         uchar a[64]={0};
  303.         char i,j;
  304.         a[7]=0x80;
  305.                 if(key3==1){return;}
  306.                 else{zhen(a,v);}
  307.         delay(50);
  308.         for(i=1;i<8;i++)
  309.         {
  310.                 a[i*8+7]=0x80;
  311.                 if(key3==1){break;}
  312.                 else{zhen(a,v);}
  313.                 delay(50);
  314.         }
  315.         for(i=6;i>=0;i--)
  316.         {
  317.                 for(j=0;j<8;j++)
  318.                         a[j*8+i]=0x80;
  319.                 if(key3==1){break;}
  320.                 else{zhen(a,v);}
  321.                 delay(50);
  322.         }       
  323.         for(i=0;i<64;i++)
  324.                 a[i]=0;       
  325. }
  326. /************************************左向右扫描检测************************************/
  327. void H_scan(uchar v)
  328. {       
  329.         uchar b[64]={0};
  330.         char i,j;
  331.        
  332.         for(i=0;i<64;i++)
  333.                 b[i]=0x80;
  334.         for(i=0;i<8;i++)
  335.         {
  336.                 if(key1==4)
  337.                 {
  338.                         return;
  339.                 }
  340.                 for(j=0;j<8;j++)
  341.                 b[j*8+i]=0x80;
  342.                 if(key3==1){break;}
  343.                 else{zhen(b,1);}
  344.         }
  345.         for(i=0;i<8;i++)
  346.         {
  347.                 if(key1==4)
  348.                 {
  349.                         return;
  350.                 }
  351.                 for(j=0;j<64;j++)
  352.                         b[j]>>=1;
  353.                 if(key3==1){break;}
  354.                 else{zhen(b,v);}
  355.                 delay(50);
  356.         }
  357. }
  358. /************************************下向上扫描检测************************************/
  359. void V_scan(uchar v)
  360. {
  361.         uchar a[64]={0};
  362.         char i,j;
  363.         for(i=0;i<8;i++)
  364.                 a[i]=0xff;
  365.         if(key1==4)
  366.         {
  367.                 return;
  368.         }
  369.         if(key3==1){return;}
  370.         else{zhen(a,v);}
  371.         delay(50);
  372.         for(i=1;i<8;i++)
  373.         {
  374.                 if(key1==4)
  375.                 {
  376.                         return;
  377.                 }
  378.                 for(j=0;j<8;j++)
  379.                 {
  380.                         a[i*8+j]=0xff;
  381.                         a[(i-1)*8+j]=0;
  382.                 }
  383.                 if(key3==1){break;}
  384.                 else{zhen(a,v);}
  385.                 delay(50);
  386.         }
  387. }
  388. /************************************前向后扫描检测************************************/
  389. void W_scan(uchar v)
  390. {
  391.         uchar a[64]={0};
  392.         char i,j;
  393.         for(i=0;i<8;i++)
  394.                 a[i*8+7]=0xff;
  395.         if(key1==4)
  396.         {
  397.                         return;
  398.         }
  399.         if(key3==1){return;}
  400.         else{zhen(a,v);}
  401.         delay(50);
  402.         for(i=6;i>=0;i--)
  403.         {
  404.                 if(key1==4)
  405.                 {
  406.                         return;
  407.                 }
  408.                 for(j=0;j<8;j++)
  409.                 {
  410.                         a[j*8+i]=0xff;
  411.                         a[j*8+i+1]=0;
  412.                 }
  413.                 if(key3==1){break;}
  414.                 else{zhen(a,v);}
  415.                 delay(50);
  416.         }
  417.         M_EN=0;
  418. }
  419. void W_side(uchar *tab,char num,char v)
  420. {
  421.         uchar a[64]={0};
  422.         int i,j;
  423.         for(j=0;j<num;j++)
  424.         {
  425.                 for(i=0;i<8;i++)
  426.                         a[i*8+7]=tab[j*8+i];       
  427.                 if(key3==1){break;}
  428.                 else{zhen(a,v);}
  429.                 delay(50);
  430.         }
  431. }


  432. void delayyp(unsigned int n1)
  433. {
  434.     unsigned int xdata i;
  435.     while(n1--)
  436.      for (i=0;i<200;i++);
  437. }
  438. unsigned int Read_ADC0()
  439. {
  440.         ADC_CONTR|=0x08;
  441.         _nop_();
  442.         _nop_();
  443.         _nop_();
  444.         _nop_();
  445.         while(!(ADC_CONTR&0x10));
  446.         ADC_CONTR&=~0x10;
  447.         return ((ADC_RES<<2)|(ADC_RESL));
  448. }
  449. unsigned int voivol(unsigned int n)
  450. {
  451.         unsigned int xdata val,result,rel=0;
  452.         while(n)
  453.         {
  454.                 val=Read_ADC0();
  455.                 delayyp(2);
  456.                 result=val;
  457.                 rel=rel+result;
  458.                 n--;
  459.         }
  460.         return rel;
  461. }
  462. void Vol_watch_0(unsigned char kxg)
  463. {
  464.         unsigned int xdata result=0,l=1,n=500;
  465.         while(n)
  466.         {
  467.                 if ((result>>5)>l)
  468.                         l=result>>5;
  469.                 else
  470.                         if (l>1)
  471.                                 l--;
  472.                 if (l>7)
  473.                         l=7;
  474.                
  475.                 if(kxg==1)
  476.                 {
  477.                         box(0,0,0,l,l,l,0,1);
  478.                         result=voivol(16);
  479.                         box(0,0,0,7,7,7,1,0);          
  480.                 }
  481.                 if(kxg==2)
  482.                 {
  483.                         box(7,7,7,7-l,7-l,7-l,0,1);
  484.                         result=voivol(16);
  485.                         box(7,7,7,7-l,7-l,7-l,1,0);
  486.                 }
  487.                 if(kxg==3)
  488.                 {
  489.                         box(7,0,7,0,l,0,0,1);
  490.                         result=voivol(16);
  491.                         box(l,0,l,0,7,0,1,0);          
  492.                 }
  493.                 if(kxg==4)
  494.                 {   
  495.                         box(l,l,l,7-l,7-l,7-l,0,1);
  496.                         result=voivol(16);
  497.                         box(7-l,7-l,7-l,l,l,l,1,0);       
  498.                 }
  499.                 if(kxg==5)
  500.                 {
  501.                         box(0,7,7,l,7-l,0,0,1);
  502.                         result=voivol(16);
  503.                         box(0,7,7,l,7-l,0,1,0);         
  504.                 }
  505.                 if(kxg==6)
  506.                 {
  507.                         box(l,l,l,7-l,7-l,7-l,0,1);
  508.                         result=voivol(16);
  509.                         box(7-l,7-l,7-l,7,7,7,1,0);       
  510.                 }
  511.                 if(kxg==7)
  512.                 {
  513.                         box(l,0,7,0,7,0,0,1);
  514.                         result=voivol(16);
  515.                         box(7,0,l,0,l,0,1,0);             
  516.                 }
  517.                 n--;
  518.                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  519.                 else{if(key2==2){msd=2;break;}}}
  520.         }
  521. }

  522. void Vol_watch_2()
  523. {
  524.         unsigned int xdata result=0,l=0,n=500;
  525.         while(n)
  526.         {
  527.                 if ((result>>5)>l)
  528.                         l=result>>5;
  529.                 else
  530.                         if (l>0)
  531.                                 l--;
  532.                 if (l>7)
  533.                         l=7;
  534.                 clear(0);
  535.                 switch(l)
  536.                 {
  537.                         case 0:point(4,4,4,1);break;
  538.                         case 1:box(3,3,3,4,4,4,1,1);break;
  539.                         case 2:box(2,2,2,4,4,4,1,1);break;
  540.                         case 3:box(2,2,2,5,5,5,1,1);break;
  541.                         case 4:box(1,1,1,5,5,5,1,1);break;
  542.                         case 5:box(1,1,1,6,6,6,1,1);break;
  543.                         case 6:box(0,0,0,6,6,6,1,1);break;
  544.                         default:box(0,0,0,7,7,7,1,1);
  545.                 }
  546.                 result=voivol(16);
  547.                 n--;
  548.                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  549.                 else{if(key2==2){msd=2;break;}}}
  550.         }
  551. }
  552. void Vol_watch_3()
  553. {
  554.         unsigned int result,l,n=500;
  555.         while(n)
  556.         {
  557.                 result=voivol(3);
  558.                 l=result>>3;
  559.                 if (l>7)
  560.                         l=7;
  561.                 transss();
  562.                 box_apeak_xy(0,0,0,0,7,l,1,1);
  563.                 delayyp(60);
  564.                 n--;
  565.                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  566.                 else{if(key2==2){msd=2;break;}}}
  567.         }
  568. }
  569. void Vol_watch_1(unsigned char kxg1)
  570. {
  571.         unsigned int xdata result=0,l=0,n=500,saa,sad;
  572.         unsigned char code disxin[8][8]={
  573.         0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x99,
  574.         0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xA5,
  575.         0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0xC3,
  576.         0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81, 0x81,
  577.         0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x81, 0x81,
  578.         0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x99,
  579.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xE7,
  580.         0xFF, 0xC3, 0xA5, 0x81, 0x81, 0xA5, 0xC3, 0xFF,
  581.         };
  582.         while(n)
  583.         {
  584.                 if ((result>>5)>l)
  585.                         l=result>>5;
  586.                 else
  587.                         if (l>0)
  588.                 l--;
  589.                 if (l>7)
  590.                         l=7;
  591.                 if(kxg1==1)
  592.                 {
  593.                         box(3,3,0,4,4,l,1,1);
  594.                         if (l<7)
  595.                                 box(3,3,7,4,4,l+1,1,0);
  596.                         result=voivol(16);                 
  597.                 }
  598.                 if(kxg1==2)
  599.                 {
  600.                         box(2,2,0,5,5,l,1,1);
  601.                         if (l<7)
  602.                                 box(2,2,7,5,5,l+1,1,0);
  603.                         result=voivol(16);                 
  604.                 }
  605.                 if(kxg1==3)
  606.                 {
  607.                         box(1,1,0,6,6,l,1,1);
  608.                         if (l<7)
  609.                                 box(1,1,7,6,6,l+1,1,0);
  610.                         result=voivol(16);                  
  611.                 }
  612.                 if(kxg1==4)
  613.                 {  
  614.                         box(0,0,0,7,7,l,1,1);
  615.                         if (l<7)
  616.                                 box(0,0,7,7,7,l+1,1,0);
  617.                         result=voivol(16);               
  618.                 }
  619.                 if(kxg1==5)
  620.                 {
  621.                         for(saa=0;saa<8;saa++)
  622.                         {
  623.                                 for(sad=0;sad<8;sad++)
  624.                                 {
  625.                                         display[saa][sad]= disxin[saa][sad];
  626.                                 }
  627.                         }
  628.                         box(3,3,0,4,4,l,1,1);
  629.                         if (l<7)
  630.                                 box(3,3,7,4,4,l+1,1,0);
  631.                         result=voivol(16);               
  632.                 }
  633.                 n--;
  634.                 if(key2==3||key2==2)
  635.                 {
  636.                         if(key2==3)
  637.                         {
  638.                                 msd=3;
  639.                                 break;
  640.                         }
  641.                         else
  642.                         {
  643.                                 if(key2==2)                                 
  644.                                 {
  645.                                         msd=2;break;
  646.                                 }
  647.                         }
  648.                 }
  649.         }
  650. }

  651. void fvb()                //上位机
  652. {
  653.         if(read_flag)
  654.         {
  655.                 read_flag=0;
  656.                 for(saom=0;saom<8;saom++)
  657.                 {
  658.                         displayck[saom+0]=((shuzu8X8[saom*8]>>7)&0x01)+(((shuzu8X8[saom*8+1]>>7)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>7)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>7)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>7)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>7)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>7)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>7)&0x01)<<7);       
  659.                         displayck[saom+8]=((shuzu8X8[saom*8]>>6)&0x01)+(((shuzu8X8[saom*8+1]>>6)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>6)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>6)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>6)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>6)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>6)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>6)&0x01)<<7);       
  660.                         displayck[saom+16]=((shuzu8X8[saom*8]>>5)&0x01)+(((shuzu8X8[saom*8+1]>>5)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>5)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>5)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>5)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>5)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>5)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>5)&0x01)<<7);       
  661.                         displayck[saom+24]=((shuzu8X8[saom*8]>>4)&0x01)+(((shuzu8X8[saom*8+1]>>4)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>4)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>4)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>4)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>4)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>4)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>4)&0x01)<<7);       
  662.                         displayck[saom+32]=((shuzu8X8[saom*8]>>3)&0x01)+(((shuzu8X8[saom*8+1]>>3)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>3)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>3)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>3)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>3)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>3)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>3)&0x01)<<7);       
  663.                         displayck[saom+40]=((shuzu8X8[saom*8]>>2)&0x01)+(((shuzu8X8[saom*8+1]>>2)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>2)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>2)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>2)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>2)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>2)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>2)&0x01)<<7);       
  664.                         displayck[saom+48]=((shuzu8X8[saom*8]>>1)&0x01)+(((shuzu8X8[saom*8+1]>>1)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>1)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>1)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>1)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>1)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>1)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>1)&0x01)<<7);       
  665.                         displayck[saom+56]=((shuzu8X8[saom*8]>>0)&0x01)+(((shuzu8X8[saom*8+1]>>0)&0x01)<<1)+(((shuzu8X8[saom*8+2]>>0)&0x01)<<2)+(((shuzu8X8[saom*8+3]>>0)&0x01)<<3)+(((shuzu8X8[saom*8+4]>>0)&0x01)<<4)+(((shuzu8X8[saom*8+5]>>0)&0x01)<<5)+(((shuzu8X8[saom*8+6]>>0)&0x01)<<6)+(((shuzu8X8[saom*8+7]>>0)&0x01)<<7);       
  666.                 }
  667.         }
  668.         for(layerr=0;layerr<8;layerr++)
  669.         {
  670.                 key_baihei_scan();  key_shangwiej_scan();   key_donghua_scan();        key_yinyue_scan();
  671.                 hansao(layerr);
  672.                 sendbyteck(~displayck[layerr*8+0],~displayck[layerr*8+2],~displayck[layerr*8+4],~displayck[layerr*8+7]);
  673.                 sendbyteck(~displayck[layerr*8+3],~displayck[layerr*8+1],~displayck[layerr*8+6],~displayck[layerr*8+5]);
  674.                 SUO=0;                //模拟锁存信号端口             
  675.                 _nop_();
  676.                 SUO=1;
  677.                 M_EN=0;                             
  678.                 delayus(ld);                    
  679.                 M_EN=1;                                  
  680.                
  681.                 if(key2==1||key2==2)
  682.                 {
  683.                         break;
  684.                 }
  685.         }
  686. }
  687. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@主函数@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
  688. void main()
  689. {
  690.         unsigned char p=0,k=0,l=0;          //定义
  691.         sinter();
  692.         IDelay(100);
  693.         IRInit();                                   //初始化红外中断
  694.         clear(0);
  695.         PWM_LED();//开启PWM呼吸灯功能
  696.         turn_on(10);
  697.         H_scan(10);
  698.         V_scan(10);
  699.         W_scan(10);
  700.         PWM_POW=0;//打开电源指示灯
  701.         test=1;       
  702.         while(1)
  703.         {
  704.                 ld=500;
  705.                 H_scan(40);   //左向右扫描检测
  706.                 if(key1==1||key1==2||key1==3||key1==4)
  707.                 {
  708.                         break;
  709.                 }
  710.                 V_scan(40);  //下向上扫描检测
  711.                 if(key1==1||key1==2||key1==3||key1==4)
  712.                 {
  713.                         break;
  714.                 }
  715.                 W_scan(40);   //前向后扫描检测
  716.                 if(key1==1||key1==2||key1==3||key1==4)
  717.                 {
  718.                         break;
  719.                 }
  720.         }
  721.         while(1)
  722.         {
  723.                 if(key1==3)
  724.                 {
  725.                         H_scan(40);
  726.                 }
  727.                 if(key1==2)
  728.                 {
  729.                         V_scan(40);
  730.                 }
  731.                 if(key1==1)
  732.                 {
  733.                         W_scan(40);
  734.                 }
  735.                 if(key1==4)                //k1按下退出检测功能
  736.                 {
  737.                         test=2;          
  738.                         msd=2;   
  739.                         ld=500;
  740.                         break; //退出测试功能
  741.                 }
  742.         }
  743.         delay(10);         TR0=0;       
  744.         while(1)  /*play list*/
  745.         {
  746.                 if(msd==1)         
  747.                 {       
  748.                         key3=3;       
  749.                         TR0=0;                                                  
  750.                         ET0=0;
  751.                         IRInit();  
  752.                         xsdsq=1;
  753.                         hy(number+(36+1)*8,10);       
  754.                         W_side(number+(36+1)*8,1,200);         //显示音乐的标识
  755.                         xsdsq=0;
  756.                         PWM_POW=0;
  757.                         TR0=1;                                  //开启定时器显示扫描
  758.                         ET0=1;
  759.                         test=2;
  760.                    while(1)
  761.                    {
  762.                                 if(key2==3||key2==2)
  763.                                 {
  764.                                         if(key2==3)
  765.                                         {
  766.                                                 msd=3;
  767.                                                 break;
  768.                                         }
  769.                                         else
  770.                                         {
  771.                                                 if(key2==2)
  772.                                                 {
  773.                                                         msd=2;
  774.                                                         break;
  775.                                                 }
  776.                                         }
  777.                                 }
  778.                                 else
  779.                                 {
  780.                                         clear(0);
  781.                                         Vol_watch_0(1);
  782.                                 }
  783.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  784.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0); Vol_watch_0(2);}
  785.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  786.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0); Vol_watch_0(3);        }
  787.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  788.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0); Vol_watch_0(4);        }
  789.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  790.                                 else{if(key2==2){msd=2;break;}}}else{  clear(0); Vol_watch_0(5);}
  791.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  792.                                 else{if(key2==2){msd=2;break;}}}else{  clear(0); Vol_watch_0(6);}
  793.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  794.                                 else{if(key2==2){msd=2;break;}}}else{   clear(0); Vol_watch_0(7);}
  795.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  796.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0);         Vol_watch_1(1);}
  797.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  798.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0);         Vol_watch_1(2);}
  799.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  800.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0); Vol_watch_1(3); }
  801.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  802.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0);         Vol_watch_1(4);}
  803.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  804.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0);         Vol_watch_1(5);}
  805.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  806.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0);         Vol_watch_2();}
  807.                                 if(key2==3||key2==2){if(key2==3){msd=3;break;}
  808.                                 else{if(key2==2){msd=2;break;}}}else{ clear(0); Vol_watch_3();}
  809.                    }
  810.                 }
  811.                 if(msd==2)         
  812.                 {       
  813.                         key3=3;       
  814.                         xsdsq=1;
  815.                         hy(number+(36+2)*8,10);       
  816.                         W_side(number+(36+2)*8,1,200);
  817.                         xsdsq=0;
  818.                    while(1)
  819.                    {
  820.                                 msd=6;
  821.                                 TR0=0;                                  //关闭定时器显示扫描
  822.                                 TR1=0;
  823.                                 ET0=0;
  824.                                 IRInit();  
  825.                                  flash_20();         //第一个面屏幕上下拉开
  826.                                 flash_21();         //从后面往前面显示数组的数字9-0
  827.                                 flash_22();         //围绕着最外面的LED循环滚动显示数组中内容
  828.                                 flash_23();         //分层升降左右上下前后以此打开升降测试
  829.                                  flash_24();  //从最上面的一个面往下面的一层移动完
  830.                                  flash_25();         //光立方全亮并且闪烁5次
  831.                                  flash_26();  //从下面往上面依次显示出数组中的内容IXU
  832.                                  flash_27();         //狼七八咋的显示出LED的每一个灯展示灯火效果
  833.                                  flash_28();         //显示从上面往下面滴水的效果
  834.                                  flash_29();         //将4个面围城圈圈然后旋转几次
  835.                                  flash_30();         //空心显示将数组内容打印出来可以打印4个数组内容
  836.                                  flash_31();         //将左右的四个面围绕成圈圈转起来4次之后从左边往右边显示数组中一幅图像64个的数据
  837.                                  flash_32();         //从左边显示一个面然后旋转出一个面的空心效果实心效果
  838.                                  flash_33();         //旋转单个面依次交换到买一个面
  839.                                  flash_34();         //以中点位轴进行选择左右旋转切换实现波纹的效果
  840.                                  flash_35();         //旋转左右为中心加快速度实现每个面的抖动效果
  841.                                 flash_36();         //将数组中的内容显示出现进行旋转是一个正方形的
  842.                                 flash_37();         //将方形变形缩小然后变成一个全亮的效果
  843.                                 flash_38();         //前后左右上下伸缩全亮
  844.                                 flash_39();         //实心和空心缩放和放大正方形全亮显示
  845.                                 flash_40();         //动画显示一个数组里面的心形数据 会动的心形
  846.                                 flash_41();         //显示一个电梯的图形
  847.                                 flash_42();         //显示数字往上移动出来
  848.                                 flash_15();  //显示下雨的效果
  849.                                    msd=2;                       
  850.                                 TR0=1;
  851.                                 TR1=1;               
  852.                                 ET0=1;
  853.                
  854.                 //显示中有些动画包含本店的数据如果不需要请自己将动画函数屏蔽
  855.                 //flash_14();flash_18();flash_12();
  856.                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  857.                                 else{if(key2==3){msd=3;break;}}}else{flash_1();}//包含第一个面显示4321倒计时的文字
  858.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  859.                                 else{if(key2==3){msd=3;break;}}}else{flash_17();}//显示出一个VI的版本标志然后从最里面往外面滚动出来
  860.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  861.                                 else{if(key2==3){msd=3;break;}}}else{flash_16();}//从边边的左右中滚动显示默认的英文字母ideasoft
  862.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  863.                                 else{if(key2==3){msd=3;break;}}}else{flash_14();}//一个一个的字变出来显示上升沿电子光立方可以修改显示数据
  864.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  865.                                 else{if(key2==3){msd=3;break;}}}else{flash_18();}//显示出上升沿电子8X8X8光立方下雨效果飘出字移动出去
  866.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  867.                                 else{if(key2==3){msd=3;break;}}}else{flash_2();}//图形圈圈显示出来
  868.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  869.                                 else{if(key2==3){msd=3;break;}}}else{flash_3();}//从前一排显示到后面一排两次
  870.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  871.                                 else{if(key2==3){msd=3;break;}}}else{flash_4();}//从前一排斜杆到最后一排两次
  872.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  873.                                 else{if(key2==3){msd=3;break;}}}else{flash_5();}//框框伸缩从中间到前面到后面
  874.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  875.                                 else{if(key2==3){msd=3;break;}}}else{flash_6();}//滚四边的圈圈然后下雨效果飘出字移动出去
  876.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  877.                                 else{if(key2==3){msd=3;break;}}}else{flash_7();}//滚四边包括前后左右滚然后出来半边三角形
  878.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  879.                                 else{if(key2==3){msd=3;break;}}}else{flash_8();}//从左移动一排到右边中间显示文字图形
  880.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  881.                                 else{if(key2==3){msd=3;break;}}}else{flash_9();}//从左到右边滚出斜杆然后螺旋转轴旋转框框显示方框伸缩孔空心和实心
  882.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  883.                                 else{if(key2==3){msd=3;break;}}}else{flash_10();}//从最左小脚伸缩出框框然后变轮子前后左右上下滚动然后收缩还原
  884.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  885.                                 else{if(key2==3){msd=3;break;}}}else{flash_11();}//象红旗一样被风飘动象蛇一样飘动走动
  886.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  887.                                 else{if(key2==3){msd=3;break;}}}else{flash_12();}//滚动上升沿电子的字模数据文字移动显示出来
  888.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  889.                                 else{if(key2==3){msd=3;break;}}}else{flash_13();}//渐变出来文字VI1234IXU的图案
  890.                                                 if(key2==1||key2==3){if(key2==1){msd=1;break;}
  891.                                 else{if(key2==3){msd=3;break;}}}else{flash_19();}//平行滑动显示出3D CULE FFT的字?
  892.                                 TR0=0;       
  893.                                 TR1=0;               
  894.                                 ET0=0;
  895.                                 IRInit();  
  896.                                 PWM_POW=0;
  897.                         }
  898.                 }
  899. ……………………

  900. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
最新光立方源程序(2016.7更新).rar (255.01 KB, 下载次数: 32)
回复

使用道具 举报

ID:515520 发表于 2019-4-19 21:19 | 显示全部楼层
楼主厉害,点赞
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表