历史上的今天
今天是:2025年01月09日(星期四)
2018年01月09日 | 51单片机8255驱动C程序
2018-01-09 来源:eefocus
/*----------------------------------------------------------------------------------------------------------------
库文件名称: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控制字*/
史海拾趣
|
以下是我收集和整理的一些有关msp430f449的资料。现在拿出来晒晒,让更多的人能够那道开源的资料!大家可以共同学习,共同进步! 本人有一个QQ群,叫:Robot DIY。群号:30240424。各位有兴趣的,可以进来。… 查看全部问答> |
|
如题: 点最小化发现没响应 我要在主窗口中执行这一进程,有时候需要让它在后台运行,回到主窗口进行其他操作 再次选择执行时又显示该窗口 怎样实现类似最小化的功能 … 查看全部问答> |
|
今天在程序仿真的时候,突然产生一个问题,modelsim 突然出现了问题:工具栏上的所有出口都打不开,并弹出:Error:Invalid time value:{Error reading variable from kernel }! 请问大家这个问题怎么解决呢!谢谢… 查看全部问答> |
|
com16550驱动请教!!!!请做过此驱动的大哥帮忙!!!谢谢!!! 现在BSP中用的是在public下移植过来的com16550驱动,可是一直没看懂是怎么用的外部中断 看了网上 xunjingzhpu 的博客中: 3 需要增加串口芯片对应的gpio口中断,在中断处理线程DWORD CPdd16550::ThreadRun()中记得重新使能中断,在中断触发上如果 ...… 查看全部问答> |
|
IME(输入法编辑器)内核,包括和用户输入的语言相关的内容,比如输入法、汉字库等; IME界面窗口包括:状态窗口、字母组合窗口、候选字列表窗口。 默认情况下,系统创建缺省的IME界面窗口; 现在,我还使用IME(输入法编辑器)内核,但不用缺省 ...… 查看全部问答> |
|
IShellFolder指针指向派生类CDesktopFolder,为什么不是调用派生类的函数 安装了WinCE 5.0 MessageBox没执行到,代码见后面。 为什么pSHF->CreateViewObject没有运行CDesktopFolder::CreateViewObject? 怎样才能让他执行CDesktopFolder::CreateViewObject? SHSTDAPI SHGetDesktopFolder(LPSHELLFOLDER *ppshf) { & ...… 查看全部问答> |




