📄 main.c
字号:
//=========================================================================================
//Project Name:FourSource_Ctrl
//Description:使用75的AD转换制作数字电压表
//HardWare: SPMC75F2413A EVM V1.2板
//HardWare Resource:IOB 11-13
//I/O LED Status:
//Attention: 该程序是使用IOB11-13来模拟SPI总线时序。通过74ls595来实现数码管显示数字。
// 建议在做此实验之前,找相关的74LS595的资料看看。
//=========================================================================================
//=========================================================================================
//作者:陈元虎
//Email:chenyuanhu2@163.com
//日期:2007年12月27日
//=========================================================================================
#include "spmc75_regs.h"
#include "unspmacro.h"
#define SER P_IOB_Buffer->B.bit13
#define SRCLK P_IOB_Buffer->B.bit11
#define RCLK P_IOB_Buffer->B.bit12
//=========================================================================================
//全局变量
//=========================================================================================
const unsigned int LED_TAB[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int FILTER_TAB[5];
unsigned int ADC_Buffer;
//=========================================================================================
//函数声明
//=========================================================================================
int main()
{
unsigned int ui_ADData,ui_Code,ui_Site,ui_DAData1,AD_Ture_H;
double AD_Ture,AD_Ture_T,AD_Buffer_double,AD_Ture_1;
Disable_FIQ_IRQ();
System_Init();//初始化
IRQ_ON();
while(1)
{
ADC_Conversion();
AD_Buffer_double = (double)ADC_Buffer;
AD_Ture_1 = AD_Buffer_double*5;
AD_Ture = AD_Ture_1/1023;
//取千分位的值
AD_Ture_H = (int)(AD_Ture*100);
AD_Ture_T = AD_Ture*100 - AD_Ture_H;
if(AD_Ture_T >= 0.5)
{
AD_Ture_H += 1;
}
if(AD_Ture >= 1)
{
ui_Site =AD_Ture_H/100;
ui_Code = LED_TAB[ui_Site];
LED_Display(ui_Code,1,2);
AD_Ture_H -= ui_Site*100;
}
else
{
LED_Display(LED_TAB[0],1,2);
}
if(AD_Ture >= 0.1)
{
ui_Site = AD_Ture_H/10;
ui_Code =LED_TAB[ui_Site];
LED_Display(ui_Code,0,3);
AD_Ture_H -= ui_Site*10;
}
else
{
LED_Display(LED_TAB[0],0,3);
}
if(AD_Ture >= 0)
{
ui_Site = AD_Ture_H;
ui_Code = LED_TAB[ui_Site];
LED_Display(ui_Code,0,4);
}
}
}
//=========================================================================================
//子函数
//=========================================================================================
//=========================================================================================
//Name: void System_Init()
//=========================================================================================
void System_Init()
{
P_IOB_Dir->W |= 0x3800;
P_IOB_Attrib->W |= 0x3800;
P_IOB_Data->W = 0x0000;
P_IOD_Dir->W = 0x00ff;
P_IOD_Attrib->W = 0x00ff;
P_IOD_Data->W = 0x0000;
ADC_Init();//AD转换初始化
}
//=========================================================================================
//Name: void LED_Display(unsigned int code)
//=========================================================================================
void LED_Display(unsigned int code,unsigned int point_IE,unsigned int Choice)
{
//code位数码管显示的数字,point_IE位小数点使能位,Choice是选择哪位数码管的选择位
unsigned int i;
unsigned int k;
unsigned int SEG;//位码
unsigned int Number;//Number是合成好后应发送的数据
switch(Choice)
{
//Choice的含义:1表示选择低位的数码管,及最左边的此时位码应该是1110
case 1: SEG = 0x0e00;
break;
case 2: SEG = 0x0d00;
break;
case 3: SEG = 0x0b00;
break;
case 4: SEG = 0x0700;
break;
default: break;
}
if(point_IE == 1)
{
Number = (SEG + code)& 0xff7f;
}
else Number = SEG + code;
k = 0x0800;
for(i = 0;i < 12 ;i++)
{
if((Number&k) == 0)
{
SER = 0;
SRCLK = 1;
SRCLK = 0;
}
else
{
SER = 1;
SRCLK = 1;
SRCLK = 0;
}
k >>= 1;
}
RCLK = 1;
RCLK = 0;
}
//=========================================================================================
//Name: unsigned int FILTER(unsigned int a[5])
//=========================================================================================
unsigned int FILTER(unsigned int a[5])
{
unsigned int i,j,m=0;
for(i = 0;i < 4;i++)
{
for(j = i+1;j < 5;j++)
{
if(a[i] > a[j])
{
m = a[j];
a[j] = a[i];
a[i] = m;
}
}
}
return (a[2]);
}
//=========================================================================================
//Name: void ADC_Init()
//=========================================================================================
void ADC_Init()
{
//初始化IOA口位下拉输入
P_IOA_Dir->W &= 0xff00; //从IOA0开始AD转换
P_IOA_Attrib->W |= 0x00ff;
P_IOA_Buffer->W |= 0x00ff;
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.ADCCHS = CB_ADC_ADCCHS_Ch1;
P_ADC_Ctrl->B.ADCSTR = 1;
}
//================================================================================================
//Name:unsigned int ADC_Conversion()
//================================================================================================
unsigned int ADC_Conversion()
{
//AD转换函数,这个地方使用电位器的输入模拟DETA
P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch0;
//P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch;
P_ADC_Ctrl->B.ADCSTR = 1;
while((P_ADC_Ctrl->W & 0x0080) == 0);
ADC_Buffer = P_ADC_Data->W >> 6;
return ADC_Buffer;
}
//================================================================================================
//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++)
{
}
}
}
//===============================================================================================
//ISR
//===============================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -