找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机共阴数码管想在一个数字上加小数点,用P0|=0x80, 有些数字不能正常显示

[复制链接]
跳转到指定楼层
楼主
数字069会所有段全亮,其他的数字可以正常显示,什么原因啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

12#
ID:423282 发表于 2019-7-27 17:46 | 只看该作者
本帖最后由 清无水 于 2019-7-27 20:23 编辑
suncat0504 发表于 2019-7-26 22:47
这是我咋你的代码的基础上做的修改,因为电路设计的问题,输出到P0口时做了取反处理。可以正常显示“0.”到 ...

找到问题了,是把p3那几个引脚短路了,不知道咋恢复啊
回复

使用道具 举报

11#
ID:423282 发表于 2019-7-27 17:16 | 只看该作者
suncat0504 发表于 2019-7-26 22:47
这是我咋你的代码的基础上做的修改,因为电路设计的问题,输出到P0口时做了取反处理。可以正常显示“0.”到 ...

超谢谢啊
回复

使用道具 举报

10#
ID:517466 发表于 2019-7-26 22:47 | 只看该作者
这是我咋你的代码的基础上做的修改,因为电路设计的问题,输出到P0口时做了取反处理。可以正常显示“0.”到“F.”,已经用proteus7.5做了验证
#include "reg52.h"               

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char i=0;
                                                                                                                                                               
void delay(void) {
        unsigned int j=0;
        unsigned int k=0;
        for (j=0; j < 300;j++) {
                for (k=0; k < 300;k++) {
                }
        }
}

void main() {        
                LSA=0;
                LSB=0;
                LSC=0;
               
                while(1) {
                        for (i=0; i < 17;i++) {
                                P0=(smgduan[i]|0x80)^0xff;
                                delay();
                               
                        }
                }
}

数码管.jpg (476.31 KB, 下载次数: 35)

proteus7.5仿真

proteus7.5仿真
回复

使用道具 举报

9#
ID:423282 发表于 2019-7-26 10:12 | 只看该作者
amo73 发表于 2019-7-25 21:53
你这行代码是先读取P0,然后把读出值的最高位修改为1,再写入P0……不当

应该这样:P0 = 显示数字|0x80

#include "reg52.h"               

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};



void main()
{       
        LSA=0;
        LSB=0;
        LSC=0;
        P0=smgduan[1]|0x80;
        while(1);
}
像这样呢数字1就好着呢 换成0就不行了
回复

使用道具 举报

8#
ID:423282 发表于 2019-7-26 10:09 | 只看该作者
suncat0504 发表于 2019-7-26 01:40
既然是程序控制的,毫无疑问是程序的big而已,你细心分析自己的程序以及流程。当然首先要排除硬件电路设计 ...

#include "reg52.h"               

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};



void main()
{       
        LSA=0;
        LSB=0;
        LSC=0;
        P0=smgduan[0]|0x80;
        while(1);
}
想做秒表发现加不了点,然后试了试像这样一个数码管静态显示,也不行啊
回复

使用道具 举报

7#
ID:56665 发表于 2019-7-26 08:27 | 只看该作者
你这样就行,P0=显示数字|0x80; 或者P0=显示数字+0x80;
回复

使用道具 举报

6#
ID:517466 发表于 2019-7-26 01:40 | 只看该作者
既然是程序控制的,毫无疑问是程序的big而已,你细心分析自己的程序以及流程。当然首先要排除硬件电路设计没有问题。P0|=0x80;这种语句,通常是取得P0口目前的数据,是取得输入数据,然后B7位置1后重新输出给P0口,对于动态扫描方式输出数据给数码管而言,我觉得这样处理不妥,反倒是根据输出的内容,直接把数据输出给P0口更安全一些。如果你的P0口只接一个数码管,输出数据是静态方式输出且一直保持不变的话,P0|=0x80;这样处理没有问题。
你没有提供电路,以上意见仅供参考。
回复

使用道具 举报

5#
ID:282095 发表于 2019-7-26 01:00 | 只看该作者
还是段选和位选的区别吧
回复

使用道具 举报

地板
ID:515850 发表于 2019-7-25 21:53 | 只看该作者
你得先把线路图和程序放出来,不然谁搞得懂你哪里搞错了
回复

使用道具 举报

板凳
ID:147266 发表于 2019-7-25 21:53 | 只看该作者
你这行代码是先读取P0,然后把读出值的最高位修改为1,再写入P0……不当

应该这样:P0 = 显示数字|0x80
回复

使用道具 举报

沙发
ID:332444 发表于 2019-7-25 20:38 | 只看该作者
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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