| 會員 ![]() | 加油!!加油!! |
| 回覆 |
| 會員 ![]() | 回覆: 8255A(使用C語言) 小弟我也類似的問題....想要麻煩大大幫我解一下,也是關於8255晶片控制的 以下是原程式: #include <stdio.h> #include <conio.h> #include <dos.h> #include "LPT_Win.C" //引入實驗卡所提共各種I/O函數 #define PA 0x00 //定義8255各個Port與控制暫存器之位址 #define PB 0x01 #define PC 0x02 #define Ctrl 0x03 main( ) { char key=0,prv_key=0; int i,buf,tst,tmp=0; LoadIODLL( ); //載入WIN32 I/O動態連結檔 Set_EPP( ); //若平行埠為ECP模式,則將導向EPP模式 clrscr( ); //清除控制台模式視窗螢幕 WR_Port(Ctrl,0x89); //規劃8255為Mode 0,且PA為輸出,PC為輸入 WR_Port(PA,0xff); //起始時所有LEDs皆不顯示 printf("Select display modes or Select 'Q'to exit\n"); //按鍵功能畫面顯示 printf("'1': Display the corresponding 'ON' positiions of DIP S.W\n"); printf("'2': Display the highest 'ON' position of DIP S.W\n"); printf("'3': Display the sum of the 'ON' numbers of DIP S.W\n"); do{ if(kbhit( )) //按鍵輸入偵測 { key=getch( ); //取出鍵值 if(key>0x60) key=key-0x20; //強制將小寫鍵轉為大寫鍵 } else key=prv_key; //若無按鍵輸入則保持原鍵值 switch(key) { case 0: break; //起始時鍵值 case '1': //功能選項1 prv_key=key; //更新鍵值 buf=RD_Port(PC); //由Port C讀取DIP S.W設定值 WR_Port(PA,buf); //直接將Port C讀取值輸出至LEDs break; case '2': //功能選項2 prv_key=key; //更新鍵值 buf=~RD_Port(PC); //由Port C讀取DIP S.W設定值,並將之取補數 tst=0x80; for(i=8;i>0;i--) //由讀取值最高位元逐一遞減檢查是否為"Hi" { if((buf&tst)==0) tst=tst>>1; else break; //若該位元為"Hi",則停止檢查 } WR_Port(PA,~tst); //顯示相對應於第一個為"Hi"位元位置之LED break; case '3': //功能選項3 prv_key=key; //更新鍵值 buf=~RD_Port(PC); //由Port C讀取DIP S.W設定值,並將之取補數 tst=0x80; for(i=8;i>0;i--) //由讀取值最高位元逐一遞減檢查是否為"Hi" { if((buf&tst)!=0) tmp=tmp+i; //若該位元為"Hi",則累加該位元編號大小 tst=tst>>1; } WR_Port(PA,~tmp); //顯示累加值其相對應二進值之LEDs tmp=0; break; case 'Q': exit(0); //離開程式 break; default: key=prv_key; //若非指定按鍵輸入,仍保持原鍵值 break; } }while(1); } 老師希望我們改成,不使用鍵盤,只使用DIP SW來控制LED的動作,我和數位同學弄了一個下午,還是沒有下文....麻煩高手大大,指點我一條明路 |
| 回覆 |
| XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。