⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fun.c

📁 mc9s12dg128b单片机操作SD的源码
💻 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 + -