📄 fun.c
字号:
/**************************************************************************************
龙丘MC9S12(DG128)多功能开发板
编写:邱钊鹏
Designed by Chiu Sir
E-mail:chiusir@163.com
软件版本:V1.1
最后更新:2008年11月12日
相关信息参考下列地址:
博客: http://longqiu.21ic.org
淘宝店:http://shop36265907.taobao.com
------------------------------------
Code Warrior 4.6
Target : MC9S12DG128B
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz
目录路径:F:\IVTech\
*****************************************************************************************/
#include <mc9s12dg128.h> /* derivative information */
#include "LQprintp.h"
#pragma CODE_SEG DEFAULT
void Dly_ms(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
//for(jj=0;jj<1335;jj++); //16MHz--1ms
for(jj=0;jj<2670;jj++); //32MHz--1ms
//for(jj=0;jj<4006;jj++); //48MHz--1ms
//for(jj=0;jj<5341;jj++); //64MHz--1ms
}
//-----------------------------------------------------
void Beep(void)
{
U8 tmper=125,tmdty=100;
tmper=PWMPER1;
tmdty=PWMDTY1;
PWME_PWME1 = 1;
PWMPER1 =125;
PWMDTY1 =100;
Dly_ms(60);
PWMPER1 =tmper;
PWMDTY1 =tmdty;
PWME_PWME1 = 0;
}
//-----------------------------------------------------
U8 Scan_Key(void)
{
Dly_ms(10);
if(PTIH_PTIH7==0) return 'o'; // OK
else if(PTIH_PTIH5==0) return 'd'; // DWON
else if(PTIH_PTIH6==0) return 'c'; // ESC
else if(PTIH_PTIH4==0) return 'r'; // RIGHT
else if(PTIH_PTIH3==0) return 'l'; // LEFT
else if(PTIH_PTIH2==0) return 'u'; // UP
else if(PTIH_PTIH1==0) return 'b'; // F2
else if(PTIH_PTIH0==0) return 'a'; // F1
else return 0xff;
}
U8 ReadATD(U8 ch)
{
U8 ad=0;
while(!ATD0STAT0_SCF);
switch(ch)
{
default:
case 0:
ad= ATD0DR0L;
break;
case 1:
ad= ATD0DR1L;
break;
case 2:
ad= ATD0DR2L;
break;
case 3:
ad= ATD0DR3L;
break;
case 4:
ad= ATD0DR4L;
break;
case 5:
ad= ATD0DR5L;
break;
case 6:
ad= ATD0DR6L;
break;
case 7:
ad= ATD0DR7L;
break;
}
return ad;
}
/*******************************************
* 初始化部分 *
********************************************/
void SCI_Init(void)
{
SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable
SCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1a
SCI0BDL=0x34; //SCI0BDL=busclk/(16*SCI0BDL)=19200
}
void SPI_Init(void)
{
DDRT = 0xff;
MODRR = 0x00;
SPI0CR2 = 0x10;
SPI0CR1 = 0x5e;
//SPI0BR = 0x02; //BR=2M
SPI0BR = 0x42; //BR=busclk/((SPPR + 1)· 2^(SPR + 1))=16000/(5*8)=400k
}
void InitPorts(void)
{
DDRB= 0xff; // set port B bit0 as output
PORTB=0X0;
DDRH = 0x00; // PORTH input
PERH = 0xff; // PORTH pull up
PPSH = 0x00; // Port H Polarity Select Register-falling edge
PIEH = 0x00; // PORTH interrut disable,
DDRT = 0xff; // set portT bit 3 as output
}
static void PWM_Init(void)
{
//SB,B for ch2367
//SA,A for ch0145
PWMPRCLK = 0X55; //clockA,CLK B 32分频:500khz
PWMSCLA = 0x02; //对clock SA 进行2*PWMSCLA=4分频;pwm clock=clockA/4=125KHz;
PWMSCLB = 0X02; //clk SB=clk B/(2*pwmsclb)=125KHZ
//pwm1
PWMCNT1 = 0;
PWMCAE_CAE1 =0;
PWMPOL_PPOL1=0;
PWMPER1 =125;
PWMDTY1 =100;
PWMCLK_PCLK1 = 1;
PWME_PWME1 = 0;
}
void AD_Init(void)
{
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x08; //每次转换1个序列, No FIFO, Freeze模式下继续转
ATD0CTL4=0x81; //8位精度, 采样时间为2个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=2MHz; PRS=1, divider=4
ATD0CTL5=0xA0; //右对齐无符号,,连续转换 ,1通道采样,通道零
ATD0DIEN=0x00; //禁止数字输入
}
//-----------------------------------------------------
//IOC7/PT7用于计算CS3144产生的脉冲数
static void IOC_Init(void)
{
TCTL3=0xc0;//c-输入捕捉7任何沿有效,
TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿
TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断
TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
}
void setbusclock(void)
{
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR=1;
REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
_asm(nop); //If PLL is selected (PLLSEL=1), Bus Clock = PLLCLK / 2=16M
while(!(CRGFLG_LOCK==1))
_asm(nop); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void Init_Dev(void)
{
setbusclock();
InitPorts();
PORTB=0;
PWM_Init();
SCI_Init();
SPI_Init();
AD_Init();
IOC_Init();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -