8255的应用C语言版本.docx
- 文档编号:9384860
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:27
- 大小:19.01KB
8255的应用C语言版本.docx
《8255的应用C语言版本.docx》由会员分享,可在线阅读,更多相关《8255的应用C语言版本.docx(27页珍藏版)》请在冰豆网上搜索。
8255的应用C语言版本
【实例24】用8243扩展I/O端口
#include
sbitContrBit0=P1^0;
sbitContrBit1=P1^1;
sbitContrBit2=P1^2;
sbitContrBit3=P1^3;
sbitPROG=P1^4;
sbitCS=P1^5;
chardriver8243(charsele_P,charsele_M,charout_data)
{
charin_data=0;
chardata_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)//判断工作模式
{
case0:
break;
//sele_M=B00为输入,不处理,等待上升沿
case1:
data_buf=out_data;
break;
//sele_M=B01为输出,直接送数据
case2:
data_buf=out_data;
break;
//sele_M=B10为逻辑或,直接送数据
case3:
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
voidmain(void)
{
charreceive_data;
receive_data=driver8243(1,0,5);
}
【实例25】用8255A扩展I/O口
//----------------------------------------------------------------------------------------------------
//函数名称:
rd_PA
//输入函数:
无
//输出参数:
PA_data,PA输入的数据
//功能说明:
驱动PA实现输入功能,读入PA的并行数据
//----------------------------------------------------------------------------------------------------
unsignedcharrd_PA(void)//读PA
(1)管脚定义及函数声明
//-------------------------------------------函数声明,管脚定义-------------------------------------------
#include
#include
#definea8255_PAXBYTE[0x7F7C]//PA地址
#definea8255_PBXBYTE[0x7F7D]//PB地址
#definea8255_PCXBYTE[0x7F7E]//PC地址
#definea8255_CONXBYTE[0x7F7F]//控制字地址
unsignedcharbdataIO_flags;
//用于表示PA、PB、PC的当前输入输出状态
//内容不能被其他程序改写
sbitIO_flagsA=IO_flags^0;
//PA的当前输入输出状态
sbitIO_flagsB=IO_flags^1;
//PB的当前输入输出状态
sbitIO_flagsC=IO_flags^2;
//PC的当前输入输出状态
unsignedcharconstcfg_table[8]=
{
0x80,//10000000b,c=outb=outa=out
0x90,//10010000b,c=outb=outa=in
0x82,//10000010b,c=outb=ina=out
0x92,//10010010b,c=outb=ina=in
0x89,//10001001b,c=inb=outa=out
0x99,//10011001b,c=inb=outa=in
0x8B,//10001011b,c=inb=ina=out
0x9B,//10011011b,c=inb=ina=in
}
unsignedcharrd_PA(void);
//读PA
unsignedcharrd_PB(void);
//读PB
unsignedcharrd_PC(void);
//读PC
voidwr_PA(unsignedcharPA_data);
//写PA
voidwr_PB(unsignedcharPB_data);
//写PB
voidwr_PC(unsignedcharPC_data);
//写PC
voidset_PC(unsignedcharPC_num);
//PC位操作,置位,PC_num为端口号0~7
voidclr_PC(unsignedcharPC_num);
//PC位操作,复位,PC_num为端口号0~7
voidPABC_config(void);
//写8255A控制字
(2)端口A、B、C读写函数
{
unsignedcharPA_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的并行数据
//----------------------------------------------------------------------------------------------------
unsignedcharrd_PB(void)//读PB
{
unsignedcharPB_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的并行数据
//----------------------------------------------------------------------------------------------------
unsignedcharrd_PC(void)//读PC
{
unsignedcharPC_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
//----------------------------------------------------------------------------------------------------
voidwr_PA(unsignedcharPA_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
//----------------------------------------------------------------------------------------------------
voidwr_PB(unsignedcharPB_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
//----------------------------------------------------------------------------------------------------
voidwr_PC(unsignedcharPC_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
}
(3)端口C配置函数
//----------------------------------------------------------------------------------------------------
//函数名称:
set_PC
//输入函数:
PC_num,范围0~7
//输出参数:
无
//功能说明:
对PC进行位操作,置PC(PC_num)为高
//----------------------------------------------------------------------------------------------------
voidset_PC(unsignedcharPC_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)为低
//----------------------------------------------------------------------------------------------------
voidclr_PC(unsignedcharPC_num)
{
ACC=IO_flags;
IO_flagsC=1;
ACC=IO_flags;
PC_num=PC_num<<1;
PC_num=(PC_num&0xFE);
a8255_CON=PC_num;
}
(4)写控制字函数
//----------------------------------------------------------------------------------------------------
//函数名称:
PABC_config
//功能说明:
写8255A的控制字寄存器
//----------------------------------------------------------------------------------------------------
voidPABC_config(void)
{
a8255_CON=cfg_table[IO_flags];
}
【实例26】用8155扩展I/O口
(1)相关函数声明及管脚定义
//-----------------------------------函数声明,管脚定义----------------------------------------*/
#include
#include
#definea8155_PAXBYTE[0x7E00]//控制字地址
#definea8155_PBXBYTE[0x7E01]//PA地址
#definea8155_PCXBYTE[0x7E02]//PB地址
#definea8155_CONXBYTE[0x7E03]//PC地址
#defineTimer_AXBYTE[0x7E04]//定时器寄存器A
#defineTimer_BXBYTE[0x7E05]//定时器寄存器B
#definemem_headXBYTE[0x7F00]//存储器首地址
unsignedcharbdataIO_flags;
//用于表示PA、PB、PC的当前输入输出状态
//内容不能被其他程序改写
sbitIO_flagA=IO_flags^0;
//PA的当前输入输出状态
sbitIO_flagB=IO_flags^1;
//PB的当前输入输出状态
sbitIO_flagC=IO_flags^2;
//PC的当前输入输出状态
sbitIO_flagC1=IO_flags^3;
//PC的当前输入输出状态
sbitInt_flagA=state_flags^4;
//PA的当前输入输出状态
sbitInt_flagB=state_flags^5;
//PB的当前输入输出状态
sbitTimer_flag1=state_flags^6;
sbitTimer_flag2=state_flags^7;
//Timer的状态置位表示计数中
unsignedcharrd_mem(unsignedcharmem_ad);
//读存储器
voidwr_mem(unsignedcharmem_ad,unsignedcharmem_data);
//写存储器
charrd_PA(void);
//读PA
charrd_PB(void);
//读PB
charrd_PC(void);
//读PC
voidwr_PA(unsignedcharPA_data);
//写PA
voidwr_PB(unsignedcharPB_data);
//写PB
voidwr_PC(unsignedcharPC_data);
//写PC
voidDint_PA(void);
//关端口A中断
voidEint_PA(void);
//开端口A中断
voidDint_PB(void);
//关端口B中断
voidEint_PB(void);
//开端口B中断
voidsetting_PC0int(void);
voidsetting_PC4int(void);
voidstart_timer(void);
//开始计数器计数
voidstop_timer(void);
//停止计数器计数
voidsetting_zero_stop(void);
//设定计数到零停止计数
intrd_timer(void);
//读计数值
voidsetting_timerout_mode(unsignedcharmode);
//设定输出模式
(2)读写外RAM函数
读写外RAM函数对外部存储器指定单元数据进行读写,程序代码如下:
//--------------------------------------------------------------------------------------------------------------
//函数名称:
rd_mem
//输入函数:
mem_ad,范围0~255
//输出参数:
mem_data,存储对应数据
//功能说明:
读外部RAM,输入相对地址,返回数据
//--------------------------------------------------------------------------------------------------------------
unsignedcharrd_mem(unsignedcharmem_ad)//读存储器
{
unsignedcharmem_data;
unsignedintAD_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,把数据写到相应的地址
//-------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8255 应用 语言 版本