8255A(使用C語言) - PCZONE 討論區

返回   PCZONE 討論區 > ▲ -- 電 腦 軟 體 討 論 區 > -- 其 他 軟 體 討 論 版


PCZONE 討論區



通知

-- 其 他 軟 體 討 論 版 包括磁碟或檔案管理工具、掃毒軟體、解壓縮軟體、遠端遙控軟體、備份軟體、傳真軟體、手寫或語音等各種軟體使用經驗討論

會員
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) 是正確的.
回覆
會員

引用:
最初由 gwochern 發表
這要看WR_Port這個function內容如何寫...
你這是要由x86系統去控制8255嗎?
如果是你必須要#include<dos.h>和#include<conio.h>
用outportb()和inportb()控制io
我ㄉ程式如下:可是會就會發生沒有按按鍵就會執行LED左移位ㄉ動作

#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;
}
回覆
會員

引用:
最初由 gwochern 發表
抱歉我時在沒時間幫你改程式,我只大概看了一下,一開你讓count-- 還沒減到零會跳開do{}while(1);去執行end:之後程式在跳回start:程式這樣寫有點亂,這樣可編譯嗎?可以的話,你想一下end那段程式是做什麼,之後count=0程?..
可以編譯沒有問題
end下面的內容式多工掃描目的是在掃描七段顯示器
我設count--的目的是為了防止機械彈跳當count減到0時
才讓8255A的PC去掃描keypad按鍵
掃描如果有按鍵的話
就會進入while迴圈
所以我設k=0
我知道do while迴圈好像沒有用
可是這樣用應該不是影響到主程式ㄉ問題吧

還是謝謝你

回覆
會員

謝謝大家
我解開ㄌ
回覆
等待愛情來臨

好厲害喔!! 在下也是讀電子ㄉ..............

回覆







 XML   RSS 2.0   RSS 
本站使用 vBulletin 合法版權程式
站務信箱 : [email protected]

本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。