找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2996|回复: 11
收起左侧

如何把单片机P1端口的值,以二进制的方式显示在数码管上?

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 10%)
ID:611208 发表于 2020-4-7 14:21 | 显示全部楼层 |阅读模式
单片机p1端口是简单的led闪烁,我想把P1口的值(状态),以二进制的方式 动态扫描的方式显示在8位数码管上 。
冥思苦想没写出来,太菜了,有个例子也行,我照样子看看能不能改出来,越是写不出来,越是想知道。虽然没有太大意义,我就想知道怎么能显示出来。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6;//段选

sbit we =P2^7;//位选
uchar code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                         };


void delay(uint z)//延时函数
{
      uint x,y;
      for(x=z;x>0;x--)
        for(y=114;y>0;y--);

}
void display(数码管部分不会写了)//显示函数
{
         we=1;
         P1=0xfe;
         we=0;
        P1=0xff;


          du=1;          P0=leddata[];
          du=0;
        delay(5);


}

void main()
{
     P1=0xe7;11100111
     delay(500);
     P1=1;
    delay(500);

   p1=0xaa;
    delay(500);
   p1=1;
    delay(500);

}



回复

使用道具 举报

ID:213173 发表于 2020-4-9 15:10 | 显示全部楼层
最后一搏 发表于 2020-4-9 09:34
谢谢回复,但是我现在的水平 看不明白

按楼主的现在的理解能力写的示例
无标题.jpg

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit du=P2^6;//段选
  5. sbit we =P2^7;//位选
  6. uchar code leddata[]={
  7.                 0x3f,  //"0"
  8.                 0x06,  //"1"
  9.                 };


  10. void delay(uint z)//延时函数
  11. {
  12.       uint x,y;
  13.       for(x=z;x>0;x--)
  14.         for(y=114;y>0;y--);

  15. }
  16. void display()//显示函数
  17. {
  18.         P0=0x00;//送段码消隐码,这很重要,否则数码管会有残影
  19.         du=1;                //锁存
  20.         du=0;
  21.         P0=0xfe;//送位码
  22.         we=1;                //锁存
  23.         we=0;
  24.         P0=leddata[P1>>7&0x01];//送段码,P1的最高位右移7位代入数组
  25.         du=1;                //锁存
  26.         du=0;
  27.         delay(1);//延时
  28.         //以下各位显示以此类推
  29.         P0=0x00;
  30.         du=1;
  31.         du=0;
  32.         P0=0xfd;
  33.         we=1;
  34.         we=0;
  35.         P0=leddata[P1>>6&0x01];//送段码,P1的次高位右移7位代入数组
  36.         du=1;
  37.         du=0;
  38.         delay(1);

  39.         P0=0x00;
  40.         du=1;
  41.         du=0;
  42.         P0=0xfb;
  43.         we=1;
  44.         we=0;
  45.         P0=leddata[P1>>5&0x01];
  46.         du=1;
  47.         du=0;
  48.         delay(1);

  49.         P0=0x00;
  50.         du=1;
  51.         du=0;
  52.         P0=0xf7;
  53.         we=1;
  54.         we=0;
  55.         P0=leddata[P1>>4&0x01];
  56.         du=1;
  57.         du=0;
  58.         delay(1);

  59.         P0=0x00;
  60.         du=1;
  61.         du=0;
  62.         P0=0xef;
  63.         we=1;
  64.         we=0;
  65.         P0=leddata[P1>>3&0x01];
  66.         du=1;
  67.         du=0;
  68.         delay(1);

  69.         P0=0x00;
  70.         du=1;
  71.         du=0;
  72.         P0=0xdf;
  73.         we=1;
  74.         we=0;
  75.         P0=leddata[P1>>2&0x01];
  76.         du=1;
  77.         du=0;
  78.         delay(1);

  79.         P0=0x00;
  80.         du=1;
  81.         du=0;
  82.         P0=0xbf;
  83.         we=1;
  84.         we=0;
  85.         P0=leddata[P1>>1&0x01];
  86.         du=1;
  87.         du=0;
  88.         delay(1);

  89.         P0=0x00;
  90.         du=1;
  91.         du=0;
  92.         P0=0x7f;
  93.         we=1;
  94.         we=0;
  95.         P0=leddata[P1&0x01];
  96.         du=1;
  97.         du=0;
  98.         delay(1);
  99. }

  100. void main()
  101. {
  102.         P1=0xe7;//11100111
  103.         while(1)
  104.         {
  105.                 display();
  106.         }
  107. }
