第二十二节:独立按键控制跑马灯的方向。(下)

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

总结陈词:
这一节讲了独立按键控制跑马灯的方向。如果按键要控制跑马灯的速度,我们该怎么编写程序呢?欲知详情,请听下回分解-----独立按键控制跑马灯的速度。

(上半部分http://www.eeskill.com/group/topic_scan/id/506

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

已有0条评论

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

添加一条新评论

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

话题作者

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

x

畅学电子网订阅号