📄 demo.cpp
字号:
// ADT650demo.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include "stdlib.h"
#include "stdio.h"
#include "ADT650.h"
#include <winioctl.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define ID_TIMER 1//设定一个定时器的ID值
HANDLE hDevice=0;//加载设备驱动程序的句柄
BOOL sucess=0;//设备初始化的返回值
unsigned int count=0; // 计数值
unsigned int BaseAddr=0x300; // 基地址
unsigned char irq=7; // 中断号
unsigned char IOport0=1,IOport1=1,IOport2=1; // 三个数字I/O口都为输入状态
unsigned char IOport; // 数字I/O口
unsigned char outbyte,inbyte; // 数字I/O输入输出数值
float adresult,daresult; // 模拟电压值
int ADValue,DAValue; // 变换的数据
int adchannel=0,dachannel=0; // 模拟通道
//定义全局参数
float TijiNongduXishu,GutiBizhongXishu,WeightNongduXishu,LiuliangXishu;
//定义全局结果
float ShunshiLiuliang,class1Liang,class2Liang,class3Liang,TijiNongdu,WeightNongdu;
HANDLE hEvent=0; // AD采样事件句柄
HWND hAdlg,hBdlg; // 窗口句柄
int Curcha;
char buffer[512],buffer1[512],buffer2[512];
char setting[20];
char name[20],temp[30];
time_t now;
int check,starthour1,endhour1,startmin1,endmin1,
syshour,sysmin,syssec,
starthour2,endhour2,startmin2,endmin2,
starthour3,endhour3,startmin3,endmin3;
//应用程序窗口的消息处理函数
BOOL CALLBACK DlgProc(HWND, WPARAM, WPARAM,LPARAM);
BOOL CALLBACK DlgProc2(HWND, WPARAM, WPARAM,LPARAM);
BOOL CALLBACK DlgProc3(HWND, WPARAM, WPARAM,LPARAM);
BOOL CALLBACK DlgProc4(HWND, WPARAM, WPARAM,LPARAM);
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
void ftoa(float source,char destination[10],char precision);
void change(char setting[],int input,int set);
void Clear(char setting[]);
void getdetail(char input[],char temp[]);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
TijiNongduXishu=GutiBizhongXishu=WeightNongduXishu=0;
LiuliangXishu=ShunshiLiuliang=class1Liang=class2Liang=class3Liang=TijiNongdu=WeightNongdu=0;
check=0;
if(!hDevice)//加载设备驱动
{
hDevice=ADT650_DevLoad();
if(hDevice==INVALID_HANDLE_VALUE)
{
MessageBox(0,"Load driver Error","error",MB_OK);
ExitProcess(1);
}
}
//设备初始化
ADT650_InitBoard(hDevice,BaseAddr,irq);
DialogBox(hInstance, (LPCTSTR)IDD_DIALOG1,0, DlgProc);
return 0;
}
// AD采样事件的线程被驱动程序唤醒,用来通知应用程序中断到来并且显示模拟输入电压值
DWORD WINAPI ServiceThread(PVOID hEvent)
{
while (TRUE)
{
WaitForSingleObject(hEvent, INFINITE);
while (ADT650_ConversionDone(hDevice) == 1); // 监测A/D变换是否结束
ADValue = ADT650_ReadData(hDevice); // 读取A/D变换的数据
adresult=ADT650_DigitToAnalog(hDevice,ADValue,&Curcha); // 转换为模拟输入电压值
ftoa(adresult,buffer,2);
ADT650_ClearIRQ(hDevice); // 清除中断
}
return 0;
}
void hevent() // AD采样事件
{
DWORD Tid;
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
ADT650_SetEvent(hDevice,hEvent); // 产生一个事件并且发送到驱动程序
ADT650_ADSettings(hDevice,10,1); // 设置模拟输入电压的量程和极性
ADT650_SetChannel(hDevice,0,0); // 设置模拟输入通道
ADT650_ADConfig(hDevice,0,0,0,4,0); // 配置 A/D
ADT650_EnableIRQ(hDevice); // 设置中断使能
ADT650_SetIRQSource(hDevice,0); // 选择中断源为AD转换结束
CreateThread(0, 0x1000, ServiceThread, (PVOID)hEvent, 0, &Tid); // 产生一个等待AD采样事件的线程
}
BOOL CALLBACK DlgProc(HWND hDlg, WPARAM uMsg, WPARAM wParam, LPARAM lParam)
{
hAdlg = hDlg;
switch (uMsg)
{
case WM_CLOSE://关闭窗口消息
if(hDevice)
{
if(hEvent)
CloseHandle(hEvent);
KillTimer (hDlg, ID_TIMER);
ADT650_DevClose(hDevice);//卸载设备驱动程序
}
EndDialog(hBdlg,TRUE);
EndDialog(hDlg,TRUE);//关闭对话框
break;
case WM_COMMAND:
switch (wParam)
{
case IDC_Set:
check++;
if(check==1)
DialogBox(0, (LPCTSTR)IDD_DIALOG2,0, DlgProc2);
else ShowWindow(hBdlg,SW_SHOW);
/*
ftoa(TijiNongduXishu,buffer2,3);
SetDlgItemText(hBdlg,IDC_TijiBox,buffer2);
ftoa(GutiBizhongXishu,buffer2,2);
SetDlgItemText(hBdlg,IDC_GutiBox,buffer2);
ftoa(WeightNongduXishu,buffer2,3);
SetDlgItemText(hBdlg,IDC_WeightBox,buffer2);
ftoa(LiuliangXishu,buffer2,2);
SetDlgItemText(hBdlg,IDC_LiuliangBox,buffer2);
*/
break;
case IDC_Start:
SetTimer(hDlg,ID_TIMER,1000,TimerProc);
break;
case IDC_End:
SetTimer(hDlg,ID_TIMER,1000,NULL);
/*
case Load_Driver: //加载设备驱动程序
if(hDevice)
break;
hDevice=ADT650_DevLoad();
if(hDevice==INVALID_HANDLE_VALUE)
{
MessageBox(hDlg,"Load driver Error","error",MB_OK);
ExitProcess(1);
}
EnableWindow(GetDlgItem(hDlg,Load_Driver),FALSE);
break;
case Initial: // 初始化
if(!hDevice)
break;
ADT650_InitBoard(hDevice,BaseAddr,irq);
EnableWindow(GetDlgItem(hDlg,Initial),FALSE);
break;
case Read_IO: // 读数字I/O
if(!hDevice)
break;
IOport = (unsigned char)GetDlgItemInt(hDlg,IDC_RPORT,NULL,FALSE);
if(IOport == 0) IOport0=1;
else if(IOport == 1) IOport1=1;
else if(IOport == 2) IOport2=1;
ADT650_ConfigIOPorts(hDevice,IOport0,IOport1,IOport2);
inbyte = ADT650_ReadDigitIO(hDevice,IOport);
SetDlgItemInt(hDlg,IDC_RVALUE,inbyte,FALSE);
break;
case Write_IO: // 写数字I/O
if(!hDevice)
break;
IOport = (unsigned char)GetDlgItemInt(hDlg,IDC_WPORT,NULL,FALSE);
outbyte = (unsigned char)GetDlgItemInt(hDlg,IDC_WVALUE,NULL,FALSE);
if(IOport == 0) IOport0=0;
else if(IOport == 1) IOport1=0;
else if(IOport == 2) IOport2=0;
ADT650_ConfigIOPorts(hDevice,IOport0,IOport1,IOport2);
ADT650_WriteDigitIO(hDevice,IOport,outbyte);
break;
case DA_Output: // D/A输出
if(!hDevice) break;
dachannel = (unsigned char)GetDlgItemInt(hDlg,IDC_DACHANNEL,NULL,FALSE);
GetDlgItemText(hDlg,IDC_DAVALUE,buffer,10);
daresult = atof(buffer);
DAValue = (int)((daresult/10.0)*2048)+2048;
ADT650_WriteDataDA(hDevice,dachannel,DAValue);
break;
case Start_AD: // 启动A/D变换
ADT650_ADSettings(hDevice,10,1); // 设置模拟输入电压量程和极性
if(!hEvent)
{
hevent(); // AD采样事件
hAdDlg=hDlg;
}
ADT650_EnableIRQ(hDevice); // 设置中断使能
ADT650_SetIRQSource(hDevice,0); // 选择中断源为AD转换结束
ADT650_ADConfig(hDevice,0,0,0,1,0); // 配置AD
adchannel= (unsigned char)GetDlgItemInt(hDlg,IDC_ADCHANNEL,NULL,FALSE);
ADT650_SetChannel(hDevice,adchannel,adchannel); //设置模拟输入通道
ADT650_ClearIRQ(hDevice); // 清除中断
if (!SetTimer (hDlg, ID_TIMER, 1000, NULL)) // 启动定时器
{
MessageBox (hDlg, "定时器太多!","error", MB_OK) ;
return FALSE ;
}
break;
case Start_Counter: // 启动计数器
ADT650_ClockMode(hDevice,0, 2);
ADT650_ClockDivisor(hDevice,0, 800);
ADT650_ClockMode(hDevice,1,2);
ADT650_ClockDivisor(hDevice,1, 2000);
ADT650_ClockMode(hDevice,2, 2);
ADT650_ClockDivisor(hDevice,2, 5000);
break;
case ReadBackCountV: // 读回计数值
count=ADT650_ClockReadBack(hDevice,2);
SetDlgItemInt(hDlg,IDC_RBCOUNTV,count,FALSE);
break;
*/
}
break;
}
return FALSE;
}
BOOL CALLBACK DlgProc2(HWND hDlg, WPARAM uMsg, WPARAM wParam, LPARAM lParam)
{
hBdlg = hDlg;
switch(uMsg)
{
case WM_CLOSE:
check=0;
EndDialog(hDlg,TRUE);
break;
case WM_COMMAND:
switch(wParam)
{
case IDC_Sure:
ShowWindow(hDlg,SW_HIDE);
break;
case IDC_NotSure:
ShowWindow(hDlg,SW_HIDE);
break;
case IDC_Tiji:
Clear(setting);
strcpy(name,"体积浓度系数");
DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
sscanf(setting,"%f",&TijiNongduXishu);
SetDlgItemText(hDlg,IDC_TijiBox,setting);
break;
case IDC_Weight:
Clear(setting);
strcpy(name,"重量浓度系数");
DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
sscanf(setting,"%f",&WeightNongduXishu);
SetDlgItemText(hDlg,IDC_WeightBox,setting);
break;
case IDC_Class1Start:
Clear(setting);
strcpy(name,"一班开始时间");
DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
sscanf(setting,"%d:%d",&starthour1,&startmin1);
SetDlgItemText(hDlg,IDC_Class1StartBox,setting);
break;
case IDC_Class2Start:
Clear(setting);
strcpy(name,"二班开始时间");
DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
sscanf(setting,"%d:%d",&starthour2,&startmin2);
SetDlgItemText(hDlg,IDC_Class2StartBox,setting);
break;
case IDC_Class3Start:
Clear(setting);
strcpy(name,"三班开始时间");
DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
sscanf(setting,"%d:%d",&starthour3,&startmin3);
SetDlgItemText(hDlg,IDC_Class3StartBox,setting);
break;
case IDC_Guti:
Clear(setting);
strcpy(name,"固体比重");
DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
sscanf(setting,"%f",&GutiBizhongXishu);
SetDlgItemText(hDlg,IDC_GutiBox,setting);
break;
case IDC_Liuliang:
Clear(setting);
strcpy(name,"流量计系数");
DialogBox(0, (LPCTSTR)IDD_DIALOG3,0, DlgProc3);
sscanf(setting,"%f",&LiuliangXishu);
SetDlgItemText(hDlg,IDC_LiuliangBox,setting);
break;
case IDC_Class1End:
Clear(setting);
strcpy(name,"一班结束时间");
DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
sscanf(setting,"%d:%d",&endhour1,&endmin1);
SetDlgItemText(hDlg,IDC_Class1EndBox,setting);
break;
case IDC_Class2End:
Clear(setting);
strcpy(name,"二班结束时间");
DialogBox(0, (LPCTSTR)IDD_DIALOG4,0, DlgProc4);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -