會員 | 8255A(使用C語言) ................... #define PA 0x00 #define PB 0x01 #define PC 0x02 #define Ctrl 0x03 WR_Port(Ctrl,0x81) /*定義PA,PB為輸出PC4~PC7為輸出 PC0~PC3為輸入*/ main() { ........ WR_Port(PC,0x7f); /*寫出去PC為0x7f的資料*/ x=RD_Port(PC); /*讀入PC的資料設定到x*/ 請問 照我定義那樣設定,那這句WR_Port(PC,0x7f) 1.還可以寫出0x7f嗎?? 2.如果是的話,那讀入應該就是0x7f囉?? |
回覆 |
會員 | 這要看WR_Port這個function內容如何寫... 你這是要由x86系統去控制8255嗎? 如果是你必須要#include<dos.h>和#include<conio.h> 用outportb()和inportb()控制io |
回覆 |
會員 | 一般輸出/輸入共用時, 輸入的bit都拉為High. 在你的情況下, Low Nibble 必須為 0x0F 才可以. 所以 WR_Port(PC, 0x7F) 是正確的. |
回覆 |
會員 | 引用:
#include <stdio.h> #include <dos.h> #include<conio.h> #include<stdlib.h> #include "lpt.c" #define PA 0x00 #define PB 0x01 #define PC 0x02 #define Ctrl 0x03 main() { int seg7[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x96}; int buf[4]={0xff,0xff,0xff,0xff}; int scan[4]={0x0e,0x0d,0x0b,0x07}; int scanpc[4]={0x7f,0xbf,0xdf,0xef}; int i,j,k,m; int value,tmp; int sum; int count=5; WR_Port(Ctrl,0x81); WR_Port(PB,0x0f); printf("push keypad\n"); start: do { count--; if(count==0) { k=0; for(m=0;m<4;m++) { WR_Port(PC,scanpc[m]); tmp=RD_Port(PC); value=(tmp|0xf0); if(m==0) { if(value==0xfe) { sum=1; } if(value==0xfd) { sum=2; } if(value==0xfb) { sum=3; } if(value==0xf7) { sum=10; } } if(m==1) { if(value==0xfe) { sum=4; } if(value==0xfd) { sum=5; } if(value==0xfb) { sum=6; } if(value==0xf7) { sum=11; } } if(m==2) { if(value==0xfe) { sum=7; } if(value==0xfd) { sum=8; } if(value==0xfb) { sum=9; } if(value==0xf7) { sum=12; } } if(m==3) { if(value==0xfe) { sum=14; } if(value==0xfd) { sum=0; } if(value==0xfb) { sum=15; } if(value==0xf7) { sum=13; } } } } while(k==0) { k=-1; count=5; for(i=0;i<3;i++) { buf[i]=buf[i+1]; } buf[3]=seg7[sum]; break; } goto end; }while(1); end: for(j=3;j>=0;j--) { WR_Port(PA,buf[j]); WR_Port(PB,scan[j]); delay(4); WR_Port(PB,0x0f); } goto start; } | |
回覆 |
會員 | 副程式如下: #define LPT_Data 0x378 #define LPT_Ctrl 0x37a WR_Port(int Port,int Data) { Port=(~Port) & (0x03); outportb(LPT_Ctrl,0x04+Port); outportb(LPT_Data,Data); outportb(LPT_Ctrl,0x0c+Port); delay(1); outportb(LPT_Ctrl,0x04+Port); } RD_Port(int Port) { int Data; Port=(~Port) & (0x03); outportb(LPT_Data,0xff); outportb(LPT_Ctrl,0x24+Port); outportb(LPT_Ctrl,0x20+Port); outportb(LPT_Data,0xff); delay(1); Data=inportb(LPT_Data); outportb(LPT_Ctrl,0x24+Port); return(Data); } |
回覆 |
會員 | 電路我用口述ㄉ [共陽]七段顯示器是四顆ㄉ接在一起ㄉ接腳A~G DP是內部共接ㄉ PA0~PA7接七段顯示器A~G DP 七段顯示器由一ㄍ9012BJT控制 BJT射極接VCC(5V),基極接PB0~PB3,集極接七段ㄉcommon端 當PB0送出High時七段顯示器關閉 PC0~PC3為input,PC4~PC7為output PC4~PC7為keypad的行掃描碼 PC0~PC3為讀入列掃描碼 當有按按鍵時,PC0~PC3有一ㄍbit為Low 否則為High |
回覆 |
會員 | 抱歉我時在沒時間幫你改程式,我只大概看了一下,一開你讓count-- 還沒減到零會跳開do{}while(1);去執行end:之後程式在跳回start:程式這樣寫有點亂,這樣可編譯嗎?可以的話,你想一下end那段程式是做什麼,之後count=0程式會去執行if(count==0){}這段,你想一下這段程式是做什麼,到m<4時,k為0去執行while(k==0){},你想一下這段程式是做什麼,總結,這是你這段程式的跑法,想一下這是你要的嗎???希望有用...還有你那個do{}while(1);有像沒什麼用處,被你用goto跳來跳去...如果我說錯請見諒 start: do { count--; if(count==0) { k=0; for(m=0;m<4;m++) { WR_Port(PC,scanpc[m]); tmp=RD_Port(PC); value=(tmp|0xf0); if(m==0) { if(value==0xfe) { sum=1; } if(value==0xfd) { sum=2; } if(value==0xfb) { sum=3; } if(value==0xf7) { sum=10; } } if(m==1) { if(value==0xfe) { sum=4; } if(value==0xfd) { sum=5; } if(value==0xfb) { sum=6; } if(value==0xf7) { sum=11; } } if(m==2) { if(value==0xfe) { sum=7; } if(value==0xfd) { sum=8; } if(value==0xfb) { sum=9; } if(value==0xf7) { sum=12; } } if(m==3) { if(value==0xfe) { sum=14; } if(value==0xfd) { sum=0; } if(value==0xfb) { sum=15; } if(value==0xf7) { sum=13; } } } } while(k==0) { k=-1; count=5; for(i=0;i<3;i++) { buf[i]=buf[i+1]; } buf[3]=seg7[sum]; break; } goto end; }while(1); end: for(j=3;j>=0;j--) { WR_Port(PA,buf[j]); WR_Port(PB,scan[j]); delay(4); WR_Port(PB,0x0f); } goto start; } |
回覆 |
會員 | 引用:
end下面的內容式多工掃描目的是在掃描七段顯示器 我設count--的目的是為了防止機械彈跳當count減到0時 才讓8255A的PC去掃描keypad按鍵 掃描如果有按鍵的話 就會進入while迴圈 所以我設k=0 我知道do while迴圈好像沒有用 可是這樣用應該不是影響到主程式ㄉ問題吧 還是謝謝你 | |
回覆 |
會員 | 謝謝大家 我解開ㄌ |
回覆 |
等待愛情來臨 | 好厲害喔!! 在下也是讀電子ㄉ.............. |
回覆 |
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。