智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1644|回复: 2
打印 上一主题 下一主题

通过拨码开关调节中断频率,在什么地方读取开关值

[复制链接]

2

主题

10

帖子

0

精华

注册会员

Rank: 2

积分
138
威望
79
贡献
45
兑换币
33
注册时间
2013-11-27
在线时间
7 小时
跳转到指定楼层
1#
发表于 2013-12-4 18:47:52 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本人新手,写一个程序,通过调节拨码开关来控制中断频率,数码管从9999逐一减到0,拨码开关控制自减速度,通过控制中断频率实现。下面是我的代码,请问读取拨码开关值应该在哪里?#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

void main(void) {
  /* put your own code here */

  CLKSEL=0X00;                        //设置锁相环之前需要禁止锁相环,总线频率=外部晶振/2
  PLLCTL_PLLON=1;                     //打开锁相环
  SYNR=0x49;         
  REFDV=0x43;                         //Fvco=2*osc*(1+SYNDIV)/(1+REFDIV)
  POSTDIV = 0x00;                     //Fpll=Fvco/(2*POSTDIV)-----POSTDIV!=0       Fpll=Fvco
                                      //pllclock=fvco=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
  _asm(nop);                           //BUS CLOCK=40M
  _asm(nop);
  while(!(CRGFLG_LOCK==1));            // 等待锁相环初始化完成
  CLKSEL_PLLSEL =1;                    // 使用锁相环

  //读拨码开关和数码管
  DDRT &= 0xF0;                       //设置T口低4位为输入口,作为拨码开关的输入口
  DDRB = 0xFF;                        //设置B口为输出口,作为数码管的数据信号
  DDRS |= 0x0F;                       //设置s口的低4位为输出口,作为数码管的控制信号

  CRGINT_RTIE = 1;                    //开实时中断

  unsigned int a0=9;
  unsigned int a1=9;
  unsigned int a2=9;
  unsigned int a3=9;


        EnableInterrupts;


  for(;;) {

  unsigned char LedCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  //数组中的第i个元素代表显示数字i时数码管数据口的数据

  unsigned char ch ;
  ch = PTT&0x0F;                      //读取T口拨码开关的值
  switch(ch) {
    case '0x00':RTICTL = 0x0F;break; //6.10Hz
    case '0x01':RTICTL = 0x1F;break;
    case '0x02':RTICTL = 0x2F;break;
    case '0x03':RTICTL = 0x3F;break;
    case '0x04':RTICTL = 0x4F;break;
    case '0x05':RTICTL = 0x5F;break;
    case '0x06':RTICTL = 0x6F;break;
    case '0x07':RTICTL = 0x7F;break; //1.526Hz,中断频率逐渐减小

    case '0x08':RTICTL = 0x8F;break;  //中断频率1000Hz
    case '0x09':RTICTL = 0x9F;break;
    case '0x0A':RTICTL = 0xAF;break;
    case '0x0B':RTICTL = 0xBF;break;
    case '0x0C':RTICTL = 0xCF;break;
    case '0x0D':RTICTL = 0xDF;break;
    case '0x0E':RTICTL = 0xEF;break;
    case '0x0F':RTICTL = 0xFF;break; //5Hz,中断频率逐渐减小

    default:return 1;break;
  }

    //控制数码管输出  
    PTS |= 0x0F;
    PTS &= ~0x08;
    PORTB = LedCode[a3];
    count=50;
    while(count--);
    PTS |= 0x0F;
    PTS &= ~0x04;
    PORTB = LedCode[a2];
    count=50;
    while(count--);
    PTS |= 0x0F;
    PTS &= ~0x02;
    PORTB = LedCode[a1];
    count=50;
    while(count--);
    PTS |= 0x0F;
    PTS &= ~0x01;
    PORTB = LedCode[a0];  

    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 RTI_int(void) {
  DisableInterrupts;

  //控制自减
  if (a0!=0){
    a0--;
    else if (a1!=0){
      a1--;a0=9;
    else if (a2!=0){
      a2--;a1=9;a0=9;
    else if (a3!=0){
      a3--;a2=9;a1=9;a0=9;
    else
    a3=0;a2=0;a1=0;a0=0;
    }
    }
    }
  }

  CRGFLG = 0x80;                      //清楚中断标志位
  EnableInterrupts;
}
#pragma CODE_SEG DEFAULT


2

主题

10

帖子

0

精华

注册会员

Rank: 2

积分
138
威望
79
贡献
45
兑换币
33
注册时间
2013-11-27
在线时间
7 小时
3#
 楼主| 发表于 2013-12-5 19:17:24 | 只看该作者
老学童先生 发表于 2013-12-4 20:21
你的拨码开关的值???

  unsigned char ch ;
  ch = PTT&0x0F;                      //读取T口拨码开关的值
  switch(ch) {
代码里有注释
回复 支持 反对

使用道具 举报

18

主题

346

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2515

优秀会员奖章活跃会员奖章

威望
1198
贡献
703
兑换币
752
注册时间
2012-12-24
在线时间
307 小时
2#
发表于 2013-12-4 20:21:02 | 只看该作者
你的拨码开关的值???
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 21:23 , Processed in 0.068284 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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