找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3100|回复: 7
收起左侧

这个单片机程序怎样跳出第三个while循环?帮忙看一下

[复制链接]
ID:425296 发表于 2018-12-3 00:58 | 显示全部楼层 |阅读模式
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit SHCP=P3^6;//595的移位信号         
  5. sbit STCP=P3^5;//是595的锁存信号              
  6. sbit SDA=P3^4;//红数据  

  7. sbit IA=P1^0;//行控制线A                 
  8. sbit IB=P1^1;//行控制线B
  9. sbit IC=P1^2;//行控制线C


  10. /********************************************************************/


  11. #define  scan0    {IA=0;IB=0;IC=0;}
  12. #define  scan1    {IA=1;IB=0;IC=0;}
  13. #define  scan2    {IA=0;IB=1;IC=0;}
  14. #define  scan3    {IA=1;IB=1;IC=0;}
  15. #define  scan4    {IA=0;IB=0;IC=1;}
  16. #define  scan5    {IA=1;IB=0;IC=1;}
  17. #define  scan6    {IA=0;IB=1;IC=1;}
  18. #define  scan7    {IA=1;IB=1;IC=1;}
  19. #define light 3
  20. extern uint uiAllData;                       //定义亮度
  21. uchar code hanzi[];        //汉字字模
  22. uchar Move,Speed,line,tome_count;  //(移位 速度 行 ) 定义
  23. uint zimuo;                                   //字模计数器
  24. uint uiAllData;
  25. uchar BUFF[10];                                   //缓存
  26. void   DelayMs(void);              // 延时
  27. void   in_data();                                   // 调整移动数据
  28. void   rxd_data();                                   // 发送移动数据
  29. uchar time_count=0; //计数
  30. void   rxd_data1();                                   // 发送移动数据
  31. /******************************************************/
  32. /*****不影响其他端口的扫描*************************/
  33. void scan(unsigned char Value)
  34. {switch(Value)
  35.         { case  0: scan0;break;
  36.                   case  1: scan1;break;
  37.                   case  2: scan2;break;
  38.                   case  3: scan3;break;
  39.           case  4: scan4;break;
  40.                   case  5: scan5;break;
  41.                   case  6: scan6;break;
  42.                   case  7: scan7;break;
  43.               default:break;
  44.         }
  45. }
  46. /**************************延时***********************/

  47. void DelayMs(void)
  48. {
  49.   uchar TempCyc;
  50.   for(TempCyc=250;TempCyc>1;TempCyc--)
  51.      {;}
  52. }
  53. /********************************************/


  54. /*主函数*/
  55. void main()
  56. {  
  57.    Move=0;
  58.    zimuo=0;
  59.    while(1)  
  60.    {
  61.            //利用sizeof()语句 运算字幕有效数据的总数;
  62.    while(zimuo<1024)//2048)//定义显示字幕数据的长度 2048/32=64 即显示完64个16*16大小的字符后 重新循环
  63.     {
  64.          while(Move<16)        //数据移位。
  65.        {
  66.              for(Speed=0;Speed<3;Speed++) //移动速度控制
  67.               {        
  68.                     for(line=0;line<8;line++)
  69.                           {
  70.                                 in_data();        //调整移动数据
  71.                                 rxd_data(); //装载移动数据
  72.                                 scan(line); //输出行扫描      
  73.                                                                                    
  74.                                 STCP=1;//锁存
  75.                                 STCP=0;
  76.                                 
  77.                                 DelayMs();         //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。
  78.                                 DelayMs();
  79.                                  
  80.                   }
  81.                  }
  82.        Move++;                                                 //移动一步
  83.              }
  84.      Move=0;
  85.          zimuo=zimuo+64; //换下一个字         这里不在移动地址 就实现了静态显示
  86.     }
  87.               
  88.   TMOD=0x01; //定时器0 16位定时定时器1方式2
  89.   TH0=0x4c;  //50ms
  90.   TL0=0x00;  
  91.   TR0=1; //开定时器计数
  92.   ET0=1; //开定时器中断
  93.   EA=1;         //开中断
  94.    while(tome_count<9)    //怎么样跳出这个循环????????
  95.    {
  96.         }                     
  97.         
  98.    zimuo=0;
  99.    }
  100. }
  101.          
  102. /**********************************************************/

  103. void in_data(void)                                       //调整数据一个屏2个字的数据
  104. {
  105. char s;
  106.         for(s=2;s>=0;s--)                                            //一个屏能显示4个字 取最前面的字发送给595的最前面
  107.         {   //zimuo 是个计算显示到哪个字的计数器 s是取4个字的循环 line是显示到哪一行 根据这几个参数计算出一个屏中现在需要显示的数据 放入BUFF 内存中 等待发送给595
  108.                  BUFF[2*s]=hanzi[zimuo+32*s+2*line];        //要知道为什么这么算就需要知道取模的方向和原理  一行有8个字节 (一个中文16*16的字 一行有2个字节)
  109.                  BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*line];//把一个字的首字节放入BUFF[0]中 后面一个字节放入BUFF[1] 以此类推剩下的3个字            
  110.         }
  111. }

  112. /***********************发送移动的数据****************************/
  113. void rxd_data(void)                            //串行发送数据
  114. {
  115.   uchar s;
  116.   uchar temp,k;   
  117.   for(s=0;s<4;s++)                   //发送4字节数据
  118.         {
  119.          temp=BUFF[s];
  120.          temp=255-temp;
  121.                  SDA=0;
  122.              for(k=0;k<8;k++)//一个字节8位 发送给595
  123.                {
  124.                        SHCP=0; //上升沿移位595                           
  125.                            SDA=(bit)(temp&0x01);//通过IO口送一个位给 595         0x01
  126.                        temp=temp>>1;  //字节移位 准备送下一位                           
  127.                    SHCP=1;
  128.                }

  129.    }

  130. }

  131. void Timer0Interrupt(void) interrupt 1 //定时器中断
  132. {
  133.      TH0 = 0x04C;//定时50MS        这里的晶振是18.432M 测试无需理会晶振大小
  134.      TL0 = 0x000;
  135.          
  136.    time_count++;
  137.    if(time_count>8)//发送一次数据
  138.    {      
  139.        time_count=0;
  140.            line++; //下一行
  141.           if(line>8) //共16行
  142.            {
  143.                     line=0; //重新移动        
  144.            }
  145.             rxd_data1();//发送数据
  146.         scan(line); //打开行扫描                                                                                             
  147.                 STCP=1;//锁存
  148.             STCP=0;

  149.    }
  150.         
  151. }
  152. void rxd_data1(void)                            //串行发送数据
  153. {
  154.   uchar s;
  155.   uchar k;

  156.   for(s=0;s<4;s++)//发送4字节数据 一行4个字节
  157.         {
  158.      for(k=0;k<8;k++) //一个字节8位
  159.        {
  160.                SHCP=0; //上降沿移位595
  161.           SDA=1;

  162.           SHCP=1;
  163.        }
  164.    }
  165. }

  166. const uchar code hanzi[]={


  167. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
  168. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
  169. 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
  170. 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,/*"未命名文件",0*/
  171. 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
  172. 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,/*"未命名文件",0*/
  173. 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
  174. 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,/*"未命名文件",0*/
  175. 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
  176. 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,/*"未命名文件",0*/
  177. 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
  178. 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,/*"未命名文件",0*/
  179. 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
  180. 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,/*"未命名文件",0*/
  181. 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
  182. 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/*"未命名文件",0*/
  183. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
  184. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
  185. 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,/*"未命名文件",0*/
  186. 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,/*"未命名文件",0*/
  187. 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"未命名文件",0*/
  188. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"未命名文件",0*/




  189. };

