📄 project.c
字号:
#include "SPCE061V004.H"
#include "IO_bit.h"
#define dout IOB3
#define dclk IOB2
#define din IOB1
#define load IOB0
unsigned int key;
unsigned int c[10][10]={{0x0000,0x0280,0x0500,0x0780,0x0a00,0x0c80,0x0f00,0x1180,0x1400,0x1680},//*P_DAC1值,对应输出0V至0.9V
{0x1900,0x1b80,0x1e00,0x2080,0x2300,0x2580,0x2800,0x2a80,0x2d00,0x2f80},
{0x3200,0x3480,0x3700,0x3980,0x3c00,0x3e80,0x4100,0x4380,0x4600,0x4880},
{0x4b00,0x4d80,0x5000,0x5280,0x5500,0x5780,0x5a00,0x5c80,0x5f00,0x6180},
{0x6400,0x6680,0x6900,0x6b80,0x6e00,0x7080,0x7300,0x7580,0x7800,0x7a80},
{0x7d00,0x7f80,0x8200,0x8480,0x8700,0x8980,0x8c00,0x8e80,0x9100,0x9380},
{0x9600,0x9880,0x9b00,0x9d80,0xa000,0xa280,0xa500,0xa780,0xaa00,0xac80},
{0xaf00,0xb180,0xb400,0xb680,0xb900,0xbb80,0xbe00,0xc080,0xc300,0xc580},
{0xc800,0xca80,0xcd00,0xcf80,0xd200,0xd480,0xd700,0xd980,0xdc00,0xde80},
{0xe100,0xe380,0xe600,0xe880,0xeb00,0xed80,0xf000,0xf280,0xf500,0xf780}};//对应输出9.0V至9.9V
unsigned int a=0,b=0;
unsigned int uiData=0x00;
unsigned int data;
unsigned int x;
unsigned int m=0;
unsigned int n=0;
unsigned int q=0;
//////////////////////////////////按地址向CH452送数据.
void shjz_ch452(unsigned int ldata,unsigned int hdata)
{ unsigned int i;
for(i=0;i<8;i++)
{ dclk=0;
if(ldata&0x0001) din=1;
else din=0;
dclk=1;
ldata=ldata>>1;
}
for(i=0;i<4;i++)
{dclk=0;
if(hdata&0x0001) din=1;
else din=0;
dclk=1;
hdata=hdata>>1;
}
load=0;
load=1;
}
////////////////////////////////////////CH452初始化
ch452_init()
{ shjz_ch452(0x0001,0x0002);
shjz_ch452(0x0023,0x0004);
shjz_ch452(0x0080,0x0005);
}
void ADInit(void)
{//IOA口前七位为悬浮输入
*P_IOA_Dir&=0xff80;
*P_IOA_Attrib|=0x007f;
*P_IOA_Data|=0x007f;
*P_ADC_Ctrl=0x0003;
}
/////////////////////////////////////////读键值并返回.
unsigned int readkey(void)
{unsigned int key=0,i,com=0x0700;
for(i=0;i<6;i++)
{ if(com&0x01) din=1;
else din=0;
dclk=0;
dclk=1;
com>>=1;
}
load=0;
load=1;
key=key|dout;
dclk=1;
dclk=0;
for(i=0;i<6;i++)
{ key<<=1;
key=key|dout;
dclk=1;
dclk=0;
}
key=key&0x007f;
return(key);
}
//////////////////显示浮点型数
void disp2(unsigned int data)
{unsigned int i,data1;
unsigned int a[8]={0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
//b[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
//显示0.,1.,2.,3.,4. 9.
ch452_init();
for(i=4;i<6;i++)
{data1=data%10;
shjz_ch452(data1,a[i]);
data=data/10;
}shjz_ch452((0x80|data),0xe);//在第2个数码管上显示0.
}
////////////////////////////////////////////AD转换
void AD(void)
{ float tem;
unsigned int buff;
ADInit();
buff=*P_ADC_LINEIN_Data;//开始转换
while(!(*P_ADC_MUX_Ctrl&0x8000));
buff=*P_ADC_LINEIN_Data;
//*P_ADC_Ctrl= C_ADCN ;//关AD转换
tem=buff*3.3/0xffc0;
x=(unsigned int)(tem*300);
disp2(x);
shjz_ch452((b|0x80),0x9);
shjz_ch452(a,0x8);
}
////////////////////////////////////////////按键设定
void key1(void)//预置
{ a++;
if(a>9) {a=0;}
shjz_ch452(a,0x8);
}
void key2(void)//个位预置
{ b++;
if(b>9) {b=0;}
shjz_ch452((b|0x80),0x9);
}
void key3(void)//输入
{ data=c[b][a];
*P_DAC1=c[b][a];
shjz_ch452(0x0d,0xa);
}
void key4(void)//清零
{ a=0,b=0;
*P_DAC1=0;
shjz_ch452(0x0c,0xa);
shjz_ch452(0x80,0x9);
shjz_ch452(0x00,0x8);
}
void key5(void)//步增0。1V
{
a++;
if(a>9)
{a=0;
b++;
if(b>9) b=0;
}
shjz_ch452((b|0x80),0x9);
shjz_ch452(a,0x8);
*P_DAC1=c[b][a];
}
void key6(void)//步减0。1V
{
a--;
if(!((a>=0)&&(a<=9)))
{ a=9;
b--;
if(!((b>=0)&&(b<=9)))
b=9;
}
shjz_ch452((b|0x80),0x9);
shjz_ch452(a,0x8);
*P_DAC1=c[b][a];
}
void key7(void)//自动扫描开关
{ m=1;
}
void key8(void)//扫描方向选择
{ n=n^1;
}
void key9(void)//三角波
{m=2;
}
void key10(void)//扫描关,三角波停止
{m=0;
}
void key11(void)//A/D转换
{AD();
}
////////////////////////////////////////////////////
void IRQ3(void)__attribute__((ISR));
void IRQ3(void)
{
if(*P_INT_Ctrl&C_IRQ3_EXT2)
{
shjz_ch452(0x0,0x7);
key = readkey();
switch(key)
{case 0x0040:key1();break;
case 0x0041:key2();break;
case 0x0042:key3();break;
case 0x0043:key4();break;
case 0x0044:key5();break;
case 0x0045:key6();break;
case 0x0046:key7();break;
case 0x0047:key8();break;
case 0x0048:key9();break;
case 0x0049:key10();break;
case 0x004a:key11();break;
/* case 0x004b:key12();break;
case 0x004c:key13();break;
case 0x004d:key14();break;
case 0x004e:key15();break;
case 0x004f:key16();break; */
default:break;
}
*P_INT_Clear=C_IRQ3_EXT2;
}
else if(*P_INT_Ctrl&C_IRQ3_EXT1)
*P_INT_Clear=C_IRQ3_EXT1;
else
*P_INT_Clear=C_IRQ3_KEY;
}
///////////////////////////////////////////////////
void IRQ1(void)__attribute__((ISR));
void IRQ1(void)
{ if(n==0)
{ a++;
if(a>9)
{ a=0;
b++;
if(b>9) b=0;
}
shjz_ch452((b|0x80),0x9);
shjz_ch452(a,0x8);
*P_DAC1=c[b][a];
}
else
{ a--;
if(!((a>=0)&&(a<=9)))
{ a=9;
b--;
if(!((b>=0)&&(b<=9))) b=9;
}
shjz_ch452((b|0x80),0x9);
shjz_ch452(a,0x8);
*P_DAC1=c[b][a];
}
*P_INT_Clear= C_IRQ1_TMA ;
}
///////////////////////////////////////
main()
{ unsigned int i;
float fVoltage=0.0;
hardware();
ch452_init();
shjz_ch452(0x80,0x9);
shjz_ch452(0x00,0x8);//在第7。8位上显示0.0
*P_DAC_Ctrl=C_DA1_Direct;
*P_ADC_MUX_Ctrl=C_ADC_CH1; //LINE_IN-------IOA0
*P_ADC_Ctrl= C_ADCE; //
while(1)
{
if(m==1)
*P_INT_Ctrl=C_IRQ1_TMA+C_IRQ3_EXT2 ;
if(m==0)
*P_INT_Ctrl=C_IRQ3_EXT2 ;
if(m==2)
{
while(1)
{
while(uiData!=0xffc0)
{
*P_DAC1=uiData;
uiData+=0x0040;
}
while(uiData!=0)
{
*P_DAC1=uiData;
uiData-=0x0040;
}
if(m==0) break;
*P_Watchdog_Clear=1;
}
}
*P_Watchdog_Clear=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -