网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C2000 >> 文章正文
  TMS320LF2407 按键与走马灯程序实验         ★★★ 【字体:
TMS320LF2407 按键与走马灯程序实验
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-17    

//Main.c
//按键与走马灯程序
#include "global.c"
void SystemInit();
void Timer1Init();
void KickDog(); 
void KeyLed();
unsigned int numled0=200,numkey=0,numled=0,numled_back=200;  
unsigned int t0=0,t0_back=0,test;  
unsigned int PB6_FLAG=0;

main()

   SystemInit();          //系统初始化
  
   MCRA=MCRA & 0x80FF;      //IOPB0-6设为IO口模式
   PBDATDIR=0xBFC2;        //所有LED=0,并置IOPB6为输入口
  
   Timer1Init();           //定时器初始化
   asm(" CLRC INTM ");
   while(1)
   {
     KeyLed();
   }
  
}

void SystemInit()

 
 asm(" SETC INTM "); //关闭总中断
 asm(" CLRC  SXM  "); //禁止符号位扩展
 asm(" CLRC  CNF  ");    // B0块映射为 on-chip DARAM
 asm(" CLRC  OVM  ");    // 累加器结果正常溢出
 SCSR1=0x83FE;          // 系统时钟CLKOUT=20*2=40M
 WDCR=0x006F;   //禁止看门狗,看门狗时钟64分频
 KickDog();      // 初始化看门狗 
    IFR=0xFFFF;   // 清除中断标志
    IMR=0x0002;    //打开中断2     
   

void Timer1Init()          
{

    EVAIMRA=0x0080;   //  定时器1周期中断使能
    EVAIFRA=0xFFFF;   //  清除中断标志
    GPTCONA=0x0000;
 T1PR=2500;    //  定时器1初值,定时0.4us*2500=1ms    
 T1CNT=0;
 T1CON=0x144E;              //增模式, TPS系数40M/16=2.5M,T1使能
    

void KeyLed()
{  
  
   if((numled!=numled_back)&&((numled%200)==0))  
 { numled_back=numled; 
   
      if(numkey==1)
     { PBDATDIR=PBDATDIR & 0xFFdb;       
   if((PBDATDIR & 0x0018)==0x0018)
    PBDATDIR=PBDATDIR & 0xFFe7;  
   else
    PBDATDIR=PBDATDIR |0x1818;    
  }
      if(numkey==2)
     { PBDATDIR=PBDATDIR & 0xFFe7;
   if((PBDATDIR & 0x0024)==0x0024)
    PBDATDIR=PBDATDIR & 0xFFdb;    
   else
    PBDATDIR=PBDATDIR |0x2424;    
  }
      if(numkey==3)
     { PBDATDIR=PBDATDIR & 0xFFff;
   if((PBDATDIR & 0x003c)==0x003c)
    PBDATDIR=PBDATDIR & 0xFFc3;     
   else
    PBDATDIR=PBDATDIR |0x3c3c;    
  }
      if(numkey==4)
     { 
     
   if(numled==400)       //200ms   
   {
       PBDATDIR=PBDATDIR & 0xFFC3;     
      }
      if(numled==600)       //400ms 
        {
          PBDATDIR=PBDATDIR & 0xFFC3;     
    PBDATDIR=PBDATDIR | 0x0404;            
     } 
   if(numled==1000)       //600ms 
     {
    PBDATDIR=PBDATDIR & 0xFFC3;     
    PBDATDIR=PBDATDIR | 0x0808;   
     }
   if(numled==1600)       //800ms   
     {
    PBDATDIR=PBDATDIR & 0xFFC3;     
    PBDATDIR=PBDATDIR | 0x1010;   
     }
   if(numled==2400)       //1000ms 
     {
      PBDATDIR=PBDATDIR & 0xFFC3;     
    PBDATDIR=PBDATDIR | 0x2020;  
     } 
   if(numled==3400)        
       PBDATDIR=PBDATDIR | 0x3c3c;   
  }     
 if(numled>=3400)   numled=1; 
 
    } 
   
}
void c_int2()               //定时器1中断服务程序
{

    if(PIVR!=0x27)
  {   asm(" CLRC INTM ");
   return;
  }
 T1CNT=0;
 numled++;
 t0++;

 numled0--; 

 if(numled0==0)
 {
  numled0=200;
  if((PBDATDIR & 0x0001)==0x0001)
   PBDATDIR=PBDATDIR & 0xFFFE;     //IOPB0=0;LED灭 
  else
   PBDATDIR=PBDATDIR |0x0101;      //IOPB0=1;LED亮
 }
 if((PB6_FLAG==0)&&((t0%50)==0))         //每50ms查询一次按键
 {
  if((PBDATDIR & 0x0040)!=0x0040)  //若有按键情况,IOPB6=0
  {
   t0_back=t0; 
   PB6_FLAG=1; 
  }
 }  
 if(t0==(t0_back+100))     //按键滤波,100ms后查询仍然为低电平,则认可按键有效
 {
    t0_back=0;
  if(PB6_FLAG==1)  
  {
     PB6_FLAG=0;
        if((PBDATDIR & 0x0040)!=0x0040) //若有按键仍为低,IOPB6=0
       numkey++;
   if(numkey==4)
       numled=399;
      if(numkey==5)  numkey=1;        //按键标志循环1~4
     }   
 } 
   
 EVAIFRA=0x80;
 asm(" CLRC INTM ");  
 

void KickDog()         //踢除看门狗
{
 WDKEY=0x5555;
 WDKEY=0xAAAA;
}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号