第二十三节:独立按键控制跑马灯的速度。(中)

  1.  if(ucLed_dr13==1)  
  2.            {  
  3.               ucLedStatus16_09=ucLedStatus16_09|0x10;  
  4.            }  
  5.            else  
  6.            {  
  7.               ucLedStatus16_09=ucLedStatus16_09&0xef;  
  8.            }  
  9.   
  10.   
  11.        if(ucLed_dr14==1)  
  12.            {  
  13.               ucLedStatus16_09=ucLedStatus16_09|0x20;  
  14.            }  
  15.            else  
  16.            {  
  17.               ucLedStatus16_09=ucLedStatus16_09&0xdf;  
  18.            }  
  19.   
  20.   
  21.        if(ucLed_dr15==1)  
  22.            {  
  23.               ucLedStatus16_09=ucLedStatus16_09|0x40;  
  24.            }  
  25.            else  
  26.            {  
  27.               ucLedStatus16_09=ucLedStatus16_09&0xbf;  
  28.            }  
  29.   
  30.   
  31.        if(ucLed_dr16==1)  
  32.            {  
  33.               ucLedStatus16_09=ucLedStatus16_09|0x80;  
  34.            }  
  35.            else  
  36.            {  
  37.               ucLedStatus16_09=ucLedStatus16_09&0x7f;  
  38.            }  
  39.   
  40.        hc595_drive(ucLedStatus16_09,ucLedStatus08_01);  //74HC595底层驱动函数  
  41.   
  42.    }  
  43. }  
  44.   
  45. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)  
  46. {  
  47.    unsigned char i;  
  48.    unsigned char ucTempData;  
  49.    hc595_sh_dr=0;  
  50.    hc595_st_dr=0;  
  51.   
  52.    ucTempData=ucLedStatusTemp16_09;  //先送高8位  
  53.    for(i=0;i<8;i++)  
  54.    {   
  55.          if(ucTempData>=0x80)hc595_ds_dr=1;  
  56.          else hc595_ds_dr=0;  
  57.   
  58.          hc595_sh_dr=0;     //SH引脚的上升沿把数据送入寄存器  
  59.          delay_short(15);   
  60.          hc595_sh_dr=1;  
  61.          delay_short(15);   
  62.   
  63.          ucTempData=ucTempData<<1;  
  64.    }  
  65.   
  66.    ucTempData=ucLedStatusTemp08_01;  //再先送低8位  
  67.    for(i=0;i<8;i++)  
  68.    {   
  69.          if(ucTempData>=0x80)hc595_ds_dr=1;  
  70.          else hc595_ds_dr=0;  
  71.   
  72.          hc595_sh_dr=0;     //SH引脚的上升沿把数据送入寄存器  
  73.          delay_short(15);   
  74.          hc595_sh_dr=1;  
  75.          delay_short(15);   
  76.   
  77.          ucTempData=ucTempData<<1;  
  78.    }  
  79.   
  80.    hc595_st_dr=0;  //ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来  
  81.    delay_short(15);   
  82.    hc595_st_dr=1;  
  83.    delay_short(15);   
  84.   
  85.    hc595_sh_dr=0;    //拉低,抗干扰就增强  
  86.    hc595_st_dr=0;  
  87.    hc595_ds_dr=0;  
  88.   
  89. }  
  90.   
  91. /* 注释一: 
  92. * 以下程序,要学会如何通过中间变量,把按键和跑马灯的任务关联起来 
  93. */  
  94.   
  95. void led_flicker_09_16() //第9个至第16个LED的跑马灯程序,逐个亮并且每次只能亮一个.  
  96. {  
  97.   switch(ucLedStep_09_16)  
  98.   {  
  99.      case 0:  
  100.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  101.            {  
  102.                uiTimeCnt_09_16=0; //时间计数器清零  
  103.   
  104.                            if(ucLedDirFlag==0)  //正方向  
  105.                            {  
  106.                   ucLed_dr16=0;  //第16个灭  
  107.                   ucLed_dr9=1;  //第9个亮  
  108.   
  109.                   ucLed_update=1;  //更新显示  
  110.                   ucLedStep_09_16=1; //切换到下一个步骤  
  111.                            }  
  112.                            else  //反方向  
  113.                            {  
  114.                   ucLed_dr15=1;  //第15个亮  
  115.                   ucLed_dr16=0;  //第16个灭  
  116.   
  117.                   ucLed_update=1;  //更新显示  
  118.                   ucLedStep_09_16=7; //返回上一个步骤  
  119.                            }  
  120.            }  
  121.            break;  
  122.      case 1:  
  123.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  124.            {  
  125.                uiTimeCnt_09_16=0; //时间计数器清零  
  126.   
  127.                            if(ucLedDirFlag==0)  //正方向  
  128.                            {  
  129.                   ucLed_dr9=0;  //第9个灭  
  130.                   ucLed_dr10=1;  //第10个亮  
  131.   
  132.                   ucLed_update=1;  //更新显示  
  133.                   ucLedStep_09_16=2; //切换到下一个步骤  
  134.                            }  
  135.                            else  //反方向  
  136.                            {  
  137.                   ucLed_dr16=1;  //第16个亮  
  138.                   ucLed_dr9=0;  //第9个灭  
  139.   
  140.                   ucLed_update=1;  //更新显示  
  141.                   ucLedStep_09_16=0; //返回上一个步骤  
  142.                            }  
  143.            }  
  144.            break;  
  145.      case 2:  
  146.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  147.            {  
  148.                uiTimeCnt_09_16=0; //时间计数器清零  
  149.   
  150.                            if(ucLedDirFlag==0)  //正方向  
  151.                            {  
  152.                   ucLed_dr10=0;  //第10个灭  
  153.                   ucLed_dr11=1;  //第11个亮  
  154.   
  155.                   ucLed_update=1;  //更新显示  
  156.                   ucLedStep_09_16=3; //切换到下一个步骤  
  157.                            }  
  158.                            else  //反方向  
  159.                            {  
  160.                   ucLed_dr9=1;  //第9个亮  
  161.                   ucLed_dr10=0;  //第10个灭  
  162.   
  163.                   ucLed_update=1;  //更新显示  
  164.                   ucLedStep_09_16=1; //返回上一个步骤  
  165.                            }  
  166.            }  
  167.            break;  
  168.      case 3:  
  169.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  170.            {  
  171.                uiTimeCnt_09_16=0; //时间计数器清零  
  172.   
  173.                            if(ucLedDirFlag==0)  //正方向  
  174.                            {  
  175.                   ucLed_dr11=0;  //第11个灭  
  176.                   ucLed_dr12=1;  //第12个亮  
  177.   
  178.                   ucLed_update=1;  //更新显示  
  179.                   ucLedStep_09_16=4; //切换到下一个步骤  
  180.                            }  
  181.                            else  //反方向  
  182.                            {  
  183.                   ucLed_dr10=1;  //第10个亮  
  184.                   ucLed_dr11=0;  //第11个灭  
  185.   
  186.                   ucLed_update=1;  //更新显示  
  187.                   ucLedStep_09_16=2; //返回上一个步骤  
  188.                            }  
  189.            }  
  190.            break;  
  191.      case 4:  
  192.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  193.            {  
  194.                uiTimeCnt_09_16=0; //时间计数器清零  
  195.   
  196.                            if(ucLedDirFlag==0)  //正方向  
  197.                            {  
  198.                   ucLed_dr12=0;  //第12个灭  
  199.                   ucLed_dr13=1;  //第13个亮  
  200.   
  201.                   ucLed_update=1;  //更新显示  
  202.                   ucLedStep_09_16=5; //切换到下一个步骤  
  203.                            }  
  204.                            else  //反方向  
  205.                            {  
  206.                   ucLed_dr11=1;  //第11个亮  
  207.                   ucLed_dr12=0;  //第12个灭  
  208.   
  209.                   ucLed_update=1;  //更新显示  
  210.                   ucLedStep_09_16=3; //返回上一个步骤  
  211.                            }  
  212.            }  
  213.            break;  
  214.      case 5:  
  215.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  216.            {  
  217.                uiTimeCnt_09_16=0; //时间计数器清零  
  218.   
  219.                            if(ucLedDirFlag==0)  //正方向  
  220.                            {  
  221.                   ucLed_dr13=0;  //第13个灭  
  222.                   ucLed_dr14=1;  //第14个亮  
  223.   
  224.                   ucLed_update=1;  //更新显示  
  225.                   ucLedStep_09_16=6; //切换到下一个步骤  
  226.                            }  
  227.                            else  //反方向  
  228.                            {  
  229.                   ucLed_dr12=1;  //第12个亮  
  230.                   ucLed_dr13=0;  //第13个灭  
  231.   
  232.                   ucLed_update=1;  //更新显示  
  233.                   ucLedStep_09_16=4; //返回上一个步骤  
  234.                            }  
  235.            }  
  236.            break;  
  237.      case 6:  
  238.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  239.            {  
  240.                uiTimeCnt_09_16=0; //时间计数器清零  
  241.   
  242.                            if(ucLedDirFlag==0)  //正方向  
  243.                            {  
  244.                   ucLed_dr14=0;  //第14个灭  
  245.                   ucLed_dr15=1;  //第15个亮  
  246.   
  247.                   ucLed_update=1;  //更新显示  
  248.                   ucLedStep_09_16=7; //切换到下一个步骤  
  249.                            }  
  250.                            else  //反方向  
  251.                            {  
  252.                   ucLed_dr13=1;  //第13个亮  
  253.                   ucLed_dr14=0;  //第14个灭  
  254.   
  255.                   ucLed_update=1;  //更新显示  
  256.                   ucLedStep_09_16=5; //返回上一个步骤  
  257.                            }  
  258.            }  
  259.            break;  
  260.      case 7:  
  261.            if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到  
  262.            {  
  263.                uiTimeCnt_09_16=0; //时间计数器清零  
  264.   
  265.                            if(ucLedDirFlag==0)  //正方向  
  266.                            {  
  267.                   ucLed_dr15=0;  //第15个灭  
  268.                   ucLed_dr16=1;  //第16个亮  
  269.   
  270.                   ucLed_update=1;  //更新显示  
  271.                   ucLedStep_09_16=0; //返回到开始处,重新开始新的一次循环  
  272.                            }  
  273.                            else  //反方向  
  274.                            {  
  275.                   ucLed_dr14=1;  //第14个亮  
  276.                   ucLed_dr15=0;  //第15个灭  
  277.   
  278.                   ucLed_update=1;  //更新显示  
  279.                   ucLedStep_09_16=6; //返回上一个步骤  
  280.                            }  
  281.            }  
  282.            break;  
  283.       
  284.    }  
  285.   
  286. }  
  287.   
  288.   
  289. void T0_time() interrupt 1  
  290. {  
  291.   TF0=0;  //清除中断标志  
  292.   TR0=0; //关中断  
  293.   
  294.   
  295.   if(uiTimeCnt_09_16<0xffff)  //设定这个条件,防止uiTimeCnt超范围。  
  296.   {  
  297.       uiTimeCnt_09_16++;  //累加定时中断的次数,  
  298.   }  
  299.   
  300.   key_scan(); //按键扫描函数  
  301.   
  302.   if(uiVoiceCnt!=0)  
  303.   {  
  304.      uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫  
  305.      beep_dr=0;  //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。  
  306.   }  
  307.   else  
  308.   {  
  309.      ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。  
  310.      beep_dr=1;  //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。  
  311.   }  
  312.   
  313.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f  
  314.   TL0=0x2f;  
  315.   TR0=1;  //开中断  
  316. }  
  317.   
  318. void delay_short(unsigned int uiDelayShort)   
  319. {  
  320.    unsigned int i;    
  321.    for(i=0;i<uiDelayShort;i++)  
  322.    {  
  323.      ;   //一个分号相当于执行一条空语句  
  324.    }  
  325. }  
  326.   
  327. void delay_long(unsigned int uiDelayLong)  
  328. {  
  329.    unsigned int i;  
  330.    unsigned int j;  
  331.    for(i=0;i<uiDelayLong;i++)  
  332.    {  
  333.       for(j=0;j<500;j++)  //内嵌循环的空指令数量  
  334.           {  
  335.              ; //一个分号相当于执行一条空语句  
  336.           }  
  337.    }  
  338. }  
  339.   
  340.   

(上http://www.eeskill.com/group/topic_scan/id/508

(下http://www.eeskill.com/group/topic_scan/id/510 

永不止步步 发表于11-20 15:43 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号