复制代码



回复

使用道具 举报

ID:388929 发表于 2020-4-7 15:33 | 显示全部楼层
可以用最笨的方法,用移位一位一位的把8个位与出来,再一位一位的放到8个数码管上,例如P1与A0,就可以将最高位与出来,显示在数码管上,显示只选8位数码管的最高位,其他灭掉,延时,P1左移1位,重复上一个动作,应该就成了
回复

使用道具 举报

ID:70069 发表于 2020-4-7 18:18 | 显示全部楼层
#include<reg52.h>
#include<intrins.h>
unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //共阴
unsigned char code discode3[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //共阳
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#define uchar unsigned char
uchar key=0;
uchar i=0,a;
void delay5ms(uchar k)
{
        uchar i,j;
        for(i=k;i>0;i--)
                for(j=248;j>0;j--);
}
main()
{
     while(1)
   {   key=0x87;
  for(i=0;i<8;i++)
       {
        a=key&0X01;
       key=_crol_(key,1) ;
                   P0=discode3[a];
                P2=wei[i-1];
                delay5ms(600000000);
        //        P2=0x00;       
                P0=0xff;
                }
        }
}
回复

使用道具 举报

ID:70069 发表于 2020-4-7 18:34 | 显示全部楼层
#include<reg52.h>
#include<intrins.h>
unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //共阴
unsigned char code discode3[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //共阳
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char code wei2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
#define uchar unsigned char
uchar key=0;
uchar i=0,a;
void delay5ms(uchar k)
{
        uchar i,j;
        for(i=k;i>0;i--)
                for(j=248;j>0;j--);
}
main()
{
     while(1)
   {   key=0x88;
  for(i=0;i<8;i++)
       {
        a=key&0x01;
      key=_cror_(key,1) ;
         //  key>>=1;
                   P0=discode3[a];
                P2=wei2[i];
                delay5ms(600000000);
        //        P2=0x00;       
                P0=0xff;
                }
        }
}
回复

使用道具 举报

ID:611208 发表于 2020-4-9 09:34 | 显示全部楼层
benclee 发表于 2020-4-7 18:34
#include
#include
unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 ...

谢谢回复,但是我现在的水平 看不明白
回复

使用道具 举报

ID:611208 发表于 2020-4-10 09:12 来自手机 | 显示全部楼层
wulin 发表于 2020-4-9 15:10
按楼主的现在的理解能力写的示例

非常感谢这位朋友专门写了这个程序,这个我基本能看懂思路了,我就是想不到怎么能把p1值提取出来,看了这个程序受益匪浅,非常的感谢,谢谢回复帖子的朋友们,51hei有你们会更精彩
回复

使用道具 举报

ID:611208 发表于 2020-4-10 09:13 来自手机 | 显示全部楼层
wulin 发表于 2020-4-9 15:10
按楼主的现在的理解能力写的示例

顺便问一句,你图片显示数码管那软件叫什么,我没有,谢谢
回复

使用道具 举报

ID:213173 发表于 2020-4-10 10:33 | 显示全部楼层
最后一搏 发表于 2020-4-10 09:13
顺便问一句,你图片显示数码管那软件叫什么,我没有,谢谢

Proteus 7 仿真软件
回复

使用道具 举报

ID:723403 发表于 2020-4-10 11:31 | 显示全部楼层
Proteus 7 大学里用过,挺好用的!
回复

使用道具 举报

ID:611208 发表于 2020-4-10 21:16 | 显示全部楼层
wulin 发表于 2020-4-10 10:33
Proteus 7 仿真软件

非常感谢,又新增长了知识
回复

使用道具 举报

ID:213173 发表于 2020-4-14 11:19 | 显示全部楼层
按你目前的理解能力应该能看懂,中断周期选择2.5ms的目的是为了使动态数码管显示既不会闪烁也保证足够的亮度。 6位百分秒表 仿真.zip (105.39 KB, 下载次数: 4)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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