找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2181|回复: 8
收起左侧

各位大神帮忙看看单片机程序,我要在个位上显示小数点 要怎么改

[复制链接]
ID:718727 发表于 2020-3-30 12:58 | 显示全部楼层 |阅读模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. sbit led=P0^5;
  4. unsigned char code dis_table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
  5. unsigned char smg[8];
  6. unsigned char num;
  7. void mDelay(unsigned int Delay)
  8. {
  9.   unsigned int i;
  10.   for(;Delay>0;Delay--)
  11.   {
  12.     for(i=0;i<54;i++);
  13.   }
  14. }
  15. void display()
  16. { unsigned char i,bit_data;
  17.   bit_data=0xfe;
  18.   for(i=0;i<8;i++)
  19.   {
  20.     P2=0xff;
  21.         P1=dis_table[smg[i]];
  22.         P2=bit_data;
  23.         mDelay(10);
  24.         bit_data=_crol_(bit_data,1);
  25.   }
  26. }

  27. void main()
  28. { TMOD=0x05;
  29.   TH0=0;
  30.   TL0=0;
  31.   ET0=1;
  32.   EA=1;
  33.   TR0=1;
  34.   P1=0;
  35.   while(1)
  36.   {
  37.     num=(TH0<<8|TL0);
  38.         smg[0]=num%16;
  39.         smg[1]=num/16;
  40.         smg[6]=num%10;
  41.         smg[7]=num/10;
  42.         display();
  43.   }
  44. }
  45. void T0_int()interrupt 1
  46. {
  47.   TH0=0;
  48.   TL0=0;
  49.   smg[0]=0;
  50.   smg[1]=0;
  51.   smg[6]=0;
  52.   smg[7]=0;
  53. }
复制代码
回复

使用道具 举报

ID:718727 发表于 2020-3-30 12:59 | 显示全部楼层
smg[6]=num%10&0x80; 改成这样子也没用  数码管直接不亮了
回复

使用道具 举报

ID:367369 发表于 2020-3-30 14:43 | 显示全部楼层
bit_data=0xfe;这个是位选吧?
if(你的位选选到个位的数码管时)
dis_table[i]等于dis_table[i]和0x80(1000 0000)按位或   //点亮小数点的led
else
按你现在的代码写
回复

使用道具 举报

ID:367369 发表于 2020-3-30 14:59 | 显示全部楼层
ALASA 发表于 2020-3-30 12:59
smg[6]=num%10&0x80; 改成这样子也没用  数码管直接不亮了

你这是按位与 1&0=0啊  
例如0x3f&0x80
0011 1111  &  1000 0000
全部为0了当然不亮
回复

使用道具 举报

ID:718727 发表于 2020-3-30 16:02 | 显示全部楼层
game灬boy 发表于 2020-3-30 14:43
bit_data=0xfe;这个是位选吧?
if(你的位选选到个位的数码管时)
dis_table等于dis_table和0x80(1000  ...

不行呀  dis_table[ i]等于dis_table[ i]和0x80(1000 0000)按位或     写这句的时候提示  unmodifiable lvalue
回复

使用道具 举报

ID:213173 发表于 2020-3-30 16:05 | 显示全部楼层
ALASA 发表于 2020-3-30 12:59
smg[6]=num%10&0x80; 改成这样子也没用  数码管直接不亮了

错误:unsigned char num;
unsigned int num;

smg[6]=num%10|0x80;
回复

使用道具 举报

ID:367369 发表于 2020-3-30 19:16 | 显示全部楼层
ALASA 发表于 2020-3-30 16:02
不行呀  dis_table[ i]等于dis_table[ i]和0x80(1000 0000)按位或     写这句的时候提示  unmodifiable ...

那你重新写个数组dis_table_1[]把带小数点的数组重新定义
当你display()到个位时P1调用dis_table_1[]
  1. void display()
  2. { unsigned char i,bit_data;
  3.   bit_data=0xfe;
  4.   for(i=0;i<8;i++)
  5.   {
  6.         P2=0xff;
  7.    if ( bit_data==0xfd)
  8.         P1=dis_table_1[smg[i]];
  9.     else
  10.         P1=dis_table[smg[i]];
  11.         
  12.         P2=bit_data;
  13.         mDelay(10);
  14.         bit_data=_crol_(bit_data,1);
  15.   }
  16. }
复制代码

   
回复

使用道具 举报

ID:718727 发表于 2020-3-30 19:58 | 显示全部楼层
wulin 发表于 2020-3-30 16:05
错误:unsigned char num;
unsigned int num;

改成这样数码管不亮了
回复

使用道具 举报

ID:718727 发表于 2020-3-30 20:21 | 显示全部楼层
game灬boy 发表于 2020-3-30 19:16
那你重新写个数组dis_table_1[]把带小数点的数组重新定义
当你display()到个位时P1调用dis_table_1[]
...

感谢帮助,问题解决了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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