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

📄 main.c

📁 freecale 公司16位单片机芯片资料
💻 C
字号:
/*****************************************************************************/
/* 文 件 名: infrared.cmp                                                    */ 	       
/* 程序描述: 本程序为综合测试程序,对子板和母板的各个功能模块进行测试。      */
/* 硬件连接: 见<<程序使用说明>>。                                            */
/*           1、键盘扫描:PH0-PH7 口用来键盘中断扫描;其中PH0-PH3为中断输入  */
/*              PH4-PH7用来扫描输出                                          */ 
/*           2、串口输入输出模块:PS2、PS3口分别作输入输出口								 */
/*           3、液晶显示模块:PT口作数据传输端,PB口作数据控制端              */
/*           4、PWM模块:PP1作输出端以控制蜂鸣器或喇叭发出声音               */
/*           5、LED显示模块:PP4-PP7 和PJ6 PJ7作六个LED的显示输出端          */
/*           6、AD模块:PAD00作AD转换端,并将值送入第二个和第三个数码管显示  */
/*							第一个数码管显示"A"取"AD"中"A"的意思。                       */
/*           7、数码管显示模块:PB0-PB3作位选,PA1-PA6作段选。                */
/*           8、时钟模块:用用modulus-dowm-counter每0.1秒中断一次来控制数码管*/
/*              第八段(DP)每秒闪耀一次。                                   */					
/*****************************************************************************/

#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


//[以下为子程序源代码]
//[头文件]
#define  LcdData    PTT      //Lcd显示数据传送口
#define  LcdData_D  DDRT    //数据口方向寄存器
#define  LcdCtrl    PORTB        //Lcd控制信号传送口
#define  LcdCtrl_D  DDRB    //控制口方向寄存器
#define  LcdRS      7           //Lcd寄存器选择信号PTB7
#define  LcdRW      6           //读写信号接PTB6
#define  LcdE       5           //Lcd使能信号接PTB5
//内部调用子程序
void SYS_init(void);
void Lcd_Command(unsigned char cmd); //命令执行子程序
void LcdInit(void);                  //Lcd初始化子程序
void lcdshow(unsigned char str[]);
void PWM_init(void);
void ATD_Init(void);
void SCI1Init(void);

//数码管显示编码
const unsigned char sgcode[20]={
  0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0,0x40,0x49,0x66} ; //0-F black  -,三 ,||


unsigned char lcdbuf[]="==>> http:/ /jsj.tjpu.edu.cn/mcu";
unsigned char dpbuf[4];
uchar msec=0;
 
void main(void){	
  
  uchar i,temp,sk2,k;
  uint n;
  SYS_init();
  
         
  while(!(PORTAD0==0XFF));
  PTJ_PTJ6=0;                //灯亮 说明上述没有问题
  while(!(PORTAD1==0XFF));
  PTJ_PTJ7=0;                //灯亮说明上述没有问题
  
  
  for(k=0;k<32;k++){
  SCI1DRL=lcdbuf[k];while(!SCI1SR1_TDRE);	  //将要发送的数据传送给SCI数据寄存器,等待发送数据寄存器为空
  }
  EnableInterrupts;
  lcdshow((unsigned char *)lcdbuf);
   	//程序总循环入口
  	for(;;) {	
	     
	     for(i=0;i<4;i++){  
	      PORTA=sgcode[dpbuf[i]];       //发送编码到LED
	      if(i==0&&msec<=15){ 
	        PORTA=sgcode[dpbuf[i]]+0x80;  
  			}    			
  	    
         switch(i){                                                                     
           case 0:PTH=0xfe;PORTB=1;break;					 
           case 1:PTH=0xfd;PORTB=2;break;					 
           case 2:PTH=0xfb;PORTB=4;break;					
           case 3:PTH=0xf7;PORTB=8;break;					 
           }
    
	        //判断串行通信接口是否接收到数据 ,并发送收到的数据         
        for(n=600;n>0;n--) {
         if(SCI1SR1_RDRF){							//等待接受数据寄存器满
            sk2=SCI1DRL;SCI1DRL=sk2;
          
          }
        }
        
 
                                                                                    
         temp=0xff-(PTH|0x0f);
   
         if(temp!=0){											 //判断是否有键按下
            switch(temp){
              case 0x10:temp=0+i;break;			 //PTH4这行有键按下,键值为0、1、2、3
              case 0x20:temp=4+i;break;			 //PTH5这行有键按下,键值为4、5、6、7
              case 0x40:temp=8+i;break;			 //PTH6这行有键按下,键值为8、9、10、11
              case 0x80:temp=12+i;break;		 //PTH7这行有键按下,键值为12、13、14、15
              }
            dpbuf[0]=temp; 										 //将键值送到显示缓存
          }

        
       if(msec==30){
        msec=0;         
	      while(!ATD0STAT0_SCF); 	        	//等待转换完成
	         dpbuf[3]=10;                   
           dpbuf[2]=(uchar)ATD0DR0L>>4;  	
           dpbuf[1]=(uchar)ATD0DR0L&15;		
       }
	   }
   }
 }
void SYS_init(void){
   DDRA=0XFF; //LED DATA
   DDRB=0XFF; //LED SELECT ,LCD CONTROL; 
   DDRH=0X0F; 
   PERH=0XF0;
   
   DDRS=0XF0;//0-3为串口,4-7用于输出
   PTS=0xff;
   
   DDRP=0XFF;
   PTP=0X0F;
   
   DDRK=0XFF;
   PORTK=0XF0;
   
   DDRJ=0XFF;
   PTJ=0XFF;
  
   DDRM=0XFF;
   PTM=0XFF;
   
   ATD1DIEN=0XFF;  //作数字输入口
   ATD0DIEN=0XFE;  //除最低位为AD输入,其余作数字输入口
   
   MCCTL=0xc7;
   MCCNT=0xc530;
   ATD_Init();
   PWM_init();
   SCI1Init();
   LcdInit();               //调用Lcd初始化子程序                                                           
}

void SCI1Init(void){
  SCI1BDL=156;  //SCI baud rate=SCI module clock/16*SCIBD=9600
  SCI1CR2=0x0c;//enables the SCI receiver and transmitter.
} 

void ATD_Init(void){
   ATD0CTL3=0b00001000;
   ATD0CTL4=0b11100110;
   ATD0CTL5=0b10100000;    
   ATD0CTL2=0b11000000;
}
 
  
 void PWM_init(void){
 //pwm0.pwm1																				  
 	PWMCTL_CON01=1;				//0和1联合成16位PWM;
  PWMCAE_CAE1=0;			  //选择输出模式为左对齐输出模式
  PWMCNT01 = 0;					//计数器清零;
  PWMPOL_PPOL1=1;				 //先输出高电平,计数到DTY时,反转电平
  PWMPRCLK = 0;            //clockA不分频;  clockA=busclock;          
  PWMSCLA = 12;           //对clock SA 进行24分频;pwm clock=clockA/24=1MHz;
  PWMDTY01 = 1500;        //高电平时间为1.5ms;            
  PWMPER01 = 20000;       //周期20ms; 50Hz;                  
  PWMCLK_PCLK1 = 1;       //选择clock SA做时钟源;            
  PWME_PWME1 = 1;         //开启PWM             
 
  }		  
 

void lcdshow(unsigned char str[])
  {	 	
    unsigned char i;
   // LcdInit();               //调用Lcd初始化子程序
 	//显示第1行16个字符
 	  LcdCtrl&=~(1<<LcdRS);      //RS、R/W=00,写指令
	  LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b10000000); //后7位为DDRAM地址0x00 
  	LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
    LcdCtrl&=~(1<<LcdRW);
   	for (i=0;i<16;i++)       //逐个显示
       Lcd_Command(str[i]);
    //显示第2行16个字符
   	LcdCtrl&=~(1<<LcdRS);    //RS、R/W=00,写指令
  	LcdCtrl&=~(1<<LcdRW);    
  	Lcd_Command(0b11000000); //后7位为DDRAM地址0x40 
	  LcdCtrl|=1<<LcdRS;		 //RS、R/W=10,写数据到DDRAM中
	  LcdCtrl&=~(1<<LcdRW);
    for (i=16;i<32;i++)      //逐个显示
	    Lcd_Command(str[i]);
   }
   
 
  
/*LcdInit:初始化Lcd------------------------------------*
*功  能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1  *
*参  数:无                                             *
*返  回:无                                             *
*-----------------------------------------------------*/
void LcdInit(void)
  {
    unsigned char i,j;
    LcdData_D=0b11111111;     //数据口为输出
    LcdCtrl_D|=(1<<LcdE);     //控制口低三位为输出
    LcdCtrl_D|=(1<<LcdRS); 
    LcdCtrl_D|=(1<<LcdRW); 
    LcdCtrl|=(1<<LcdE);       //E=1
    LcdCtrl&=~(1<<LcdRS);     //RS、R/W=00,写指令
    LcdCtrl&=~(1<<LcdRW);    
    Lcd_Command(0b00111000);  //8位数据接口,2行,5*7点阵
    Lcd_Command(0b00001000);  //关显示,关光标显示,不闪烁	
    Lcd_Command(0b00000001);  //清屏
    for(i=0;i<53;i++){
      for(j=0;j<250;j++);
    }       //延时
    
    Lcd_Command(0b00010100);  //光标右移一个字符位,AC自
                              //  动加1
    Lcd_Command(0b00001100);  //开显示,关光标显示,不闪烁
  }
/*Lcd_Command:执行给定的cmd命令------------------------*
*功  能:执行给定的cmd命令,且延时                       *
*参  数:cmd:待执行的命令                               *
*返  回:无                                             *
*-----------------------------------------------------*/
void Lcd_Command(unsigned char cmd)
  {	 	
    unsigned char i;	 
    for (i=0;i<200;i++);    //等待
    for (i=0;i<150;i++);
    LcdData=cmd;	         //把指令码送到Lcd数据传送口
    LcdCtrl|=(1<<LcdE);    //Lcd开始接收数据
    asm("NOP");
    asm("NOP");
    asm("NOP");
    LcdCtrl&=~(1<<LcdE);   //Lcd结束接收数据
    for (i=0;i<200;i++);    //等待
    for (i=0;i<150;i++);
  }
  
  
  
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt  void interrupt_MCCNT(void) {
  DisableInterrupts;
  msec++;
  MCFLG_MCZF=1;
  EnableInterrupts;
}


  


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -