/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
#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发送和数码管扫描结合到一起了,可是数码管为什么不亮,求解答
|