📄 main.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 + -