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

📄 main.c

📁 凌阳SPMC75F2413A的AD转换控制跑马灯速度的例子。这个是我自己编写的
💻 C
字号:
//================================================================================================
//Project Name: SPMC75F2413A EVM V1.2 演示程序2-Led
//hardware: SPMC75F2413A EVM v1.2开发板
//Function Description:实现跑马灯效果,左右循环移动
//                     通过AD转换实现闪烁频率的控制
//Hardware Resources: IOD 0-8
//================================================================================================
//作者:陈元虎
//EMAIL:chenyuanhu2@163.com
//日期:2007年12月21日
//================================================================================================
//================================================================================================
//Note:  此程序做调试之用。
//================================================================================================


#include "Spmc75_regs.h" 
//定义寄存器的头文件
#include "unspmacro.h"
//定义中断开关等的头文件
//================================================================================================
//系统变量声明(全局变量在此声明)
//================================================================================================
unsigned int ADC_Buffer;//AD转换中间值
//================================================================================================
//系统函数声明
//================================================================================================
main(void)
{
	unsigned int i = 0;
	
	//凌阳的编译系统和TC有点不相同的,你定义以个变量,不能在程序的中间定义。
	//不知道为什么会有这样的问题。
	//提醒编程的时候注意。
	
	System_Init();//系统初始化函数
    
   for(;;)
   { 
   	 ADC_Conversion();//AD转换获取延时值
   	 P_IOD_Buffer->W = 0x0001;
     while(i < 7)
     {
      	LeftMobile(1); 
    	Delay(ADC_Buffer);
    	i += 1;
     }
     while(i > 0)
     {
     	//这个地方开始的是我写的是大于等于0,出现了一个问题,0-1之后,i的值变成了65535,这样的话
     	//就一直在下面的循环里面了。
     	//在编程的时候这个地方要注意。
     	RightMobile(1);
     	Delay(ADC_Buffer);
     	i -= 1;
     }
   }	
}
//================================================================================================
//子函数
//================================================================================================
//================================================================================================
//Name: System_Init();
//================================================================================================
System_Init()
{
	//初始化IOD口为输出端口。
	P_IOD_Attrib->W = 0x00ff;//同相
	P_IOD_Dir->W = 0x00ff;//输出
	P_IOD_Buffer->W = 0x0000;
	//初始化IOA
	P_IOA_Dir->W &= 0xff00; //从IOA0开始AD转换
    P_IOA_Attrib->W |= 0x00ff;
    P_IOA_Buffer->W |= 0x00ff;
    ADC_Init();//AD转换初始化
}
//================================================================================================
//Name:void ADC_Init()
//================================================================================================
void ADC_Init()
{
   //AD转换初始化,75的程序有很强的规律性,掌握了这些规律之后
   //能很快速的变成。
   P_ADC_Channel->W = 0x0001;
   P_ADC_Setup->B.ADCCS = CB_ADC_ADCCS_Select;
   P_ADC_Setup->B.ADCEN = CB_ADC_ADCEN;
   P_ADC_Setup->B.ADCFS = CB_ADC_ADCFS_CPUCLKdiv64;
   P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch0;
   P_ADC_Ctrl->B.ADCSTR = 1;
}
//================================================================================================
//Name:unsigned int ADC_Conversion()
//================================================================================================
unsigned  int ADC_Conversion()
{
	//AD转换,资料上面说第一次AD转换的结果不是很精确
	//所以这边可以适当的做以下处理。
	//我这里没有做处理。
	P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch0;
    P_ADC_Ctrl->B.ADCSTR = 1;
    while((P_ADC_Ctrl->W & 0x0080) == 0)
    {
     NOP();
    }
    ADC_Buffer = P_ADC_Data->W >> 6;
    return (ADC_Buffer);
    //还要记得AD转换函数值是要返回的,要不然AD转换的值你这么办呢?
}
//================================================================================================
//Name:void Delay(unsigned int Time)
//================================================================================================
void Delay(unsigned int Time)
{
	int i,j;
	for(i = 0;i<= Time;i++)
	{
		for(j = 0;j<=0x120; j++)
		{
			
		}
	}

}
//=================================================================================================
//Name:LeftMobile(bit)
//=================================================================================================
void LeftMobile(bit)
{
	//bit表示每次移动的位数
	if(bit >= 8)
		P_IOD_Buffer->W = 0x00ff;
	else P_IOD_Buffer->W = P_IOD_Buffer->W << bit;
	
}
//=================================================================================================
//Name:RightMobile(bit)
//=================================================================================================
void RightMobile(bit)
{
	//bit表示每次移动的位数
	if(bit >= 8)
		P_IOD_Buffer->W = 0x00ff;
	else P_IOD_Buffer->W = P_IOD_Buffer->W >> bit;
}

⌨️ 快捷键说明

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