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

📄 xf.c

📁 这是本人调试的dsp程序
💻 C
字号:
                                                    /*************************************************************
定时器中断是外设级中断,原理就是将事件管理器的中断通过内核级中断int2送到CPU,
发出中断请求,这时如果全局中断INTM为0时将会调入执行中断服务子程序
时间:2008年11月14日
 *************************************************************/

/************************文件预处理***************************/
#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(); 
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*/
  * SCSR1=0x0006;   
  * IFR=0xFFFF;   /*初始化标志寄存器*/       
} 
void timer1_ini()                //定时器1初始化子程序
{   
     /*使能内核级中断int2*/
     * IMR=0x0002;   
    /*使能T1PINT中断*/         
     * EVAIMRA=0x0080;   
    /*清EVA中断标志*/       
     * EVAIFRA=0xFFFF;   
    /*约200ms产生一次中断*/       
     * T1PER=0xF424;  
    /*计数器清零*/          
     * T1CNT=0x0000; 
    /*连续增计数模式,预分频为128,定时器计时使能,内部时钟,定时器1比较使能*/           
     * T1CON=0x170C;    
      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");
  }
} 

/*****************中断服务子程序声明与定义********************/
 interrupt void INT2()  
{   
          /*定时器1周期中断的外部中断向量是0x0027,课本259*/
       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 main(void)
{  
  sys_ini(); 
  timer1_ini();
  lcd_ini();
  asm(" CLRC INTM");   /*开总中断*/
  * T1CON=* T1CON|0x0040;  /*使能定时器1*/
     
     //port8002=0x92;
      //lcd_show(b);
   //delay_ms();
 
 
while(1)
 { 
//delay_ms();

  lcd_showtime(dis_buf);
//delay_ms();
 }
}

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

⌨️ 快捷键说明

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