复制代码
回复

使用道具 举报

ID:425296 发表于 2018-12-3 11:18 | 显示全部楼层
是第四个while循环出不来
回复

使用道具 举报

ID:434807 发表于 2018-12-3 08:39 | 显示全部楼层
当while()中的语句为真时,执行一遍{}里的内容,直到()内不为真,退出该循环,执行下一步指令
回复

使用道具 举报

ID:396960 发表于 2018-12-3 09:45 | 显示全部楼层
第3个while里Move++,加到=16跳出来,又被你Move=0了,那就被你摁在第2和第3个while了。。
回复

使用道具 举报

ID:308437 发表于 2018-12-3 09:53 | 显示全部楼层
Move++;                                                 //移动一步
这里一直加,到最后,肯定就跳出循环了
回复

使用道具 举报

ID:94031 发表于 2018-12-3 09:59 | 显示全部楼层
这是循环成立的条件:while(Move<16)
每循环一次 Move++;
循环16次,就不满足循环条件,跳出循环。
回复

使用道具 举报

ID:358930 发表于 2018-12-3 10:34 | 显示全部楼层
while(tome_count<9)    //怎么样跳出这个循环????????
   {
        }                     
        
   zimuo=0;
   }
}这个不是定义吗,while(tome_count<9),就是计数大于9后为假,跳出。
回复

使用道具 举报

ID:438194 发表于 2018-12-3 12:20 来自手机 | 显示全部楼层
这是循环成立的条件:while(Move<16) 每循环一次 Move++;  循环16次,就不满足循环条件,就是让循环的条件不满足循环
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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