文档库 最新最全的文档下载
当前位置:文档库 › 8255A的c语言程序

8255A的c语言程序

【实例24】用8243扩展I/O端口
#include
sbit ContrBit0=P1^0;
sbit ContrBit1=P1^1;
sbit ContrBit2=P1^2;
sbit ContrBit3=P1^3;
sbit PROG=P1^4;
sbit CS=P1^5;

char driver8243(char sele_P,char sele_M,char out_data)
{
char in_data=0;
char data_buf;
PROG=1;
//置PROG为高电平
//----------------------------------------------开始写控制字-----------------------------------------------
if((sele_P&0x01)==0) //将控制字最低位送到8243的p2.0
ContrBit0=0;
else
ContrBit0=1;
if((sele_P&0x02)==0) //将控制字第二位送到8243的p2.1
ContrBit1=0;
else
ContrBit1=1;
//以上两位共同指定端口地址
//----------------------------------------写端口工作模式控制字----------------------------------------
if((sele_M&0x01)==0) //将端口工作模式控制字低位送到8243的p2.2
ContrBit2=0;
else
ContrBit2=1;
if((sele_M&0x01)==0) //将端口工作模式控制字高位送到8243的p2.3
ContrBit3=0;
else
ContrBit3=1;
//完成写控制字
PROG=0;
//在PROG上产生下降沿
switch(sele_M&0x03) //判断工作模式
{
case 0: break;
//sele_M=B00为输入,不处理,等待上升沿
case 1: data_buf=out_data;
break;
//sele_M=B01为输出,直接送数据
case 2: data_buf=out_data;
break;
//sele_M=B10为逻辑或,直接送数据
case 3: data_buf=out_data;
break;
//sele_M=B11为逻辑与,直接送数据
}
PROG=1;
//产生上升沿
if((sele_M&0x03)==0) //sele_M=B00为输入,接收数据
in_data=(data_buf&0x0F);
return(in_data);
//sele_M=B00,返回接收到的数据
}
//sele_M!=B00,返回0

void main( void)
{
char receive_data;
receive_data=driver8243(1,0,5);
}
【实例25】用8255A扩展I/O口
//----------------------------------------------------------------------------------------------------
// 函数名称:rd_PA
// 输入函数:无
// 输出参数:PA_data,PA输入的数据
// 功能说明:驱动PA实现输入功能,读入PA的并行数据
//----------------------------------------------------------------------------------------------------
unsigned char rd_PA(void) //读PA
管脚定义及函数声明
//-------------------------------------------函数声明,管脚定义-------------------------------------------
#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 bdata IO_flags;
//用于表示PA、PB、PC的当前输入输出状态
//内容不能被其他程序改写
sbit IO_flagsA=IO_flags^0;
//PA的当前输入输出状


sbit IO_flagsB=IO_flags^1;
//PB的当前输入输出状态
sbit IO_flagsC=IO_flags^2;
//PC的当前输入输出状态
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_PA(void);
//读PA
unsigned char rd_PB(void);
//读PB
unsigned char rd_PC(void);
//读PC
void wr_PA(unsigned char PA_data);
//写PA
void wr_PB(unsigned char PB_data);
//写PB
void wr_PC(unsigned char PC_data);
//写PC
void set_PC(unsigned char PC_num);
//PC位操作,置位,PC_num为端口号0~7
void clr_PC(unsigned char PC_num);
//PC位操作,复位,PC_num为端口号0~7
void PABC_config(void);
//写8255A控制字
端口A、B、C读写函数
{
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
}
//----------------------------------------------------------------------------------------------------
// 函数名称:rd_PB
// 输入函数:无
// 输出参数:PB_data,PB输入的数据
// 功能说明:驱动PB实现输入功能,读入PB的并行数据
//----------------------------------------------------------------------------------------------------
unsigned char rd_PB(void) //读PB
{
unsigned char PB_data;
ACC=IO_flags;
//把状态标志字读到ACC便于进行位操作
do
{
IO_flagsB=1;
//置PB状态标志位为高--输入
IO_flags=ACC;
PABC_config();
//调用配置子程序,完成对8255的设置
}
while(IO_flagsB==0);
//判断状态标志位是否为高
//控制字设置完成
PB_data=a8255_PB;
//把PB的数据读到PB_data
return(PB_data);
//返回PB_data
}
//----------------------------------------------------------------------------------------------------
// 函数名称:rd_PC
// 输入函数:无
// 输出参数:PC_data,PC输入的数据
// 功能说明:驱动PC实现输入功能,读入PC的并行数据
//------------------------------------------------------------------------------------------

----------
unsigned 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
}
//----------------------------------------------------------------------------------------------------
// 函数名称:wr_PA
// 输入函数:PA_data,送PA输出的数据
// 输出参数:无
// 功能说明:驱动PA实现输出功能,输出数据到PA
//----------------------------------------------------------------------------------------------------
void wr_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
}
//----------------------------------------------------------------------------------------------------
// 函数名称:wr_PB
// 输入函数:PB_data,送PB输出的数据
// 输出参数:无
// 功能说明:驱动PB实现输出功能,输出数据到PA
//----------------------------------------------------------------------------------------------------
void wr_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
}
//----------------------------------------------------------------------------------------------------
// 函数名称:wr_PC
// 输入函数:PC_data,送PC输出的数据
// 输出参数:无
// 功能说明:驱动PC实现输出功能,输出数据到PC
//----------------------------------------------------------------------------------------------------
void wr_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
}
端口C配置函数
//----------------------------------------------------------------------------------------------------
// 函数名称:set_PC
// 输入函数:PC_num,范围0~7
// 输出参数:无
// 功能说明:对PC进行位操作,置PC(PC_num)为高
//----------------------------------------------------------------------------------------------------

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;
}
//----------------------------------------------------------------------------------------------------
// 函数名称:clr_PC
// 输入函数:PC_num,范围0~7
// 输出参数:无
// 功能说明:对PC进行位操作,清PC(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;
}
写控制字函数
//----------------------------------------------------------------------------------------------------
// 函数名称:PABC_config
// 功能说明:写8255A的控制字寄存器
//----------------------------------------------------------------------------------------------------

void PABC_config(void)
{
a8255_CON=cfg_table[IO_flags];
}
【实例26】用8155扩展I/O口
相关函数声明及管脚定义
//-----------------------------------函数声明,管脚定义----------------------------------------*/
#include
#include
#define a8155_PA XBYTE[0x7E00] //控制字地址
#define a8155_PB XBYTE[0x7E01] //PA地址
#define a8155_PC XBYTE[0x7E02] //PB地址
#define a8155_CON XBYTE[0x7E03] // PC地址
#define Timer_A XBYTE[0x7E04] // 定时器寄存器A
#define Timer_B XBYTE[0x7E05] // 定时器寄存器B
#define mem_head XBYTE[0x7F00] // 存储器首地址
unsigned char bdata IO_flags;
//用于表示PA、PB、PC的当前输入输出状态
//内容不能被其他程序改写
sbit IO_flagA=IO_flags^0;
//PA的当前输入输出状态
sbit IO_flagB=IO_flags^1;
//PB的当前输入输出状态
sbit IO_flagC=IO_flags^2;
//PC的当前输入输出状态
sbit IO_flagC1=IO_flags^3;
//PC的当前输入输出状态
sbit Int_flagA=state_flags^4;
//PA的当前输入输出状态
sbit Int_flagB=state_flags^5;
//PB的当前输入输出状


sbit Timer_flag1=state_flags^6;
sbit Timer_flag2=state_flags^7;
//Timer 的状态置位表示计数中
unsigned char rd_mem(unsigned char mem_ad);
//读存储器
void wr_mem(unsigned char mem_ad,unsigned char mem_data);
//写存储器
char rd_PA(void);
//读PA
char rd_PB(void);
//读PB
char rd_PC(void);
//读PC
void wr_PA(unsigned char PA_data);
//写PA
void wr_PB(unsigned char PB_data);
//写PB
void wr_PC(unsigned char PC_data);
//写PC
void Dint_PA(void);
//关端口A中断
void Eint_PA(void);
//开端口A中断
void Dint_PB(void);
//关端口B中断
void Eint_PB(void);
//开端口B中断
void setting_PC0int(void);
void setting_PC4int(void);
void start_timer(void);
//开始计数器计数
void stop_timer(void);
//停止计数器计数
void setting_zero_stop(void);
//设定计数到零停止计数
int rd_timer(void);
//读计数值
void setting_timerout_mode(unsigned char mode);
//设定输出模式
读写外RAM函数
读写外RAM函数对外部存储器指定单元数据进行读写,程序代码如下:
//--------------------------------------------------------------------------------------------------------------
// 函数名称:rd_mem
// 输入函数:mem_ad,范围0~255
// 输出参数:mem_data,存储对应数据
// 功能说明:读外部RAM,输入相对地址,返回数据
//--------------------------------------------------------------------------------------------------------------
unsigned char rd_mem(unsigned char mem_ad) //读存储器
{
unsigned char mem_data;
unsigned int AD_mem;
AD_mem=&mem_head;
AD_mem=AD_mem+mem_ad;
mem_data=XBYTE[AD_mem];
return(mem_data);
}
//--------------------------------------------------------------------------------------------------------------
// 函数名称:wr_mem
// 输入函数:mem_ad,mem_data 相对地址和数据
// 输出参数:无
// 功能说明:写数据到外部RAM,把数据写到相应的地址
//--------------------------------------------------------------------------------------------------------------
void wr_mem(unsigned char mem_ad, unsigned char mem_data) //写存储器
{
unsigned int AD_mem;
AD_mem=&mem_head;
AD_mem=AD_mem+mem_ad;
XBYTE[AD_mem]=mem_data;
}
端口PA、端口PB以及端口PC的读写设置函数
端口PA、端口PB以及端口PC的读写设置函数主要完成对8155端口的输入输出设置及
数据读写,程序代码如下:
//----------------------------------------------------------------------------------------------------
// 函数名称:rd_PA
// 输入函数:无
// 输出参数:PA_data
// 功能说明:返回PA数据
//----------------------------------------------------------------------------------------------------
char rd_PA(void) //读PA
{
unsigned char PA_data;
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
do
{

IO_flagA=0;
//置PA状态标志位为低--输入
state_flags=ACC;
a8155_CON=state_flags;
//重写控制字,完成对8155的设置
}
while(IO_flagA==1);
//判断状态标志位是否为高
//控制字设置完成
PA_data=a8155_PA;
//把PA的数据读到PA_data
return(PA_data);
//返回PA_data
}
//----------------------------------------------------------------------------------------------------
// 读PB、PC的函数:rd_PB和rd_PC程序代码与rd_PA类似,不再赘述
//----------------------------------------------------------------------------------------------------
// 函数名称:wr_PA
// 输入函数:PA_data
// 输出参数:无
// 功能说明:把PA_data送到PA输出
//----------------------------------------------------------------------------------------------------
void wr_PA(unsigned char PA_data) //写PA
{
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
{
IO_flagA=1;
//置PA状态标志位为高--输出
state_flags=ACC;
//位操作完成,把ACC的内容写回状态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
while(IO_flagA==0);
//判断状态标志位是否为低
//为低,设置未完成,需从新设置
a8155_PA=PA_data;
//将PA_data的内容送到PA
}
//----------------------------------------------------------------------------------------------------
// 写PB、PC的函数:wr_PB和wr_PC程序代码与wr_PA类似,不再赘述
//----------------------------------------------------------------------------------------------------
(4) 端口PA、端口PB以及端口PC的中断设置函数
端口PA、端口PB以及端口PC的中断设置函数完成各个端口的中断开启和关断,程序代码如下:
// 函数名称:Eint_PA
// 输入函数:无
// 输出参数:无
// 功能说明:PA中断允许
//----------------------------------------------------------------------------------------------------
void Eint_PA(void) //开端口A中断
{
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
Int_flagA=1;
state_flags=ACC;
//位操作完成,把ACC的内容写回状态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
//----------------------------------------------------------------------------------------------------
// 函数名称:Dint_PA
// 输入函数:无
// 输出参数:无
// 功能说明:PA中断禁止
//----------------------------------------------------------------------------------------------------
void Dint_PA(void) //关端口A中断
{
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
Int_flagA=0;
state_flags=ACC;
//位操作完成,把ACC的内容写回状

态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
//----------------------------------------------------------------------------------------------------
// 开关PB中断的函数Eint_PB、Dint_PB和Eint_PA、Dint_PA程序代码类似,不再赘述
//----------------------------------------------------------------------------------------------------
端口PC上下半口配置函数:
端口PC上下半口配置函数可实现端口PC上半口配置为PA状态输出和PC下半口配置
为PB状态输出。程序代码如下:
//--------------------------------------------------------------------------------------------------------------
// 函数名称:PC0_PAint
// 输入函数:无
// 输出参数:无
// 功能说明:设置PC上半口为PA状态输出,PC0=INTRa,PC1=BFa,PC3=/STBb
//--------------------------------------------------------------------------------------------------------------
void PC0_PAint(void) //PC上半口为PA状态输出
{
//PC0=INTRa,PC1=BFa,PC3=
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
Int_flagA=1;
IO_flagC1=1;
state_flags=ACC;
//位操作完成,把ACC的内容写回状态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
//--------------------------------------------------------------------------------------------------------------
// 函数名称:PC4_PBint
// 输入函数:无
// 输出参数:无
// 功能说明:设置PC下半口为PB状态输出,PC4=INTRb,PC5=BFb,PC6=
//--------------------------------------------------------------------------------------------------------------
void PC4_PBint(void) //PC下半口为PB状态输出
{
//PC0=INTRa,PC1=BFa,PC3=
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
Int_flagA=1;
IO_flagC1=1;
IO_flagC=1;
state_flags=ACC;
//位操作完成,把ACC的内容写回状态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
计数器设置函数:
计数器设置函数完成计数器的起停和读写和输出模式设置,具体程序代码如下:
//--------------------------------------------------------------------------------------------------------------
// 函数名称:start_timer
// 输入函数:无
// 输出参数:无
// 功能说明:开始计数器计数
//--------------------------------------------------------------------------------------------------------------
void start_timer(void) //开始计数器计数
{
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
Timer_flag1=1;
Timer_flag2=1;
state_flags=ACC;
//位操作完成,把ACC的内容写回状态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
//-------------------------------------------

-------------------------------------------------------------------
// 函数名称:stop_timer
// 输入函数:无
// 输出参数:无
// 功能说明:停止计数器计数
//--------------------------------------------------------------------------------------------------------------
void stop_timer(void) //停止计数器计数
{
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
Timer_flag1=1;
Timer_flag2=0;
state_flags=ACC;
//位操作完成,把ACC的内容写回状态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
//--------------------------------------------------------------------------------------------------------------
// 函数名称:size_zero_stop
// 输入函数:无
// 输出参数:无
// 功能说明:设定计数到零停止计数
//--------------------------------------------------------------------------------------------------------------
void stop_timer(void) //停止计数器计数
{
ACC=state_flags;
//把状态标志字读到ACC便于进行位操作
Timer_flag1=1;
Timer_flag2=0;
state_flags=ACC;
//位操作完成,把ACC的内容写回状态标志字
a8155_CON=state_flags;
//写控制字,完成对8155的设置
}
//--------------------------------------------------------------------------------------------------------------
// 函数名称:rd_timer
// 输入函数:无
// 输出参数:time
// 功能说明:读计数值
//--------------------------------------------------------------------------------------------------------------
int rd_timer(void) //读计数值
{
int time;
char timea;
time=Timer_B;
timea=Timer_A;
time=time<<8;
time=((time&timea)&0x3F);
return(time);
}
//--------------------------------------------------------------------------------------------------------------
// 函数名称:setting_timerout_mode
// 输入函数:mode,范围0~3
// 输出参数:无
// 功能说明:设定 输出模式
//--------------------------------------------------------------------------------------------------------------
void setting_timerout_mode(unsigned char mode)//设定输出模式
{
Timer_B=(mode&0x03);
//写控制字
}


相关文档
相关文档 最新文档