8255编程c语言程序,51单片机8255驱动C程序
/*----------------------------------------------------------------------------------------------------------------
庫文件名稱:driver8155.h
功能描述:驅動8155,不需要了解8255的工作原理,透明操作8255的三個輸入輸出口PA、PB、PC
讀A口只需要調用rd_PA,寫則需要調用wr_PA;B、C操作也一樣
全局變量:?IO_flags,在其它程序中不能對其改寫
特殊說明:?無
//----------------------------------------------------------------------------------------------------------------*/
#include
unsigned?char?const?cfg_table[8]={
0x80,???????/*10000000b,???????;c=out??b=out??a=out*/
0x90,???????/*10010000b,???????;c=out??b=out??a=in?*/
0x82,???????/*10000010b,???????;c=out??b=in???a=out*/
0x92,???????/*10010010b,???????;c=out??b=in???a=in?*/
0x89,???????/*10001001b,???????;c=in???b=out??a=out*/
0x99,???????/*10011001b,???????;c=in???b=out??a=in?*/
0x8B,???????/*10001011b,???????;c=in???b=in???a=out*/
0x9B,???????/*10011011b,???????;c=in???b=in???a=in?*/
};
unsigned?char?rd_mem(unsigned?char?mem_ad)
{
} void?PABC_config(void?)
{
a8255_CON=cfg_table[IO_flags];
} char?rd_PA(void)?????????????????????????/*讀PA口*/
{
unsigned?char?PA_data;
ACC=IO_flags;?????????????/*把狀態標志字讀到ACC便于進行位操作*/
do
{
IO_flagsA=1;??????????????/*置PA狀態標志位為高--輸入*/
IO_flags=ACC;
PABC_config();??????????????/*調用配置子程序,完成對8255的設置*/
ACC=IO_flags;
}
while(IO_flagsA==0);?????/*判斷狀態標志位是否為高*/
/*控制字設置完成*/
PA_data=a8255_PA;?????????/*把PA口的數據讀到PA_data*/
return(PA_data);?????????/*返回PA_data*/
}
char?rd_PB(void)?????????????????????????/*讀PB口*/
{
unsigned?char?PB_data;
ACC=IO_flags;?????????????/*把狀態標志字讀到ACC便于進行位操作*/
do
{
IO_flagsB=1;??????????????/*置PB狀態標志位為高--輸入*/
IO_flags=ACC;
PABC_config();??????????????/*調用配置子程序,完成對8255的設置*/
ACC=IO_flags;
}
while(IO_flagsB==0);?????/*判斷狀態標志位是否為高*/
/*控制字設置完成*/
PB_data=a8255_PB;?????????/*把PA口的數據讀到PB_data*/
return(PB_data);?????????/*返回PB_data*/
}
char?rd_PC(void)?????????????????????????/*讀PC口*/
{
unsigned?char?PC_data;
ACC=IO_flags;?????????????/*把狀態標志字讀到ACC便于進行位操作*/
do
{
IO_flagsC=1;??????????????/*置PC狀態標志位為高--輸入*/
IO_flags=ACC;
PABC_config();??????????????/*調用配置子程序,完成對8255的設置*/
ACC=IO_flags;
}
while(IO_flagsC==0);?????/*判斷狀態標志位是否為高*/
/*控制字設置完成*/
PC_data=a8255_PC;?????????/*把PC口的數據讀到PC_data*/
return(PC_data);?????????/*返回PC_data*/
} void?wd_PA(unsigned?char?PA_data)??????????/*寫PA口*/
{
ACC=IO_flags;??????????????/*把狀態標志字讀到ACC便于進行位操作*/
{IO_flagsA=0;??????????????/*置PA狀態標志位為低--輸出*/
IO_flags=ACC;??????????????/*位操作完成,把ACC的內容寫回狀態標志字*/
PABC_config();??????????????/*調用配置子程序,完成對8255的設置*/
ACC=IO_flags;
}
while(IO_flagsA==1);??????/*判斷狀態標志位是否為高
為高,設置未完成,需從新設置*/ ???????????????a8255_PA=PA_data;???????????/*將PA_data的內容送到PA口*/
}
void?wd_PB(unsigned?char?PB_data)??????????/*寫PB口*/
{
ACC=IO_flags;??????????????/*把狀態標志字讀到ACC便于進行位操作*/
{IO_flagsB=0;??????????????/*置PB狀態標志位為低--輸出*/
IO_flags=ACC;??????????????/*位操作完成,把ACC的內容寫回狀態標志字*/
PABC_config();??????????????/*調用配置子程序,完成對8255的設置*/
ACC=IO_flags;
}
while(IO_flagsB==1);??????/*判斷狀態標志位是否為高
為高,設置未完成,需從新設置*/ ???????????????a8255_PB=PB_data;???????????/*將PB_data的內容送到PB口*/
}
void?wd_PC(unsigned?char?PC_data)??????????/*寫PC口*/
{
ACC=IO_flags;??????????????/*把狀態標志字讀到ACC便于進行位操作*/
{IO_flagsC=0;??????????????/*置PC狀態標志位為低--輸出*/
IO_flags=ACC;??????????????/*位操作完成,把ACC的內容寫回狀態標志字*/
PABC_config();??????????????/*調用配置子程序,完成對8255的設置*/
ACC=IO_flags;
}
while(IO_flagsC==1);??????/*判斷狀態標志位是否為高
為高,設置未完成,需從新設置*/ ???????????????a8255_PC=PC_data;???????????/*將PC_data的內容送到PC口*/
}
void?set_PC(unsigned?char?PC_num)
{
ACC=IO_flags;
IO_flagsC=0;
ACC=IO_flags;
PC_num=PC_num<<1;
PC_num=(PC_num|0x01);
a8255_CON=PC_num;
}
void?clr_PC(unsigned?char?PC_num)
{
ACC=IO_flags;
IO_flagsC=1;
ACC=IO_flags;
PC_num=PC_num<<1;
PC_num=(PC_num&0xFE);
a8255_CON=PC_num;
}
void?main(void)
{
set_PC(0x01);
}
/*---------------------------------------------------
文件名稱:Config.h
功能描述:端口定義和RAM配置
輸入參數:無
輸出參數:無
特殊說明:根據具體分配的地址,重新設定各值
//----------------------------------------------------------------------------------------------------------------*/
#include
#include
#define a8255_PA??? XBYTE[0x7F7C]???? /*PA口地址*/
#define a8255_PB??? XBYTE[0x7F7D]???? /*PB口地址*/
#define a8255_PC??? XBYTE[0x7F7E]???? /*PC口地址*/
#define a8255_CON?? XBYTE[0x7F7F]???? /*控制字地址*/
unsigned char IO_flags;?? /* 用于表示PA、PB、PC的當前輸入輸出狀態
內容不能被其它程序改寫,操作時ACC=IO_flags*/
sbit??? IO_flagsA=ACC^0;? /*PA的當前輸入輸出狀態
置位表示輸入,復位表示輸出*/
sbit??? IO_flagsB=ACC^1;? /*PB的當前輸入輸出狀態*/
sbit??? IO_flagsC=ACC^2;? /*PC的當前輸入輸出狀態*/
char rd_PA(void);????????? /*讀PA口*/
char rd_PB(void);????????? /*讀PB口*/
char rd_PC(void);????????? /*讀PC口*/
void wd_PA(unsigned char PA_data);? /*寫PA口*/
void wd_PB(unsigned char PB_data);? /*寫PA口*/
void wd_PC(unsigned char PC_data);? /*寫PA口*/
void PABC_config(void );??????????? /*寫8255控制字*/
總結
以上是生活随笔為你收集整理的8255编程c语言程序,51单片机8255驱动C程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何解除路由器用户上网限制 腾达如何取消
- 下一篇: 怎么判断路由器LAN口是百兆还是千兆 如