打印
[51单片机]

请教 单片机端口值传递问题

[复制链接]
1254|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wdmhzh|  楼主 | 2013-11-12 15:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


#include<reg52.h>
#define uint unsigned int
sbit  sk=P2^0;   //控制数据锁存芯片  段选
sbit  wk=P2^1; //控制位数据锁存芯片  位选


void yanshi_100us(uint i)   //12兆晶振   100微秒单位延时函数
{
   uint k,s;
   for(s=i;s>0;s--)
   {
   for( k=11; k>0;k--);
    }
}

void display(uint skong,uint wkong,char date[])
   {
   uint j;
   char code datew[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};   //数码管右边最低位
   skong=1;     
   P1=date[0];    //对开始位数码管置数   
   skong=0;
   for(j=0;j<8;j++)      //扫描每个数码管
   {
     wkong=1;
     P1=datew[j];  //选择某位数码管接收显示数据
     wkong=0;
     yanshi_100us(30);   //数码管余辉时间
     wkong=1;   //数码管显示清零
     P1=0xff;
     wkong=0;
  if(j<7)    //不能对第9个数码管赋显示数据
  {
   skong=1;
       P1=date[j+1];        //对下一位数码管置显示数据
     skong=0;
  }
   }
  }
void main()
{
  while(1)
  {
     char  date1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                   0x07,0x7f,0x6f,0x80};  //共阴数码管0--9加点
   display(sk,wk,date1);
  }
}

上面这段程序编译时没错误,但数码管显示错误。现在由于位想写一个通用的数码管显示函数display,问问高手怎样才能把程序开始定义 “ sbit  sk=P2^0;   //控制数据锁存芯片  段选sbit  wk=P2^1; //控制位数据锁存芯片  位选”   中的sk和wk传到display()函数中去????
请不要告诉我把sk改成skong,wk改成wkong,display函数只传date1就行了啊!!我主要是问高手们在display()函数中有什么办法来实现“P2^0”,
“P2^1”或者P端口传送,在不修改display()情况下,当单片机与数码管连接改变时   也能正常调用display()函数,望高手们解惑????

相关帖子

沙发
wolension| | 2013-11-14 08:21 | 只看该作者
sk, wk是全局的,还要传吗?应该直接用就可以了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
原野之狼 + 2 赞一个!
板凳
wdmhzh|  楼主 | 2013-11-15 13:10 | 只看该作者
我的意思是把display()函数封装起来,调用时,为了以后不受端口改变的影响,把改变后的端口参数传进去就行了,不知老大有什么方法没???

使用特权

评论回复
地板
NE5532| | 2013-11-15 13:55 | 只看该作者
wdmhzh 发表于 2013-11-15 13:10
我的意思是把display()函数封装起来,调用时,为了以后不受端口改变的影响,把改变后的端口参数传进去就行 ...

理论上应该可以用指针来传递的,但是没有意义,因为硬件不像软件,想改就改。硬件做好了就动不了了,你可以就用这种伪定义,定义在头文件里,遇到硬件修改,把头文件改了就可以了。

使用特权

评论回复
5
wdmhzh|  楼主 | 2013-11-18 17:17 | 只看该作者
多谢各位老大,指针用过,也不行,看来只有头文件这方法了

使用特权

评论回复
6
yangfan19641964| | 2013-11-19 13:06 | 只看该作者
我在这个论坛上看到很多51系列单片机使用74系列扩展端口的。基本上都用74HC373或573扩展。其实,在专业技术人员看来,只要用373或573就代表是业余水平。应该用74HC377或74HC374(574)来扩展,使用51系列单片机的并行总线扩展方法。

使用特权

评论回复
7
hyh19890917| | 2013-11-20 21:14 | 只看该作者
你的用意就不对,不管段码还是位码在锁存时候都不应该是display()来传递的,主循环中每次轮训到这个函数时候只查询当前锁存端口状态和data数据,锁存位按照动态显示的要求,按照一定的时序翻转,至于data就是一个全局变量,其他函数只对她写操纵,显示函数只读操作。补充,锁存端口需要对不同单片机兼容的话,常用的方法就是宏定义。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

130

帖子

2

粉丝