у меня компанента WG12864 (128 * 64 пикселя, графический) очень помогла в отладке драйвера. произошла проблема с двунаправлеными портами, поэтому пришлось дублировать дважды порты при инициализации Вот инициализация компаненты в VMLABе: XLCD _WG12864 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 D/I R/W E CS1 CS2 например: XLCD _WG12864 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PA0 PA1 PA2 PA3 PA4 кому надо, вот исходник: Добавлено @ 12:37 WG12864.cpp
| Код | #include <windows.h> #include <commctrl.h> #include <stdio.h> #include <Graphics.hpp> #pragma hdrstop #include "../bin/blackbox.h" int WINAPI DllEntryPoint(HINSTANCE, unsigned long, void*) {return 1;} // is DLL //============================================================================== DECLARE_PINS DIGITAL_BID(O0, 1); DIGITAL_BID(O1, 2); DIGITAL_BID(O2, 3); DIGITAL_BID(O3, 4); DIGITAL_BID(O4, 5); DIGITAL_BID(O5, 6); DIGITAL_BID(O6, 7); DIGITAL_BID(O7, 8); DIGITAL_IN(I0, 9); DIGITAL_IN(I1, 10); DIGITAL_IN(I2, 11); DIGITAL_IN(I3, 12); DIGITAL_IN(I4, 13); DIGITAL_IN(I5, 14); DIGITAL_IN(I6, 15); DIGITAL_IN(I7, 16); DIGITAL_IN(bD, 17); DIGITAL_IN(bR, 18); DIGITAL_IN(bE, 19); DIGITAL_IN(bCS0, 20); DIGITAL_IN(bCS1, 21); END_PINS //--------------------------------------------------------------------------- DECLARE_VAR unsigned char Data; unsigned char X0; unsigned char Y0; unsigned char X1; unsigned char Y1; char CS0; char CS1; char E; char R; char D; char Takt; unsigned char D0[512]; unsigned char D1[512]; FARPROC OldProc0; FARPROC OldProc1; bool On; END_VAR //--------------------------------------------------------------------------- USE_WINDOW(WINDOW_USER_1); //--------------------------------------------------------------------------- #define pOn clBlack #define pOff 0x007FC382 //--------------------------------------------------------------------------- void Clear(); //--------------------------------------------------------------------------- long Proc0(HWND hWnd, unsigned uMsg, WORD wParam, LONG lParam){ long Res; switch(uMsg){ case WM_PAINT: if (VAR(On) == true){ Res = CallWindowProc((WNDPROC)VAR(OldProc0), hWnd, uMsg, wParam, lParam); HDC hDC = GetDC(hWnd); for (int y = 0; y < 64; y++){ for (int x = 0; x < 8; x++){ for (int i = 0; i < 8; i++){ SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 0, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 0, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 1, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 1, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); } } } ReleaseDC(hWnd, hDC); } return Res; } return CallWindowProc((WNDPROC)VAR(OldProc0), hWnd, uMsg, wParam, lParam); } //--------------------------------------------------------------------------- long Proc1(HWND hWnd, unsigned uMsg, WORD wParam, LONG lParam){ long Res; switch(uMsg){ case WM_PAINT: if (VAR(On) == true){ Res = CallWindowProc((WNDPROC)VAR(OldProc1), hWnd, uMsg, wParam, lParam); HDC hDC = GetDC(hWnd); for (int y = 0; y < 64; y++){ for (int x = 0; x < 8; x++){ for (int i = 0; i < 8; i++){ SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 0, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 0, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 1, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 1, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); } } } ReleaseDC(hWnd, hDC); } return Res; } return CallWindowProc((WNDPROC)VAR(OldProc1), hWnd, uMsg, wParam, lParam); } //--------------------------------------------------------------------------- void SetX0(unsigned char Value){ Value &= 0x07; VAR(X0) = Value; char Text[9]; sprintf(Text, "%d", Value); SetWindowText(GET_HANDLE(GADGET2), Text); } //--------------------------------------------------------------------------- void SetY0(unsigned char Value){ Value &= 0x3F; VAR(Y0) = Value; char Text[9]; sprintf(Text, "%d", Value); SetWindowText(GET_HANDLE(GADGET3), Text); } //--------------------------------------------------------------------------- void SetX1(unsigned char Value){ Value &= 0x07; VAR(X1) = Value; char Text[9]; sprintf(Text, "%d", Value); SetWindowText(GET_HANDLE(GADGET4), Text); } //--------------------------------------------------------------------------- void SetY1(unsigned char Value){ Value &= 0x3F; VAR(Y1) = Value; char Text[9]; sprintf(Text, "%d", Value); SetWindowText(GET_HANDLE(GADGET5), Text); } //--------------------------------------------------------------------------- void Instruction(){ if (VAR(Takt) == false){ } else { if (VAR(Data) == 0x3F){ SetWindowText(GET_HANDLE(GADGET13), "On"); VAR(On) = true; Clear(); } else if (VAR(Data) == 0x3E){ SetWindowText(GET_HANDLE(GADGET13), "Off"); VAR(On) = false; Clear(); } else if ((VAR(Data) & 0xC0) == 0x80){ SetWindowText(GET_HANDLE(GADGET13), "X"); if (GET_LOGIC(bCS0)) SetX0(VAR(Data) & 0x07); if (GET_LOGIC(bCS1)) SetX1(VAR(Data) & 0x07); } else if ((VAR(Data) & 0xC0) == 0x40){ SetWindowText(GET_HANDLE(GADGET13), "Y"); if (GET_LOGIC(bCS0)) SetY0(VAR(Data) & 0x3F); if (GET_LOGIC(bCS1)) SetY1(VAR(Data) & 0x3F); } else { char Text[10]; sprintf(Text, "0x%02X", VAR(Data)); SetWindowText(GET_HANDLE(GADGET13), Text); } } } //--------------------------------------------------------------------------- void DataOut0(unsigned int X, unsigned int Y){ LOGIC bit[8]; for (int i = 0; i < 8; i++) bit[i] = (VAR(D0)[Y * 8 + X] >> i) & 1; SET_LOGIC(O0, bit[0], 0); SET_LOGIC(O1, bit[1], 0); SET_LOGIC(O2, bit[2], 0); SET_LOGIC(O3, bit[3], 0); SET_LOGIC(O4, bit[4], 0); SET_LOGIC(O5, bit[5], 0); SET_LOGIC(O6, bit[6], 0); SET_LOGIC(O7, bit[7], 0); } //--------------------------------------------------------------------------- void DataOut1(unsigned int X, unsigned int Y){ LOGIC bit[8]; for (int i = 0; i < 8; i++) bit[i] = (VAR(D1)[Y * 8 + X] >> i) & 1; SET_LOGIC(O0, bit[0], 0); SET_LOGIC(O1, bit[1], 0); SET_LOGIC(O2, bit[2], 0); SET_LOGIC(O3, bit[3], 0); SET_LOGIC(O4, bit[4], 0); SET_LOGIC(O5, bit[5], 0); SET_LOGIC(O6, bit[6], 0); SET_LOGIC(O7, bit[7], 0); } //--------------------------------------------------------------------------- void DataOut(){ if (VAR(Takt) == false){ SetWindowText(GET_HANDLE(GADGET13), "DR1"); if (GET_LOGIC(bCS0)) DataOut0(VAR(X0), VAR(Y0)); if (GET_LOGIC(bCS1)) DataOut1(VAR(X1), VAR(Y1)); } else { SetWindowText(GET_HANDLE(GADGET13), "DR2"); } } //--------------------------------------------------------------------------- void Status(){ } //--------------------------------------------------------------------------- void DataIn0(unsigned int x, unsigned int y){ if (VAR(On) == true){ VAR(D0)[y * 8 + x] = VAR(Data); HDC hDC = GetDC(GET_HANDLE(GADGET0)); for (int i = 0; i < 8; i++){ SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 0, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 0, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 1, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 1, ((VAR(D0)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); } ReleaseDC(GET_HANDLE(GADGET0), hDC); SetY0(VAR(Y0) + 1); } } //--------------------------------------------------------------------------- void DataIn1(unsigned int x, unsigned int y){ if (VAR(On) == true){ VAR(D1)[y * 8 + x] = VAR(Data); HDC hDC = GetDC(GET_HANDLE(GADGET1)); for (int i = 0; i < 8; i++){ SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 0, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 0, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 0, y * 2 + 1, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); SetPixel(hDC, (x * 8 + i) * 2 + 1, y * 2 + 1, ((VAR(D1)[y * 8 + x] >> (7 - i)) & 1) ?pOn :pOff); } ReleaseDC(GET_HANDLE(GADGET1), hDC); SetY1(VAR(Y1) + 1); } } //--------------------------------------------------------------------------- void DataIn(){ if (VAR(Takt) == false){ SetWindowText(GET_HANDLE(GADGET13), "DW1"); } else { SetWindowText(GET_HANDLE(GADGET13), "DW2"); if (GET_LOGIC(bCS0)) DataIn0(VAR(X0), VAR(Y0)); if (GET_LOGIC(bCS1)) DataIn1(VAR(X1), VAR(Y1)); } } //--------------------------------------------------------------------------- void SetE(LOGIC Value){ VAR(E) = Value; if (Value == 1){ char Text[9]; LOGIC bit[8]; bit[0] = GET_LOGIC(I7); bit[1] = GET_LOGIC(I6); bit[2] = GET_LOGIC(I5); bit[3] = GET_LOGIC(I4); bit[4] = GET_LOGIC(I3); bit[5] = GET_LOGIC(I2); bit[6] = GET_LOGIC(I1); bit[7] = GET_LOGIC(I0); VAR(Data) = 0; for(int j = 0; j < 8; j++){ if (bit[j] == 2){ Text[j] = 'X'; } else { Text[j] = '0' + bit[j]; VAR(Data) = VAR(Data) * 2 + bit[j]; } } Text[8] = '\0'; SetWindowText(GET_HANDLE(GADGET6), Text); sprintf(Text, "0x%02X", VAR(Data)); SetWindowText(GET_HANDLE(GADGET7), Text); if (GET_LOGIC(bR)){ if (GET_LOGIC(bD)){ DataOut(); } else { SetWindowText(GET_HANDLE(GADGET13), "S"); Status(); } } else { if (GET_LOGIC(bD)){ DataIn(); } else { SetWindowText(GET_HANDLE(GADGET13), "I"); Instruction(); } } SetWindowText(GET_HANDLE(GADGET10), "1"); VAR(Takt) = !VAR(Takt); } else if (Value == 0) SetWindowText(GET_HANDLE(GADGET10), "0"); else SetWindowText(GET_HANDLE(GADGET10), "X"); } //--------------------------------------------------------------------------- void SetR(LOGIC Value){ VAR(R) = Value; if (Value == 1){ SetWindowText(GET_HANDLE(GADGET9), "1"); SET_DRIVE(O0, true); SET_DRIVE(O1, true); SET_DRIVE(O2, true); SET_DRIVE(O3, true); SET_DRIVE(O4, true); SET_DRIVE(O5, true); SET_DRIVE(O6, true); SET_DRIVE(O7, true); } else { SET_DRIVE(O0, false); SET_DRIVE(O1, false); SET_DRIVE(O2, false); SET_DRIVE(O3, false); SET_DRIVE(O4, false); SET_DRIVE(O5, false); SET_DRIVE(O6, false); SET_DRIVE(O7, false); if (Value == 0) SetWindowText(GET_HANDLE(GADGET9), "0"); else SetWindowText(GET_HANDLE(GADGET9), "X"); } } //--------------------------------------------------------------------------- void SetD(LOGIC Value){ VAR(D) = Value; if (Value == 1) SetWindowText(GET_HANDLE(GADGET8), "1"); else if (Value == 0) SetWindowText(GET_HANDLE(GADGET8), "0"); else SetWindowText(GET_HANDLE(GADGET8), "X"); } //--------------------------------------------------------------------------- void SetCS0(LOGIC Value){ VAR(CS0) = Value; if (Value == 1) SetWindowText(GET_HANDLE(GADGET11), "1"); else if (Value == 0) SetWindowText(GET_HANDLE(GADGET11), "0"); else SetWindowText(GET_HANDLE(GADGET11), "X"); } //--------------------------------------------------------------------------- void SetCS1(LOGIC Value){ VAR(CS1) = Value; if (Value == 1) SetWindowText(GET_HANDLE(GADGET12), "1"); else if (Value == 0) SetWindowText(GET_HANDLE(GADGET12), "0"); else SetWindowText(GET_HANDLE(GADGET12), "X"); } //--------------------------------------------------------------------------- void Clear(){ SetX0(0); SetY0(0); SetX1(0); SetY1(0); SetE(-1); SetCS0(-1); SetCS1(-1); SetR(-1); SetD(-1); for (int y = 0; y < 64; y++){ for (int x = 0; x < 8; x++){ VAR(D0)[y * 8 + x] = 0; VAR(D1)[y * 8 + x] = 0; } } CallWindowProc((WNDPROC)Proc0, GET_HANDLE(GADGET0), WM_PAINT, 0, 0); CallWindowProc((WNDPROC)Proc1, GET_HANDLE(GADGET1), WM_PAINT, 0, 0); } //--------------------------------------------------------------------------- const char *On_create(){ return NULL; } //--------------------------------------------------------------------------- void On_window_init(HWND pHandle){ VAR(OldProc0) = 0L; VAR(OldProc1) = 0L; VAR(On) = false; } //--------------------------------------------------------------------------- void On_destroy(){ } //--------------------------------------------------------------------------- void On_simulation_begin(){ VAR(OldProc0) = (FARPROC)(LONG)GetWindowLong(GET_HANDLE(GADGET0), GWL_WNDPROC); SetWindowLong(GET_HANDLE(GADGET0), GWL_WNDPROC, (LONG)(FARPROC)Proc0); VAR(OldProc1) = (FARPROC)(LONG)GetWindowLong(GET_HANDLE(GADGET1), GWL_WNDPROC); SetWindowLong(GET_HANDLE(GADGET1), GWL_WNDPROC, (LONG)(FARPROC)Proc1); Clear(); } //--------------------------------------------------------------------------- void On_simulation_end(){ SetWindowLong(GET_HANDLE(GADGET0), GWL_WNDPROC, (LONG)(FARPROC)VAR(OldProc0)); SetWindowLong(GET_HANDLE(GADGET1), GWL_WNDPROC, (LONG)(FARPROC)VAR(OldProc1)); SetWindowText(GET_HANDLE(GADGET0), ""); SetWindowText(GET_HANDLE(GADGET1), ""); VAR(On) = false; } //--------------------------------------------------------------------------- void On_digital_in_edge(PIN pDigitalIn, EDGE pEdge, double pTime){ switch(pDigitalIn) { case bE: if (VAR(E) != (char)GET_LOGIC(bE)) SetE(GET_LOGIC(bE)); break; case bD: if (VAR(D) != (char)GET_LOGIC(bD)) SetD(GET_LOGIC(bD)); break; case bCS0: if (VAR(CS0) != (char)GET_LOGIC(bCS0)) SetCS0(GET_LOGIC(bCS0)); break; case bCS1: if (VAR(CS1) != (char)GET_LOGIC(bCS1)) SetCS1(GET_LOGIC(bCS1)); break; } if (VAR(R) != (char)GET_LOGIC(bR)) SetR(GET_LOGIC(bR)); } //--------------------------------------------------------------------------- double On_voltage_ask(PIN pAnalogOut, double pTime){ return KEEP_VOLTAGE; } //--------------------------------------------------------------------------- void On_time_step(double pTime){ } //--------------------------------------------------------------------------- void On_remind_me(double pTime, int pData){ } //--------------------------------------------------------------------------- void On_gadget_notify(GADGET pGadgetId, int pCode){ switch(pGadgetId){ case GADGET14: if(pCode == BN_CLICKED){ Clear(); } break; } } //---------------------------------------------------------------------------
|
|