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

📄 main.c

📁 此为基于ARM7编写的,采用周立功LPC2131系列ARM编写,用的是C语言,实现的是DDS AD9850 正弦波产生,晶振(参考频率)为PWM6产生,外围电路参照有关电路,不管何总都一样.
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:           main.c
** Last modified Date:  2007-02
** Last Version:        1.0
** Descriptions:        The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:      	 wxw
** Created date:        2007-02
** Version:         	1.0
** Descriptions:        The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:         wxw
** Modified date:       2007-02
** Version:
** Descriptions:        键盘输入与LED扫描人机对话程序。
**
********************************************************************************************************/
#include  "config.h" 
#define W_CLK0 IO0CLR=IO0CLR&(~(1<<8))|(1<<8);//P0.8为W-CLK,W_CLK清零
#define W_CLK1 IO0SET=IO0SET&(~(1<<8))|(1<<8);//W_CLK置一
#define FQ_UD0 IO0CLR=IO0CLR&(~(1<<10))|(1<<10);//P0.10,FQ_UD清零
#define FQ_UD1 IO0SET=IO0SET&(~(1<<10))|(1<<10);//FQ_UD置一
#define DATE0 IO0CLR=IO0CLR&(~(1<<11))|(1<<11);//P0.11,DATE清零
#define DATE1 IO0SET=IO0SET&(~(1<<11))|(1<<11);//DATE置一

#define   KEY            (1 << 5)      // P0.5口(MISO)为按键输入脚
uint8  T0Flag = 0;
uint32  CS[6]={150,1200,1000,2222,3333,4444};      //可以输入的参数数组
uint8  DATA0[8];
uint8  a[5]={0x55,0x55,0x55,0x08,0x10};//40位控制字   		
uint8  digitable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};	//显示段码表
uint8  selectable[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};				//显示位码表
uint8  x=0,k=0;  //变量,k对DATA0&DATA1&selectable;x&y对digitable;
uint8  w=0;              //显示刷新时间计数器
uint8 SF=0;              //闪烁标志位
uint8 TK=0x09;           //按键按下记录位寄存器,有效数据位为0~7
uint8 M=0,R=0;           //按键选项计数器
/*******************************************************************************************
** 函数名称:signalproduct()
** 功能描述:方波发生
** 入口参数:f频率,a%100占空比
** 出口参数:无
******************************************/

 int signalproduct (uint16 f,uint16 a )
{uint16 d;
 uint16 t;
  PINSEL0=(PINSEL0&0XFFF3FFFF)|(0X00080000);
 d=a/100;
  t=a%100;
  
  
 // if(d==1) PWMMR0=Fpclk/f;
   //else 
    PWMMR0=Fpclk/(f*1000);
    
   
  PWMMR6=PWMMR0*t/100;
  PWMLER=0X41;
  PWMTCR=0X09;
  
    return 0;
}
/*******************************************************************************************
** 函数名称:Timer0_InitExt()
** 功能描述:TIMER0 初始化
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void Timer0_InitExt(void)
{
    T0TC   = 0;         /* 定时器设置为0							*/
    T0PR   = 0;         /* 时钟不分频   							*/
    T0MCR  = 0x03;      /* 设置T0MR0匹配后复位T0TC,并产生中断标志	*/
    T0MR0  = Fpclk/400; /* 2.5毫秒定时          					*/
    T0TCR  = 0x01;      /* 启动定时器   							*/
}


//-----------------delayns----------------------
void delays(void)
{ uint8 i,j;
   for(i=120;i>0;i--)
     for(j=50;j>0;j--);
}
/*-----------------------------------------------*/


/*******************************************************************************************
** 函数名称:IRQ_Timer0()
** 功能描述:TIMER0 中断服务程序
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void __irq IRQ_Timer0(void)
{
    T0Flag = 1;                         	// T0中断标志置位
    T0IR = 0x01;                    		// 清除中断标志
    VICVectAddr = 0;
}

/*******************************************************************************************
** 函数名称:IRQ_Init()
** 功能描述:设置定时器0中断IRQ
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void IRQ_Init(void)
{   
    VICIntSelect = 0x00;                // 所有中断通道设置为IRQ中断			
    VICVectCntl0 = 0x20 | 0x04;         // 设置定时器0中断通道分配最高优先级	
    VICVectAddr0 = (uint32)IRQ_Timer0;  // 设置中断服务程序地址 				
    VICIntEnable = 1 << 0x04;           // 使能定时器0中断						
}


//二进制数转BCD码子程序0
void CONVBIT0(uint16 num,uint8 hor)
{   
DATA0[hor+3] = num/1000;                  //计算千位
DATA0[hor+2] = num%1000/100;            //计算百位
DATA0[hor+1] = num%100/10;              //计算十位
DATA0[hor]   = num%10/1;                //计算个位

}

/********************************************************************************************************
** 函数名称:MSPI_Init()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void  MSPI_Init(void)
{  
    //PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;    // 设置管脚连接SPI0
    PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
    //PINSEL1 = (PINSEL0 & 0xFFFF0C03) | 0x00000154;    // 设置管脚连接SPI1
   
    SPI_SPCCR = 0x52;                   // 设置SPI时钟分频
    SPI_SPCR  = (0 << 3) |              // CPHA = 0, 数据在SCK 的第一个时钟沿采样
            (1 << 4) |              // CPOL = 1, SCK 为低有效
            (1 << 5) |              // MSTR = 1, SPI 处于主模式
            (0 << 6) |              // LSBF = 0, SPI 数据传输MSB (位7)在先
            (0 << 7);               // SPIE = 0, SPI 中断被禁止
}

/********************************************************************************************************
** 函数名称:MSPI_SendData()
** 函数功能:向SPI总线发送数据。
** 入口参数:data   待发送的数据
** 出口参数:返回值为读取的数据
********************************************************************************************************/
uint8  MSPI_SendData(uint8 data)
{  
    SPI_SPDR = data;
    while( 0 == (SPI_SPSR & 0x80));     // 等待SPIF置位,即等待数据发送完毕
    return(SPI_SPDR);
}

/***********************************************************************************************
** 函数名称:SendByte()
** 函数功能:发送一个字节
** 入口参数:bbyte		字节数据
** 出口参数:无
***********************************************************************************************/
void SendByte(uint32 bbyte) 
{
	uint8 q;
	 
	 for(q=0;q<40;q++)
	 {
		if( (bbyte&0x01)!=0 )  DATE1//SID=bbyte&0x80;取出最高位
    	else                  //
    	 DATE0 				
    	__asm
    	{
    	   nop
    	  
    	 }
		
		W_CLK1			
						//SCLK=1;
		__asm
    	{
    	   nop
    	  
    	 }
		
	 	W_CLK0							//SCLK=0;
	 	bbyte>>=1; 							//左移
	 } 
	  FQ_UD1							//SCLK=1;
		__asm
    	{
    	   nop
    	  
    	 }
		
	 	FQ_UD0 
}    
/********************************************************************************************************
** 函数名称:main()
** 函数功能:使用硬件SPI,74HC595驱动控制7段数码管显示。  
**           先显示0~F的字模,然后显示LPC2131字样。
********************************************************************************************************/
uint8  rcv_data; 
int main (void)
{   uint32 b ;
    //PINSEL0 =PINSEL0&(~(3<<4));
    PINSEL1=0x00<<18 ;                          // 设置SPI管脚连接(P0.5设为GPIO)
    PINSEL0=PINSEL0&0XFF0CFF0F;
    IO0DIR= IO0DIR|
            (1<<8)|
           (1<<10)|
            (1<<11);
    MSPI_Init();                            		// 初始化SPI接口
    Timer0_InitExt();
    IRQEnable();                    				// IRQ中断使能
    IRQ_Init(); 
    PWMPR=0;
    PWMMCR=0X02;
    PWMPCR=1<<14;
    PWMTCR=0X02;
      
                                    // 设置及开启定时器0中断
    CONVBIT0(CS[0],0);				
    CONVBIT0(CS[1],4);
    while(1)    
    {  /*for(b=0;b<5;b++)
        SendByte(a[b]);
        FQ_UD1							//SCLK=1;
		__asm
    	{
    	   nop
    	  
    	 }
		
	 	FQ_UD0*/
	 	b=CS[2]*3495.25333333;
        SendByte(b);
        if(T0Flag)                  				//中断定时到
        {
            while(w==80)                            //显示数据刷新时间到,执行数据变换。
    		{
                if(M==0)                            //如果M=0表示运行态,显示运行参数。
        		{   
                    CONVBIT0(CS[2],0);				
                    CONVBIT0(M,4);
        		}
                w=0;                				//清除显示刷新计数器
                if(SF)          					//闪烁标志取反
            	SF=0;
        		else
                SF=1;				
    		}
            if(M==0)                    			//显示扫描送运行参数
    		{
                x=DATA0[k];
    		}
            else                					//否则送修改参数
    		{
    			
                if(k==R)                            //如果当前显示位与键盘修改位相等,则根据闪烁标志送黑码。
        		{
                    if(SF==0)						
            		x=10;
            		else
                	x=DATA0[k];
        		}
        		else
                x=DATA0[k];             			//否则直接送显示数
    		}
            w++;                    				//显示刷新计数器+1。
            T0Flag=0;                       		//显示标志位清除。
            rcv_data = MSPI_SendData(digitable[x]);     // 发送显示数据
            rcv_data = MSPI_SendData(selectable[k]);    // 发送显示位码
            					
            if((IO0PIN&KEY) != 0)					
    		{
                if(TK==k)                           //如果键盘输入位=1且键盘记录位与当前输入位相等,执行键功能。
        		{
                    switch(TK)                  	//执行TK键盘号功能0~3。
        			{
                        case 0:             		//0#功能为模式键M+1。
        				{
                			if(M==4)
            				M=1;
            				else
            				M++;
                       
        					
                            switch(M)               //取出1~4#参数送显示,以便人机对话修改参数。
        					{
                				case 1:
            					{
                            		CONVBIT0(CS[2],4);
                        			CONVBIT0(50,0);
            					}
                				break;
                				case 2:
            					{
                            		CONVBIT0(CS[3],4);
                        			CONVBIT0(M,0);
            					}
                				break;
                				case 3:
            					{
                            	CONVBIT0(CS[4],4);
                        		CONVBIT0(M,0);
            					}
                				break;
                				case 4:
            					{
                            	CONVBIT0(CS[5],4);
                        		CONVBIT0(M,0);
            					}
                				break;
                    		}            
        				}
            			break;
                        case 1:                 	//1#功能为右移键标志位R+1。
        				{
                			if(R==7)
            				R=1;
            				else
            				R++;
        				}
            			break;
                        case 2:                     //2#功能为加键,当前闪烁位+1。
        				{
                        	if(DATA0[R]==9)
                    		DATA0[R]=0;
            				else
                    		DATA0[R]++;
        				}
            			break;
                        case 3:                     //3#功能为回车确认键操作,将修改好的参数送回参数区。
        				{
                    		while(!M==0)
        					{
                               // CS[1]=DATA0[4]*1000+DATA0[5]*100+DATA0[6]*10+DATA0[7];
                                CS[2]=DATA0[3]*1000+DATA0[2]*100+DATA0[1]*10+DATA0[0];
                                R=1;				//R、M标志归零。
            					M=0;
        					}
        				}
            			break;
        			}
                    TK=0x09;        				//键记录位清除。
        		
        		}
        	 }
                else if((IO0PIN&KEY)==0)          //如果当前键盘位=0,则再读键盘、延时再读=0则记录键盘位TK=K。
        		{ 
                	delays();
                    if((IO0PIN&KEY)==0) 
                	TK=k;
        		}   
        if(k==7)                                    //如果键盘扫描计数器K=7,则清除K,否则K+1。
        k=0;
        else
        k++;
       signalproduct(CS[1],CS[0]);  
        }
    }
   
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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