打印
[技术问题解答]

MC9S12XDT512单片机CAN发送数据的时候怎么在数码管上显示我...

[复制链接]
1313|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是白加黑|  楼主 | 2015-11-16 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------*/

/*---------------------------------------------------------*/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "CAN.h"      

#define BUZZ PORTK_PK5
#define BUZZ_dir DDRK_DDRK5
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define  BUS_CLOCK                   32000000           //总线频率
#define  OSC_CLOCK                   16000000           //晶振频率

#define ID                  0x0001       //发送标识符
#define data_len_TX          4           //发送数据长度
#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

byte data1 = 0;
byte data2 = 0;
byte data3 = 0;
byte data4 = 0;
byte single = 1;

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后加小数点对应的段码


unsigned char k;

unsigned char senddata[5] = {'1','2','3','4',0};     //发送的数据

struct can_msg msg_send, msg_get;
unsigned char datain=0;

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CRGINT = 0;                  //关中断
    CLKSEL_PLLSEL = 0;           //在未初始化PLL前不使用PLL的输出作为CPU时钟

  #if(BUS_CLOCK == 40000000)
    SYNR = 4;
  #elif(BUS_CLOCK == 32000000)
    SYNR = 3;     
  #elif(BUS_CLOCK == 24000000)
    SYNR = 2;
  #endif

    REFDV = 1;                   //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL_PLLON = 1;            //开PLL
    PLLCTL_AUTO = 1;             //选取自动模式
    while (CRG标志寄存器_LOCK == 0);    //等待PLL锁定频率
    CLKSEL_PLLSEL = 1;           //选择系统时钟由PLL产生
}

/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  TIOS  = 0xff;      //指定所有通道为输出比较方式
  TCTL1 = 0x00;            // 后四个通道设置为定时器与输出引脚断开
  TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开
  DLYCT = 0x00;            // 延迟控制功能禁止
  ICOVW = 0x00;            // 对应的寄存器允许被覆盖;  NOVWx = 1, 对应的寄存器不允许覆盖
  ICSYS = 0x00;            // 禁止IC及PAC的保持寄存器
  TIE   = 0x00;     // 禁止所有通道定时中断
  TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,,时钟周期为4us,
  T标志寄存器1 = 0xff;            // 清除各IC/OC中断标志位
  T标志寄存器2 = 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;
}
/*************************************************************/
/*                      中断扫描函数                         */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void scan(void)
{
  if(T标志寄存器1_C0F == 1)
  {
    T标志寄存器1_C0F = 1;
    TC0 = TCNT + 1250;         //设置输出比较时间为5ms
  }
  switch(single)
  {
    case 1:
      CONT1 = 1;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 0;
      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;
}
#pragma CODE_SEG DEFAULT

/*************************************************************/
/*                         延时函数                          */
/*************************************************************/
/*void delay1ms(unsigned int n)
{
    unsigned int i;
    for(i=0;i<n;i++)
    {
        T标志寄存器1_C0F = 1;              //清除标志位
        TC0 = TCNT + 250;             //设置输出比较时间为1ms
        while(T标志寄存器1_C0F == 0);      //等待,直到发生输出比较事件
    }
}
    */
        /*************************************************************/
/*                        延时函数                           */
/*************************************************************/
void delay(void)
{
unsigned int i,j;
for(j=0;j<200;j++)
for(i=0;i<60000;i++);
}

/*************************************************************/
/*                        主函数                             */
/*************************************************************/
void main(void) {
  DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  //INIT_CAN0();
  INIT_port();
  LEDCPU_dir=1;
  LEDCPU=0;
  //BUZZ_dir=1;
  //BUZZ=0;
  EnableInterrupts;

//填写报文内容
msg_send.id = ID;
  for(k=0;k<data_len_TX;k++)
  {
     msg_send.data[k] = senddata[k];
  }
  msg_send.len = data_len_TX;
  msg_send.RTR = FALSE;
  msg_send.prty = 0;

  for(;;)
  {
    //  delay1ms(500);
      if(!MSCAN0SendMsg(msg_send)) //发送过程出现错误
          BUZZ=1;
      else
       {
        T标志寄存器1_C0F = 1;
        TC0 = TCNT + 1250;         //设置输出比较时间为5ms


         data1 = 1;
         data2 = 2;
         data3 = 3;
         data4 = 4;
         delay();

  }
  }
}
我是把实例程序里的CAN发送和数码管扫描结合到一起了,可是数码管为什么不亮,求解答

相关帖子

沙发
FSL_TICS_ZJJ| | 2015-11-16 10:11 | 只看该作者
你单个调试数码管的时候,数码管是否亮呢?
如果亮的话,那么你用CAN的时候,是不是没有动态扫描数码管?

使用特权

评论回复
板凳
我是白加黑|  楼主 | 2015-11-16 20:25 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-16 10:11
你单个调试数码管的时候,数码管是否亮呢?
如果亮的话,那么你用CAN的时候,是不是没有动态扫描数码管? ...

谢谢回答,我单独调试的时候是亮的,我    else
       {
        T标志寄存器_C0F = 1;
        TC0 = TCNT + 1250;         //设置输出比较时间为5ms


         data1 = 1;
         data2 = 2;
         data3 = 3;
         data4 = 4;
         delay();

  }
  }
}这写的不是扫描数码管嘛?就是一运行到T标志寄存器_C0F=1那,没有调到中断函数。这是怎么回事。谢谢

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2015-11-17 14:56 | 只看该作者
我是白加黑 发表于 2015-11-16 20:25
谢谢回答,我单独调试的时候是亮的,我    else
       {
        T标志寄存器_C0F = 1;

那就正常了。
你不用中断动态扫,一旦你程序被其他的模块的程序,比如CAN的占用,那么就不会扫描LED,这样LED就不会亮了。
建议你用中断动态扫。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