📄 main.c
字号:
#include "LF2407REGS.H"
#define START_ADC *T4CON=*T4CON|0X0040;*T4CNT=0X0000//开始ad采样
unsigned int nValue=0;
unsigned int n=0;
void SysInitial()//系统初始化配置
{
asm(" setc INTM");//禁止所有中断
asm(" clrc SXM");//抑制符号位扩展
asm(" clrc OVM");//累加器中结果正常溢出
asm(" clrc CNF");//b0被配置为数据空间
*SCSR1=0X81FE;//CLKIN=10M,CPU=40M
*WDCR=0X00EB;//不使能看门狗
*IFR=0xFFFF;//清除所有中断标志位
}
void ShowInitial()//7段数码管控制端口初始化
{
*MCRC &=0xF3F0;//数码管数值端口以及两个选通端口设置为基本I/O功能
*PEDATDIR |=0x0F00;// 数码管数值端口为输出类型
*PEDATDIR &=0xFFF0;//设定数值为0
*PFDATDIR |=0x0C0C;// 数码管选通端口为输出类型
//PFDATDIR&=0xFFF7;//设置一个数码管亮
}
void AdcInitial()//ADC采样寄存器初始化
{ asm(" setc INTM");
*ADCTRL1=*ADCTRL1|0X4000;//复位ADC模块
*ADCTRL1=0X0030;//使用级联模式 ,低优先级
*ADCTRL2=0X8404;//级联模式下利用evb启动ADC,中断标志置位后马上申请中断
*MAXCONV=0X0000;//最大转换通道是1
*ADCTRL2=*ADCTRL2|0X4200;//复位seq,指针指向conv00,intflag 写1清零
*CHSELSEQ1=0X1111;
//===========利用定时器4启动ADC=============
*T4CON=0X120C;//连续增计数模式,4分频:40M/4-->(100ns),定时器没有启动
*T4PER=0x0600; *GPTCONB=0X400;//周期启动ADC
*EVBIFRB=0XFFFF;//写1复位
*T4CNT=0x0000;//计数器清零
*IMR=*IMR|0X0020;
*IFR=0xFFFF;//清除所有中断标志位
}
void interrupt AdcInt()//对应到文件"VECTORS.ASM"的ADC转换中断:_AdcInt
{ asm(" clrc INTM");
START_ADC;
asm(" clrc SXM");//抑制符号扩展,从而移位时候最高位填写0
while(1)
{ if(!(*ADCTRL2 & 0x1000)) break;}
nValue =(*RESULT0)>>6;//右移6位
n++;
*ADCTRL2=*ADCTRL2|0X4200;//复位seq,指针指向conv00,intflag 写1清零
*EVBIFRB=0XFFFF;//写1复位
}
void interrupt nothing()//对应到文件"VECTORS.ASM"的_nothing
{ asm(" clrc INTM");}
void Delay(unsigned int ms) //延时n毫秒,不是很精确
{
while(ms--)
{;}
}
void main()//主程序入口
{ unsigned int pdc,aveVOL,n1,n2,Vh,Vl,i=0,key=0;
unsigned int high=0,a[3];
SysInitial(); AdcInitial(); ShowInitial();
asm(" clrc INTM");
START_ADC;
while(1)
{
if(0x0008==(*PADATDIR&0x0008)) key=1;
if(0x0010==(*PADATDIR&0x0010)) key=2;
if(nValue>500) {high=1;Vh=nValue;}
if(high&&(nValue<300)) {high=0;a[0]=n;i=1;}
if((i==1)&&(nValue>500)) {a[1]=n;i=2;}
if((i==2)&&(nValue<300)) {a[2]=n;i=3;Vl=nValue;}
if(i==3)
{
pdc=(a[2]-a[1])*100/(a[2]-a[0]);
aveVOL=((a[2]-a[1])*Vh+(a[1]-a[0])*Vl)/(a[2]-a[0]);
}
if(key==1)
{
n1=(int)pdc%10; //提取十位
Delay(1);
*PEDATDIR=0XFF00+n1;
*PFDATDIR=0XFF08;
n2=(int)(pdc/10)%10;//提取个位
Delay(1);
*PEDATDIR=0XFF00+n2;
*PFDATDIR=0XFF04;
}
if(key==2)
{
n1=(int)(aveVOL/10.24)%10; //提取十位
Delay(1);
*PEDATDIR=0XFF00+n1;
*PFDATDIR=0XFF08;
n2=(int)(aveVOL/102.4)%10;//提取个位
Delay(1);
*PEDATDIR=0XFF00+n2;
*PFDATDIR=0XFF04;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -