8255A(使用C語言)
流浪者~MIT 2002-12-09, 08:55 PM ...................
#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囉??
gwochern 2002-12-10, 12:55 PM 這要看WR_Port這個function內容如何寫...
你這是要由x86系統去控制8255嗎?
如果是你必須要#include<dos.h>和#include<conio.h>
用outportb()和inportb()控制io 一般輸出/輸入共用時, 輸入的bit都拉為High.
在你的情況下, Low Nibble 必須為 0x0F 才可以.
所以 WR_Port(PC, 0x7F) 是正確的. 流浪者~MIT 2002-12-10, 07:49 PM 最初由 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;
} 流浪者~MIT 2002-12-10, 07:51 PM 副程式如下:
#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);
} 流浪者~MIT 2002-12-10, 08:01 PM 電路我用口述ㄉ
[共陽]七段顯示器是四顆ㄉ接在一起ㄉ接腳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 gwochern 2002-12-11, 01:40 PM 抱歉我時在沒時間幫你改程式,我只大概看了一下,一開你讓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;
} 流浪者~MIT 2002-12-11, 04:15 PM 最初由 gwochern 發表
抱歉我時在沒時間幫你改程式,我只大概看了一下,一開你讓count-- 還沒減到零會跳開do{}while(1);去執行end:之後程式在跳回start:程式這樣寫有點亂,這樣可編譯嗎?可以的話,你想一下end那段程式是做什麼,之後count=0程?..
可以編譯沒有問題
end下面的內容式多工掃描目的是在掃描七段顯示器
我設count--的目的是為了防止機械彈跳當count減到0時
才讓8255A的PC去掃描keypad按鍵
掃描如果有按鍵的話
就會進入while迴圈
所以我設k=0
我知道do while迴圈好像沒有用
可是這樣用應該不是影響到主程式ㄉ問題吧
還是謝謝你 流浪者~MIT 2002-12-21, 10:28 AM 謝謝大家
我解開ㄌ gorack 2002-12-27, 04:37 AM 好厲害喔!! 在下也是讀電子ㄉ.............. |