找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机数码管刷新问题

[复制链接]
跳转到指定楼层
楼主
  1. //问题描述:当显示到P2.2位时,P2.7也会显示
  2. #include<reg51.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. uint Count;
  7. uint Set_Count;
  8. uchar code ledcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};         //共阴数码管编码0-9
  9. uchar data Ledbuff[8]={1};//显示缓冲区
  10. void delayms(uint ms)
  11.   {
  12.     uchar k;
  13.    while(ms--)
  14.         {
  15.           for(k = 0; k < 120; k++);
  16.          }
  17.    }
  18. void display()                        //显示程序display(uchar a,b,c,d,e)        char i;
  19. {
  20. static unsigned char i = 0;         

  21.         Ledbuff[0]=Set_Count%10;  //提取设定个位编码
  22.         Ledbuff[1]=Set_Count%100/10;   //提取设定十位编码
  23.         Ledbuff[2]=Set_Count/100%10;  //提取设定百位编码
  24.         Ledbuff[3]=Set_Count/1000;   //提取设定千位编码 这里解码错误P2.2计数百位通的时候同时亮了

  25.   Ledbuff[4]=Count%10;  //P2.0提取计数个位编码
  26.         Ledbuff[5]=Count%100/10; //P2.1提取计数十位编码
  27.         Ledbuff[6]=Count/100%10;//%1000/100 P2.2提取计数百位,这里
  28.         Ledbuff[7]=Count/1000;
  29.         for(i=0;i<8;i++)

  30.         {               
  31.         switch(i)         //使用多分支选择语句 i=count display 0x代表16进制
  32.                 {
  33.                   
  34.                             //  位P2.4=1 段=字码表 位选缓冲 设定值求余[((SD_count%1000)%100 )/ 10]]
  35.                         case(0):P2=0xef;P0=ledcode[Ledbuff[0]];break;//显示第一个个位共阴P2.4=ef=1110 1111    共阳P2.4=10=1 0000
  36.                         case(1):P2=0Xdf;P0=ledcode[Ledbuff[1]];break;//显示第二个十位P2.5=0xDF=1101 1111 20=0010 0000
  37.                         case(2):P2=0Xbf;P0=ledcode[Ledbuff[2]];break;//P2.6=0xbf=1011 1111   40=100 0000
  38.                   case(3):P2=0X7f;P0=ledcode[Ledbuff[3]];break;//显示千位共阴P2.7=0x7f=0111 1111 0x80=1000 0000   
  39.                            
  40.             case(4):P2=0Xfe;P0=ledcode[Ledbuff[4]];break;//显示第一个个位共阴P2.0=fe=1111 1110    共阳P2.0=1=0000 0001
  41.                         case(5):P2=0Xfd;P0=ledcode[Ledbuff[5]];break;//显示第二个十位P2.1=0xfd=1111 1101 2=0000 0010
  42.                
  43.                  case(6):P2=0x7b;P0=ledcode[Ledbuff[6]];break;//P2.2=0x7b=1111 1011   4=0000 0100这里影响3
  44.                         
  45.                                  case(7):P2=0xf7;P0=ledcode[Ledbuff[7]];break;  //P2.3=0xf7=1111 0111   0x8=0000 1000
  46.                 default: break;        
  47.         
  48.                 }
  49.                 //  P0=ledcode[Ledbuff[i]];        
  50.                         delayms(1); //显示2MS
  51.                   P0=0x00;  //消影0xff;共阳位选高电平,段选全部高电平
  52.         }
  53. }
  54. void main()
  55. {        
  56.         Set_Count=5678;
  57.         Count=1234;         //Count        
  58. while(1)
  59.                                 
  60.         display();               
  61.         
  62. }
复制代码

gongyang.rar

19.96 KB, 下载次数: 3

仿真

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

使用道具 举报

沙发
ID:611626 发表于 2023-7-30 10:09 | 只看该作者
问题描述:当显示到P2.2位时,P2.7也会显示
回复

使用道具 举报

板凳
ID:1090026 发表于 2023-7-30 17:02 | 只看该作者
case(6):P2=0x7b;P0=ledcode[Ledbuff[6]];break;//P2.2=0x7b=1111 1011   4=0000 0100这里影响3
更改
case(6):P2=0xfb;P0=ledcode[Ledbuff[6]];break;//                      P2.2=0xfb=1111 1011   4=0000 0100   这里影响3P2那里是控制显示哪一个数码管的,P2哪里有两个0,可以同时控制两位
回复

使用道具 举报

地板
ID:611626 发表于 2023-7-30 19:45 | 只看该作者
AiChiTang 发表于 2023-7-30 17:02
case(6):P2=0x7b;P0=ledcode[Ledbuff[6]];break;//P2.2=0x7b=1111 1011   4=0000 0100这里影响3[/backcolor ...

P2,2是count百位,P2.7是设定千位
回复

使用道具 举报

5#
ID:332444 发表于 2023-7-30 20:06 | 只看该作者
多参阅别人写的代码,尤其是不同思维的代码,看我帖子有多荔枝。
回复

使用道具 举报

6#
ID:213173 发表于 2023-7-30 20:26 | 只看该作者
宏达工控 发表于 2023-7-30 10:09
问题描述:当显示到P2.2位时,P2.7也会显示


  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uint Count;
  6. uint Set_Count;
  7. uchar code ledcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管编码0-9
  8. uchar data Ledbuff[8]={1};//显示缓冲区
  9. void delayms(uint ms)
  10. {
  11.         uchar k;
  12.         while(ms--)
  13.         {
  14.                 for(k = 0; k < 120; k++);
  15.         }
  16. }
  17. void display() //显示程序display(uchar a,b,c,d,e)
  18. {
  19.         static unsigned char i = 0;         
  20.         switch(i)//使用多分支选择语句 i=count display 0x代表16进制
  21.         {
  22.                 case(0):Ledbuff[0]=Set_Count/1000;break;
  23.                 case(1):Ledbuff[1]=Set_Count/100%10;break;
  24.                 case(2):Ledbuff[2]=Set_Count/10%10;break;
  25.                 case(3):Ledbuff[3]=Set_Count%10;break;
  26.                 case(4):Ledbuff[4]=Count/1000;break;
  27.                 case(5):Ledbuff[5]=Count/100%10;break;
  28.                 case(6):Ledbuff[6]=Count/10%10;break;
  29.                 case(7):Ledbuff[7]=Count%10;break;
  30.         }
  31.         P0=0x00;
  32.         P2=~(0x01<<i);
  33.         P0=ledcode[Ledbuff[i]];
  34.         delayms(1); //显示2MS
  35.         i=++i%8;
  36. }
  37. void main()
  38. {        
  39.         Set_Count=5678;
  40.         Count=1234;
  41.         while(1)
  42.         {
  43.                 display();
  44.         }
  45. }
复制代码



回复

使用道具 举报

7#
ID:611626 发表于 2023-7-31 09:09 | 只看该作者

谢谢。犯了个幼儿科的错误 P2.2=0xfb=1111 1011 0x7b应该是0xfb
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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