加油!!加油!!
加油!!加油!!
小弟我也類似的問題....想要麻煩大大幫我解一下,也是關於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的動作,我和數位同學弄了一個下午,還是沒有下文....麻煩高手大大,指點我一條明路
書籤