| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4366 人关注过本帖
标题:利用外部中断实现数码管的数字加减,其中0-1=65535,有不足之处请大家指正! ...
只看楼主 加入收藏
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
利用外部中断实现数码管的数字加减,其中0-1=65535,有不足之处请大家指正!
程序代码:
#include<reg51.h>
void display();
void time();



void delay10ms(unsigned char i)             //延迟函数(for循环需要时间) 当第二层for函数为p=100时(经过测量),i为多少,延迟时间就是i*10ms
{                                         //目的是在两次灯亮之间空出时间
    int n,p;
       for(n=0;n<i;n++)
           for(p=0;p<200;p++);
}

unsigned int i;
unsigned int duanma[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xbf};
unsigned int weima[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned int s1=0,s=0,m=0,h=0,number=0;
unsigned int num[8]={0,0,10,0,0,10,0,0};
unsigned int counter;

void main()
{
   
   IT0=1;    //
   IT1=1;    //下降沿触发方式
   EX0=1;  
   EX1=1;
   EA=1; 
  //以下两行为片选语句,不可以删除。否则无法操作LED
    P2 = 0xa0;P0 = 0x00;P2 = 0;    //选中蜂鸣器,关闭蜂鸣器
    P2 = 0xC0;P0 = 0xFF;P2 = 0; //位选全部选中
    P2 = 0xE0;        //选中数码管              打开Y7
      while(1)
      {      
        time();
        display();       
      }
}
void display()
{
  for(i=0;i<8;i++)
  {
    number=num[i]; 
    P2=0xC0;P0=weima[i];P2=0;
    P2=0xE0;P0=duanma[number];P2=0;
    delay10ms(1);
    P0=0xFF;   
  }
}

void time()
{
    num[7]=counter%10;
    num[6]=(counter/10)%10;
    num[5]=(counter/100)%10;
    num[4]=(counter/1000)%10;
    num[3]=(counter/10000)%10;
    num[2]=(counter/100000)%10;
    num[1]=(counter/1000000)%10;
    num[0]=(counter/10000000)%10;
}  

void interrupt_int0(void) interrupt 0          //P3.2  Pin
{   
    counter++;
}

void interrupt1_int1(void) interrupt 2         //P3.3  Pin
{   
    counter--;
}
搜索更多相关主题的帖子: int unsigned num void counter 
2020-04-11 00:56
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
收藏
得分:10 
已经学得不错了,提升一下拆分整数用循环赋值给数组,不用一句一句写。
2020-04-11 11:04
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
收藏
得分:0 
回复 2楼 xianfajushi
谢谢!

长风吹过
2020-04-12 12:20
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
回复 楼主 张珂珂

unsigned int counter;

void time()
{
    num[7]=counter%10;
    num[6]=(counter/10)%10;
    num[5]=(counter/100)%10;
    num[4]=(counter/1000)%10;
    num[3]=(counter/10000)%10;
    num[2]=(counter/100000)%10;
    num[1]=(counter/1000000)%10;
    num[0]=(counter/10000000)%10;
}  

楼主确定不会错吗?


2020-04-20 12:20
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
回复 楼主 张珂珂
1.单片机空间有限,数据类型要根据大小灵活调整。
2.保存那些常数、或者编码数据,比如数码管的数字编码,不需修改的数据加code,节省RAM.

[此贴子已经被作者于2020-4-20 12:40编辑过]

2020-04-20 12:37
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
回复 楼主 张珂珂
...

[此贴子已经被作者于2020-4-20 13:01编辑过]

2020-04-20 12:50
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
收藏
得分:0 
回复 5楼 r316999443
对不起现在才看到,那怎么改比较好?改成这样的循环会比较好吗?
程序代码:
    num[7]=counter%10;
    for(i=6;i<=0;i--)
    {
        num[i]=counter/pow(10,7-i);
    } 

我没有学到RAM,是随机存取存储器吗?

长风吹过
2020-05-06 20:44
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
回复 7楼 张珂珂
for(.....)
{
  num[i]=counter%10;
  counter /= 10;
}

单片机 unsigned int 取值范围 0-65535


2020-05-07 08:26
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
收藏
得分:0 
回复 8楼 r316999443
谢谢

长风吹过
2020-05-07 11:48
快速回复:利用外部中断实现数码管的数字加减,其中0-1=65535,有不足之处请大家 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019016 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved