找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2062|回复: 11
打印 上一主题 下一主题
收起左侧

关于单片机的I/O口输出问题

[复制链接]
跳转到指定楼层
楼主
在keil中生成HEX文件后,用proteus仿真时,
P1=0xfe;可以正常输出;

j=0;
if(j==0)
{
   P1=0xfe;
}
却不能正常输出????

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330198 发表于 2019-5-25 15:17 | 只看该作者
这要结合完整程序来看
回复

使用道具 举报

板凳
ID:511890 发表于 2019-5-25 15:39 | 只看该作者
有可能是变量类型问题。。你试试把变量改成int型。或者改成:j=0x00;if(0x00==j){ P1=0xfe;}。当然,有用到P1,include单片机头文件。
回复

使用道具 举报

地板
ID:541189 发表于 2019-5-25 16:19 来自手机 | 只看该作者
f是不是溢出了
回复

使用道具 举报

5#
ID:393193 发表于 2019-5-25 16:29 | 只看该作者
zhanghyg 发表于 2019-5-25 15:17
这要结合完整程序来看

这是源程序:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code KEY_TABLE[]={0x11,0x21,0x12,0x22};
uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code c[]={0xfe,0xfd,0xfb,0xf7,0xef};
       
void delay5ms(uint x)
{
        uchar t,ms;
        ms=25*x;
        while(ms--)
                for(t=0;t<120;t++);
}

void delays()
{
        uint s=10000;while(s--);
}

void main()
{
        uchar n,x,temp,key,num,i,j;
        n=0;
        x=5;
        j=0;
        for(;;)
        {
                if(j==0)
                {
                        P1=a[n];
                }
                P0=c[x-1];
                delay5ms(x);
                n=n+1;
                if(n==8)
                        n=0;
                P3=0xf0;
                if(P3!=0xf0)
                {
                        delays();P3=0xf0;
                        if(P3!=0xf0)
                        {
                                temp=P3;
                                P3=0x0f;
                                key=temp|P3;
                                key=0xff-key;
                                for(i=0;i<4;i++)
                                {
                                        if(key==KEY_TABLE)
                                        {
                                                num=i;
                                break;
                                        }
                                }
                                if(num==0)
                                        j=0;
                                if(num==1)
                                        j=n;
                                if(num==2)
                                        x=x-1;
                                if(num==3)
                                        x=x+1;
                        }
                }
        }
}
为什么这时的P1不能正常输出???
回复

使用道具 举报

6#
ID:10947 发表于 2019-5-25 16:33 | 只看该作者
可能j==0这个条件不符合?
回复

使用道具 举报

7#
ID:393193 发表于 2019-5-25 16:38 | 只看该作者
zhanghyg 发表于 2019-5-25 15:17
这要结合完整程序来看

附上电路图:

KICWQUT9D34KZ[0R6QKL7@D.png (167 KB, 下载次数: 29)

KICWQUT9D34KZ[0R6QKL7@D.png
回复

使用道具 举报

8#
ID:547037 发表于 2019-5-25 16:58 | 只看该作者
可能是单片机的驱动坏了
回复

使用道具 举报

9#
ID:383215 发表于 2019-5-25 17:40 | 只看该作者
既然j=0,那么肯定j==0,被C编译器优化掉不执行这条语句,这是废话语句,C编译器不是傻瓜。你硬要执行,把优化等级降到最低,或者用 volatile定义j。
回复

使用道具 举报

10#
ID:155507 发表于 2019-5-25 20:42 | 只看该作者
觉得是你P1=a[n]; 这里出了问题了吧
P1=a[n];这里的话数据只显示了一瞬间就被P0=c[x-1];取代
这两行之间插入一个延时就可以了。

if(j==0)
                {
                        P1=a[n];
                        delay5ms(x);
                }
                P0=c[x-1];
                delay5ms(x);

回复

使用道具 举报

11#
ID:383215 发表于 2019-5-26 00:23 | 只看该作者
不管是什么单片机,编程查错效率最高的是硬件仿真,我从来没有用过proteus,像51单片机,我用自制的试验板,搭好外围元件,插上仿真头,硬件仿真,一般写十几行代码,我就要仿真通过,无非就是设置断点、单步执行、全速执行,只要有错误,很快就发现,AVR单片机用自制的JTAG仿真器仿真,虽然难用一些,也总比没有要好,没有硬件仿真器,我宁愿不编程序,查错效率实在是太低了。
回复

使用道具 举报

12#
ID:530034 发表于 2019-5-26 18:16 | 只看该作者
51单片机,我用自制的试验板,搭好外围元件,插上仿真头,硬件仿真,一般写十几行代码,我就要仿真通过,无非就是设置断点、单步执行、全速执行,只要有错误,很快就发现,AVR单片机用自制的JTAG仿真器仿真,虽然难用一些,也总比没有要好,没有硬件仿真器
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表