?? main.pas
字號:
unit Main;
interface
uses
Windows, SysUtils, Variants, Classes, Forms, StdCtrls, Controls;
type
TFrmMain = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
Button14: TButton;
Button15: TButton;
Button16: TButton;
Button17: TButton;
Button18: TButton;
Button19: TButton;
Button20: TButton;
Button21: TButton;
Button22: TButton;
Button23: TButton;
Button24: TButton;
Button25: TButton;
Button26: TButton;
Button27: TButton;
Button28: TButton;
Button29: TButton;
Button30: TButton;
Button31: TButton;
Button32: TButton;
Button33: TButton;
Button34: TButton;
Button35: TButton;
Button36: TButton;
Button37: TButton;
Button38: TButton;
Button39: TButton;
Button40: TButton;
Button41: TButton;
Button42: TButton;
Button43: TButton;
Button44: TButton;
Button45: TButton;
Button46: TButton;
Button47: TButton;
Button48: TButton;
Button49: TButton;
Button50: TButton;
Button51: TButton;
Button52: TButton;
Button53: TButton;
Button54: TButton;
Button55: TButton;
Button56: TButton;
Button57: TButton;
Button58: TButton;
Button59: TButton;
Button60: TButton;
Button61: TButton;
Button62: TButton;
Button63: TButton;
Button64: TButton;
Button65: TButton;
Button66: TButton;
Button67: TButton;
Button68: TButton;
Button69: TButton;
Button70: TButton;
Button71: TButton;
Button72: TButton;
Button73: TButton;
devstatue: TLabel;
pnpproce: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure pnpproceKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
//function mInterruptEvent(mBuffer:pbytearray):cardinal; //中斷服務程序
//procedure mCallInt();
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
mKeyNo :cardinal=0; //模擬按鍵號
const WM_KEYDOWN=$100;
WM_KEYUP=$101;
implementation
uses CH375dll,unit1,EnterDate;
{$R *.dfm}
//iBuffer 指向一個緩沖區,提供當前的中斷特征數據
//******建議此程序不要設置斷點******
// 中斷服務程序
procedure mInterruptEvent(mBuffer:pbytearray );stdcall; // 指向一個緩沖區,提供當前的中斷特征數據
begin
// CH371產生中斷后,產生一個消息通知主程序
If mBuffer[0] = 1 Then // 檢查中斷特征數據
begin
mKeyCode := mBuffer[1] And $3F; //取鍵值
PostMessage(frmmain.Handle, $100, 1, 0); // 中斷特征數據為1則相應鍵號按鈕被按下
end
Else
If mBuffer[0] = 2 Then
PostMessage(frmmain.Handle, $101, 1, 0); // 中斷特征數據為2則相應鍵號按鍵被釋放
end;
procedure mCallInt() ;
var x:boolean;
begin
x:= CH375SetIntRoutine(mIndex,mInterruptEvent); //調用中斷子程序
If x =false Then
begin
MessageBox(frmmain.Handle,'無法調用中斷', mCaptionInform, MB_OK + MB_ICONERROR );
Exit;
End;
end;
// 以下測試PC機與單片機之間的USB通訊,僅作演示,本身沒有意義
procedure TestCommunication();
var mLength : cardinal;
begin
mDemoReq.mCommandCode := DEF_CMD_TEST_DATA; // 測試命令,將PC機發來的所有數據取反后返回
mDemoReq.mCommandCodeNot := $FF - DEF_CMD_TEST_DATA;
mDemoReq.mParameter[0] := $5A; // 任意的測試數據,返回后將按位取反
mDemoReq.mParameter[1] := $96; // 任意的測試數據,返回后將按位取反
mDemoReq.mParameter[2] := $F3; // 任意的測試數據,返回后將按位取反
mDemoReq.mParameter[3] := $4C; // 任意的測試數據,返回后將按位取反
mDemoReq.mParameter[4] := $39; // 任意的測試數據,返回后將按位取反
mLength := CONST_CMD_LEN; // 命令包的長度
If CH375WriteData(mIndex,@mDemoReq,@mLength) Then // 通過CH375發送命令數據,成功
begin
mLength := mCH375_PACKET_LENGTH;
If (CH375ReadData(mIndex,@mDemoReq, @mLength)) Then // 通過CH375接收應答數據,成功
begin
If (mLength = CONST_CMD_LEN) Then
begin
If (mDemoReq.mCommandCode <> ($FF - DEF_CMD_TEST_DATA))
Or (mDemoReq.mParameter[0] <> ($FF - $5A))
Or (mDemoReq.mParameter[1] <> ($FF - $96)) Then
application.MessageBox ('通過USB傳輸的數據有錯誤', mCaptionInform, Mb_ok+ MB_ICONEXCLAMATION);
end
Else application.MessageBox ( 'CH375數據測試返回的長度錯誤', mCaptionInform,mb_ok+ MB_ICONEXCLAMATION);
end
Else application.MessageBox ( 'CH375ReadData 失敗', mCaptionInform,mb_ok+ MB_ICONEXCLAMATION);
end
Else application.MessageBox ( 'CH375WriteData 失敗', mCaptionInform,mb_ok+ MB_ICONEXCLAMATION);
end;
//設備事件通知回調程序,將事件消息發送到指定控件的消息處理過程中處理.
Procedure NotifyRoutine(iEventStatus:cardinal );stdcall;
begin
PostMessage(frmmain.pnpproce.Handle ,WM_KEYUP,iEventStatus,0);
end;
//插拔事件處理過程
procedure TFrmMain.pnpproceKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
iEventStatus:cardinal;
statue:longbool;
begin
iEventStatus := Key; //插拔事件代碼
statue:=FALSE;
If (iEventStatus = CH375_DEVICE_ARRIVAL) Then
begin
if(mOpen=-1) then //設備還沒打開
begin
mOpen := CH375OpenDevice(mIndex); //窗體加載時打開設備
If (mOpen = -1) Then
begin
Application.MessageBox('無法打開CH375設備', '信息提示',0);
Exit;
End;
CH375SetTimeout( mIndex, 3000, 3000 ); // 設置USB數據讀寫的超時,超過3000mS未完成讀寫將強制返回,避免一直等待下去
TestCommunication();
mCallInt ; //調用中斷程序
end;
frmmain.devstatue.Caption := '**CH372/CH375設備已插上';
statue:=TRUE;
end
Else
begin
If (iEventStatus = CH375_DEVICE_REMOVE) Then
begin
if(mOpen<>-1) then
begin
CH375CloseDevice (mIndex); //設備拔出,關閉設備句柄
mOpen :=-1;
end;
devstatue.Caption := '**CH372/CH375設備已拔出';
statue:=FALSE;
End;
end;
//設備打開,按鈕可用;設備沒打開,按鈕禁用
//LED1...LED8
frmmain.Button1.Enabled := statue;
frmmain.Button2.Enabled := statue;
frmmain.Button3.Enabled := statue;
frmmain.Button4.Enabled := statue;
frmmain.Button5.Enabled := statue;
frmmain.Button6.Enabled := statue;
frmmain.Button7.Enabled := statue;
frmmain.Button8.Enabled := statue;
//命令按鈕
frmmain.Button9.Enabled := statue;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
mCaptionInform:= '信息提示';
//設置設備插拔監視
if(CH375SetDeviceNotify(mIndex,'',NotifyRoutine)=FALSE) then
Application.MessageBox( '設置監視CH372/CH375設備插拔失敗', mCaptionInform, 0);
mOpen := CH375OpenDevice(mIndex); //窗體加載時打開設備
If mOpen = -1 Then
begin
//application.MessageBox( '無法打開CH375設備',mCaptionInform,MB_OK + MB_ICONEXCLAMATION);
//halt(0); //關閉程序
NotifyRoutine( CH375_DEVICE_REMOVE); //作設備拔出處理
exit;
End;
CH375SetTimeout( mIndex, 3000, 3000 ); // 設置USB數據讀寫的超時,超過3000mS未完成讀寫將強制返回,避免一直等待下去
//測試PC機與單片機之間的USB通訊,僅作演示,本身沒有意義
TestCommunication();
//下面加載中斷服務程序 , 中斷服務程序是在應用層執行的, 其線程優先級是THREAD_PRIORITY_TIME_CRITICAL
//當單片機有事需要通知計算機時 , 可以用CMD_WR_USB_DATA5命令寫入中斷特征數據, 計算機的mInterruptEvent線程將會收到該中斷特征數據
//然后mInterruptEvent線程向主程序發出消息進行處理,mInterruptEvent線程相當于中斷服務程序,代替主程序定時查詢單片機
mCallInt ; //調用中斷程序
NotifyRoutine(CH375_DEVICE_ARRIVAL); //作設備插入處理
end;
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CH375SetDeviceNotify(mIndex,'',mPCH375_NOTIFY_ROUTINE(0)); //取消息設備挺拔通知
CH375SetIntRoutine(mIndex,TiIntRoutine(0)); //取消中斷上傳
CH375CloseDevice (mIndex); //程序退出前關閉設備
halt(0);
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
CH375CloseDevice (mIndex); //程序中斷關閉設備
end;
procedure TFrmMain.Button1Click(Sender: TObject); //數碼管按鈕1
var
f: TEnterDlg;
begin
index:=0;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button2Click(Sender: TObject); //數碼管按鈕2
var
f: TEnterDlg;
begin
index:=1;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button3Click(Sender: TObject); //數碼管按鈕3
var
f: TEnterDlg;
begin
index:=2;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button4Click(Sender: TObject); //數碼管按鈕4
var
f: TEnterDlg;
begin
index:=3;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button5Click(Sender: TObject); //數碼管按鈕5
var
f: TEnterDlg;
begin
index:=4;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button6Click(Sender: TObject); //數碼管按鈕6
var
f: TEnterDlg;
begin
index:=5;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button7Click(Sender: TObject); //數碼管按鈕7
var
f: TEnterDlg;
begin
index:=6;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button8Click(Sender: TObject); //數碼管按鈕8
var
f: TEnterDlg;
begin
index:=7;
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
procedure TFrmMain.Button9Click(Sender: TObject);
var
f: TEnterDlg;
begin
index:=-1; //識別命令按鈕序號
f := TEnterDlg.Create(Self); //數據輸入框顯示
f.ShowModal;
end;
//模擬鍵盤區中按鍵按下事件
//同步按鍵顯示,鍵被按下時顯示◎,否則顯示鍵號
procedure TFrmMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = 1 Then // 鍵被按下,下面是先釋放原按鍵再讀取新按鍵值
begin
mSyncKeyboard($FF); // 釋放上次的按鍵
mSyncKeyboard(mKeyCode); //根據鍵值作同步顯示
end;
end;
//模擬鍵盤區中按鍵按下事件
//同步按鍵顯示,鍵被按下時顯示◎,否則顯示鍵號
procedure TFrmMain.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = 1 Then
mSyncKeyboard($FF); // 鍵盤按鍵松開
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -