⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xf.c

📁 这是本人调试的DSP程序
💻 C
字号:
/*************************************************************
定时器中断是外设级中断,原理就是将事件管理器的中断通过内核级中断int2送到CPU,
发出中断请求,这时如果全局中断INTM为0时将会调入执行中断服务子程序
时间:2009年3月8日
注意:关键是有些中断需定义成全局的          
 *************************************************************/

/************************文件预处理***************************/
#include "exp3_2407.h"
#include "stdio.h"
ioport short port8001;       //输出端口地址定义
unsigned int flag=0,sec=0,min=0,hour=0;
unsigned char dis_buf[8]; 
void inc_sec(); 
void inc_min(); 
void inc_hour(); 
void SheZhi();
unsigned char xianshi;
char send_buff=0x00;//发送指令
char rece_buff=0x00;//接收指令
  unsigned char m[]="设置时间:";
unsigned int data_buff=0x0000;
ioport unsigned port8002;       //写lcd指令地址
ioport unsigned port8003;       //写lcd数据地址
/*******************函数、子程序声明与定义********************/
void sys_ini()               //系统初始化子程序
{
 /*关总中断*/
  asm(" setc INTM");         
 /*抑制符号位扩展*/
  asm(" clrc SXM");          
 /*累加器中结果正常溢出*/
  asm(" clrc OVM");          
 /*禁止看门狗*/
  * WDCR=0x00E8;             
 /*CLKIN=10M,CLKOUT=40M,使能evb外围模块*/
  * SCSR1=0x0008;            
 /*将iope1,2,3配置为输出脚 ,且iope3初始值为0,iope1,iope2初始值为1*/
  * PEDATDIR=0x0E06;        
 /*将iopf6配置为输出脚,且iopf6初始值为1|这四个端口分别连接7279的四个控制端口*/ 
  * PFDATDIR=0x4040;                                                 
 /*清除所有中断标志,"写1清0"*/ 
  * IFR=0xFFFF;                        
} 
void timer1_ini()                //定时器1初始化子程序
{   
     /*使能内核级中断int2*/
     * IMR=0x0002;   
    /*使能T1PINT中断*/         
     * EVAIMRA=0x0080;   
    /*清EVA中断标志*/       
     //* EVAIFRA=0xFFFF;   
    /*约200ms产生一次中断*/       
     * T1PER=0xF424;  
    /*计数器清零*/          
     * T1CNT=0x0000; 
    /*连续增计数模式,预分频为128,定时器计时使能,内部时钟,定时器1比较使能*/           
     * T1CON=0x174C;    
      asm(" clrc INTM");
}  

void delay_ms()            //延时40ms
{
  unsigned int k;
  for(k=0;k<10000;k++);
}

void delay_us()           //延时100us
{
  unsigned int k;
  for(k=0;k<25;k++);
}
 
void lcd_ini()
{
  delay_ms();                //延时40ms
  port8002=0x0030;           //8位控制界面,基本指令集
  delay_us();
  port8002=0x0030;           //8位控制界面,基本指令集
  delay_us();
  port8002=0x000C;           //整体显示,显示游标 ,显示游标位置
  delay_us();
  port8002=0x0001;           //清除显示
  delay_ms();
  port8002=0x0006;           //光标右移
  delay_us();
}  

