智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3229|回复: 1
打印 上一主题 下一主题

xs128的一段秒表程序

[复制链接]

3

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
395
威望
253
贡献
104
兑换币
35
注册时间
2012-3-2
在线时间
19 小时
毕业学校
安徽工业大学工商学院
跳转到指定楼层
1#
发表于 2012-3-9 10:32:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define CONT1 PORTK_PK3
#define CONT2 PORTK_PK2
#define CONT3 PORTK_PK1
#define CONT4 PORTK_PK0
#define CONT1_dir DDRK_DDRK3
#define CONT2_dir DDRK_DDRK2
#define CONT3_dir DDRK_DDRK1
#define CONT4_dir DDRK_DDRK0
#define DATA PTP
#define DATA_dir DDRP
#define KEY1 PTIH_PTIH3
#define KEY1_dir DDRH_DDRH3
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define  BUS_CLOCK     32000000    //总线频率
#define  OSC_CLOCK     16000000    //晶振频率
byte data1 = 0;
byte data2 = 10;
byte data3 = 0;
byte data4 = 0;
byte single = 1;
unsigned char miao=0,shihaomiao=0;
unsigned char statesingle = 0;   //0为等待,1为开始计时,2为计时结束  
unsigned int temp;
byte shuma[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,       //0~9对应的段码
                0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};      //0~9后加小数点对应的段码
/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif
    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}
/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  TIOS  = 0xff;      //指定所有通道为输出比较方式
  TCTL1 = 0x00;     // 后四个通道设置为定时器与输出引脚断开
  TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开
  TIE   = 0x01;     // 允许通道0定时中断
  TSCR2 = 0x07;     // 预分频系数pr2-pr0:111,,时钟周期为4us,
  TFLG1 = 0xff;     // 清除各IC/OC中断标志位
  TFLG2 = 0xff;     // 清除自由定时器中断标志位
}
/*************************************************************/
/*                      初始化端口                           */
/*************************************************************/
void INIT_port(void)
{
  CONT1_dir = 1;
  CONT2_dir = 1;
  CONT3_dir = 1;
  CONT4_dir = 1;
  CONT1 = 0;
  CONT2 = 0;
  CONT3 = 0;
  CONT4 = 0;
  DATA_dir = 0xff;
  DATA = 0x00;
}
/*************************************************************/
/*                      初始化按键                           */
/*************************************************************/
void INIT_KEY(void)
{
    KEY1_dir=0;
    PPSH = 0x00;        //极性选择寄存器,选择下降沿;
    PIFH = 0xFF;     //对PIFH的每一位写1来清除标志位;
    PIEH = 0x08;        //中断使能寄存器;
}
/*************************************************************/
/*                        延时函数                           */
/*************************************************************/
void delay(void)
{
unsigned int i,j;
for(j=0;j<200;j++)
for(i=0;i<60000;i++);
}
/*************************************************************/
/*                      中断扫描函数                         */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void scan(void)
{
  if(TFLG1_C0F == 1)
  {
    TFLG1_C0F = 1;
    TC0 = TCNT + 1250;         //设置输出比较时间为5ms
  }
  switch(single)
  {
    case 1:
      CONT1 = 1;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 0;
      if(data1==0)
        DATA=0;
      else
        DATA=shuma[data1];
      break;
    case 2:
      CONT1 = 0;
      CONT2 = 1;
      CONT3 = 0;
      CONT4 = 0;
      DATA=shuma[data2];
      break;
    case 3:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 1;
      CONT4 = 0;
      DATA=shuma[data3];
      break;
    case 4:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 1;
      DATA=shuma[data4];
      break;
   
    default:
      break;
  }
  
  single +=1;
  if(single == 5) single = 1;
}
/*************************************************************/
/*                       按键中断函数                        */
/*************************************************************/
interrupt void PTH_inter(void)
{
   if(PIFH != 0)     //判断中断标志
   {
      PIFH = 0xff;     //清除中断标志
      if(KEY1 == 0)         //按键1按下
      {
          switch(statesingle)
          {
            case 0:
              statesingle=1;
              TFLG1_C1F = 1;
              TC1 = TCNT + 2500;         //设置输出比较时间为10ms
              TIE_C1I=1;
              break;
           
            case 1:
              statesingle=2;
              TIE_C1I=0;     //禁止中断
              break;
            
            case 2:
              statesingle=0;
              data1 = 0;
              data2 = 10;
              data3 = 0;
              data4 = 0;
              miao=0;
              shihaomiao=0;
              break;
              
          }
      }
   }
}
/*************************************************************/
/*                  输出比较计时中断函数                     */
/*************************************************************/
interrupt void T1_inter(void)
{
  if(TFLG1_C1F == 1)
  {
    TFLG1_C1F = 1;
    TC1 = TCNT + 2500;         //设置输出比较时间为10ms
  }
  shihaomiao+=1;
  if(shihaomiao==100)
  {
      shihaomiao =0;
      miao+=1;
  }
  if(miao==100)
  {
      miao = 0;
      shihaomiao = 0;
  }
  data1=miao/10;
  data2=miao%10;
  data2=data2+10;       //加小数点
  data3=shihaomiao/10;
  data4=shihaomiao%10;
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void) {
  DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  INIT_port();
  INIT_KEY();
  LEDCPU_dir=1;
  LEDCPU=0;
  EnableInterrupts;
  TFLG1_C0F= 1;  
TC0 = TCNT + 1250;        //设置输出比较时间为5ms

  for(;;) {
  }
}


主要是不懂程序运行到后来的时候 中断扫描 按键中断 输出扫描中断这三函数的最后执行过程 是从哪个到那个 不断的运行然后输出结果的 还有一个就是TC0 = TCNT + 1250;  这是如何设置输出比较时间的 最后又是怎么输出比较的

0

主题

17

帖子

0

精华

注册会员

Rank: 2

积分
92
威望
56
贡献
24
兑换币
25
注册时间
2012-11-30
在线时间
6 小时
毕业学校
中科大
2#
发表于 2012-12-27 18:09:50 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 14:14 , Processed in 0.044915 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表