void lcd_show(unsigned char a[])
{
int x;
unsigned  char * string=a;
port8002=0x0001; 
  for(x=0;x<strlen(a);x++)
  {//asm(" setc INTM");
    port8003=* string;
    string++;
    delay_us();
    //asm(" CLRC INTM");
  }
} 
void lcd_show1(char a)
{
    port8003=a;
    delay_us(1000000);
 
}
/*****************中断服务子程序声明与定义********************/
 interrupt void INT2()  
{   
     
       flag++;
       if(flag%5==0)sec++;  /*点亮LED1灯,1秒钟*/
       inc_sec();
       inc_min();
       inc_hour();
* EVAIFRA=* EVAIFRA&0x0080; /*清除定时器1周期中断标志,必须手动清除,否则将会忽略下次中断*/
* T1CNT=0x0000; /*定时器1计数器清0*/


}
void inc_sec()
{ if(sec>59)
{ sec=0;
  min++;}
  
dis_buf[0]=sec%10|0x30;
dis_buf[1]=sec/10|0x30;
}
void inc_min()
{ if(min>59)
{ min=0;
 hour++;}
  
dis_buf[3]=min%10|0x30;
dis_buf[4]=min/10|0x30;
}
void inc_hour()
{ if(hour>=23)
{ hour=0;
  }
  
dis_buf[6]=hour%10;
dis_buf[7]=hour/10;
}

void interrupt nothing()     //哑中断子程序
{
  return;         
}

void lcd_dat(unsigned char dat)  //显示单个字符
{
		
   port8003=dat;
   delay_us(); 

}

void lcd_showtime(unsigned char dis_buf[8])
{ unsigned  char b[]="当前时间";
     dis_buf[2]=':';
     dis_buf[5]=':';
     inc_sec();
       inc_min();
       inc_hour();
      port8002=0x92;   
      lcd_show(b);
      delay_ms();
     port8002=0x8A; 
      delay_ms();
     lcd_dat(dis_buf[7]|0x30);
     lcd_dat(dis_buf[6]|0x30);
     lcd_dat(dis_buf[2]);
     lcd_dat(dis_buf[4]|0x30);
     lcd_dat(dis_buf[3]|0x30);
     lcd_dat(dis_buf[5]);
     lcd_dat(dis_buf[1]|0x30);
     lcd_dat(dis_buf[0]|0x30);
     
}

///////////////////////////////////////////////////////////
void pdpintb_ini()              //int1中断初始化子程序
{
    
    /*清除所有中断标志*/
     * IFR=0xFFFF;     

    /*使能中断1*/         
     * IMR=0x0001;      
    /*清除pdpintb中断标志*/        
     * EVBIFRA=0xFFFF;   
    /*使能pdpintb中断,功率驱动保护中断使能*/       
     * EVBIMRA=0x0001;   
    /*开总中断*/       
     asm(" clrc INTM");          
}

void delay_8us()             //延时8us子程序
{
     unsigned int i;
     for(i=0;i<2;i++); 
}

void delay_50us()            //延时50us子程序
{
     unsigned int j;
     for(j=0;j<25;j++);
}

void delay_25ms()            //延时25ms子程序
{
     unsigned int k;
     for(k=0;k<12500;k++);
}

void delay_long()
{
     unsigned int n;
     for(n=0;n<60000;n++);
     for(n=0;n<60000;n++);
}

void cs_high()
{
          * PFDATDIR|=0x0040; //7279cs高 
}

void cs_low()
{
          * PFDATDIR&=0xFFBF; //7279cs低
}

void send()
{         
          unsigned int m;
          cs_low();
          delay_50us();                 //延时50us,等待CLK时钟脉冲;
          for(m=0;m<8;m++)
          {
               switch(send_buff&0x80)
               {
                   case 0x00:* PEDATDIR&=0xFFFB;break; //7279data低 
                   case 0x80:* PEDATDIR|=0x0004; //7279data高  
               }
               * PEDATDIR|=0x0008; //7279clk高 ,产生同步时钟上升沿以使数据有效
               delay_8us();
               * PEDATDIR&=0xFFF7; //7279clk低   // 完成一个时钟脉冲
               delay_8us();
               send_buff<<=1;  //左移接受下一位数据
           }

}
/*7279作为接收方接收数据*/
void receive()
{
         unsigned int s;
       unsigned char num;
         * PEDATDIR&=0xFBFD;   //将iope2配置为输入脚
         delay_50us();
         for(s=0;s<8;s++)
        {//接收数据是在高电平状态下完成的
            * PEDATDIR|=0x0008; //7279clk高
          delay_8us();
            //前八位是指令,后八位是接收的数据
           data_buff=data_buff|((* PEDATDIR&0x0004)<<(13-s));//读iope2引脚数据;  * PEDATDIR高八位没用
            * PEDATDIR&=0xFFF7; //7279clk低
           delay_8us();
         }    
        rece_buff=data_buff>>8;
        
       /*for(s=0;s<8;s++)
    {
       * PEDATDIR|=0x0008; //7279clk高
        delay_50us();
        num=* PEDATDIR&0xFBFD;
        if(num)
       { 
        
        rece_buff= * PEDATDIR&0x0004;
       rece_buff<<=1;
          rece_buff= rece_buff|0x0004;               
       }
 * PEDATDIR&=0xFFF7; //7279clk低
           delay_8us();
     }
    rece_buff>>=3;*/ 
      //  return(rece_buff);
      data_buff=0x0000;          //清除data_buff              
         * PEDATDIR|=0x0402; //将iope2配置为输出脚,7279收数据
}




interrupt void pdpintb()
{
     send_buff=0x15;    //读键值指令
     send();
     receive();
     send_buff=0xA0; //数据右移指令
     send();
     send_buff=0xC8;
     send();
     
     send_buff=rece_buff;//将接收到的键值送显示
      send();
     // SheZhi();
//xinshi=rece_buff;
     /*if(xianshi<0xA){
     lcd_show1(xianshi+48);}
     else lcd_show1(xianshi+55);*/ 
     * EVBIFRA=0xFFFF;  //清除PDPINTB中断标志 
     return;
}

/*unsigned char read7279(unsigned char command)
{send_buff=command;
send(command);
return(receive());
}*/





////////////////////////识别按键改写时间程序(未写完)//////////////////////////
void SheZhi()
{    unsigned char  key_number;
  unsigned int i=0,status=0;           //状态值
   unsigned char m[]="设置时间:";
   unsigned char shezhi[8];
  // * T1CON=* T1CON|0x0040;  /*使能定时器1*/
 if(* PEDATDIR&0xFBFD)
 { 
  if (rece_buff==0x0c)    //如果设置键按下
  {   status=1;
      port8002=0x0001; 
      port8002=0x92; 
      lcd_show(m);
      delay_ms();
                                              
   }    
        
else {if(status==0)lcd_showtime(dis_buf);  
else
{
     port8002=0x8A; 
      //delay_ms();
      lcd_dat(shezhi[6]); 
      lcd_dat(shezhi[7]);
     

     // for(i=0;i<6;i++)
     // { {if(* PEDATDIR&0xFBFD)
         // shezhi[i]=rece_buff&0x0F;   
     //lcd_dat(shezhi[i]|0x30);}
     // } 
      

      


}
   }
  }
 else  lcd_showtime(dis_buf);


}



/**************************主程序*****************************/
void main(void)
{  
   sys_ini(); 
   
  timer1_ini();
  pdpintb_ini(); 
  lcd_ini();
 
    //asm(" CLRC INTM");   /*开总中断*/
 // * T1CON=* T1CON|0x0040;  /*使能定时器1*/
  
while(1)
 {    
delay_ms();
SheZhi();
  
delay_ms();

 /*if (rece_buff==0x0c)    //如果功能键按下
  {   
      //port8002=0x0001; 
     while(1)
     {
      port8002=0x92; 
       delay_ms();
      lcd_show(m);}
     //if (status<3)       //如果状态值小于最大状态值,则状态值加1
       // status++;
       // else status=0;   //否则,状态值置最小状态值
        //rece_buff=0;              //清键值
        if(rece_buff==0x0a)lcd_showtime(dis_buf);
  }

else lcd_showtime(dis_buf);*/

 }
}

/***************************结束******************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -