搜索
bottom↓
回复: 7

麻烦大家帮忙搞定下,摆弄几天了,一个简单的中断控制显示4个数码管

[复制链接]

出0入0汤圆

发表于 2006-3-17 17:56:06 | 显示全部楼层 |阅读模式
麻烦大家帮忙搞定下,摆弄几天了,一个简单的numberdisplay,自己感觉软件和硬件都没什么问题,软件IO口输出仿真是那几个数字,但硬件输出到数码管上就不是那回事了 ,

点击此处下载armok01108386.rar

出0入0汤圆

发表于 2006-3-17 23:37:25 | 显示全部楼层
首先,你在原理图中用的是共阴数码管,它的段驱动应该是高电平,而你的程序中正好相反,应该取高电平的,你取了低电平。可在Display()中将输出的段码直接取反即可。

其次,你的程序中,将Flag定义为位变量(bit),而位变量只有0和1两种状态,你却在外部中断1的服务程序中给Flag赋予值2,C语言在编译时是不检测该类型变量的越界问题的,其结果是Flag=1,所以你按下DOWN键时,数字是增加,而不是减少。应该将flag定义为Unsigned Char类型。

以下链接是我改动后的文件包

点击此处下载armok01108428.rar

出0入0汤圆

 楼主| 发表于 2006-3-18 10:36:50 | 显示全部楼层
谢谢了,但哪里看出是共阴极数码管呀?还有我这初始显示值应该是1234,但显示的怎么是这样?

出0入0汤圆

发表于 2006-3-18 10:47:52 | 显示全部楼层
看后面两个字母:CC共阴,CA共阳。

出0入0汤圆

 楼主| 发表于 2006-3-18 11:43:49 | 显示全部楼层
哦,原来这样,谢谢拉。但数码管显示是怎么回事呀,看电路的高低电平当前第四管显示应该是4呀,但怎么那样显示,是延时不对还是怎么回事?

出0入0汤圆

发表于 2006-3-18 22:31:16 | 显示全部楼层
你点击我给你回复的链接,里面是我修改后的程序,在我的机器上调试过,一切正常,我用的是Keil c7.5和Proteus 6.7sp3.我只修改了main.c中对FLAG的类型定义和DISPLAY函数中输出段码的部分.原理图未做任何修改.一切功能正常.

    你的延时函数,我未细看,但在我的机器上运行正常.

    以下是我修改后的main.c,注释部分的小括号中是你原来的语句

#include <REG51.H>

unsigned char flag=0; //(bit flag=0;)

unsigned int cnt =1234;

unsigned char q[4] =

{0,0,0,0};



unsigned char table[10] = {0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//段码错误,硬件原理图中你用的是共阴数码管,段驱动应该是高电平才对,你怎么正好弄反了?

//没关系,不用改段码,只要在DISPLAY中将段码取反输出即可.



/*unsigned char table[10] =

{

  0x3f,  

  0x06,   

  0x5b,   

  0x4f,   

  0x66,   

  0x6d,   

  0x7d,  

  0x07,   

  0x7f,  

  0x6f   

};

*/

void service_keyup() interrupt 0 using 1

{

flag=1;

}

void service_keydown() interrupt 2 using 2

{

flag=2;

}



void delay_1us(void)                 //1us延时函数

  {

  for(;;);

  }



void delay_nus(unsigned int n)       //N us延时函数

  {

   unsigned int i=0;

   for (i=0;i<n;i++)

   delay_1us();

  }

  

void delay_1ms(void)                 //1ms延时函数

  {

   unsigned int i;

   for (i=0;i<(unsigned int)(4*143-2);i++);

  }

  

void delay_nms(unsigned int n)       //N ms延时函数

  {

   unsigned int i=0;

   for (i=0;i<n;i++)

   {

      delay_1ms();

   }   

  }

        

void process(unsigned int i,unsigned char *p)

{

    p[0] = i/1000;

    i = i%1000;

    p[1] = i/100;

    i = i%100;

    p[2] = i/10;

    i = i%10;

    p[3] = i;

}

void init_io(void)

{P0=0xff;

P1=0xff;

}

void display(unsigned char *p)

{

    unsigned char i;

    unsigned char sel=0x01;

    for(i=0;i<4;i++)

    {

        P0=~sel;

        P1=~(table[p]); //(P1=table[p];)

        delay_nms(1);

        sel = sel<<1;

    }

}



main()

{

init_io();

TCON=0x05;

IE=0x85;

while(1)

{  

  if(flag==1)

{

cnt++;

flag=0;

}

else if(flag==2)

{cnt--;

flag=0;

}

process(cnt,q);

display(q);





}

}

出0入0汤圆

发表于 2006-3-19 11:58:14 | 显示全部楼层
在我这里也不行,情况跟楼主的一样!!但移植到AVR中,可以正常显示!!



#include <avr/io.h>

#include <avr/interrupt.h>



unsigned int cnt =1234;

unsigned char q[4] = {0,0,0,0};

unsigned char table[10] = {0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//主函数

void delay_1us(void)                 //1us延时函数

  {

   asm volatile("nop;");

  }



void delay_nus(unsigned int n)       //N us延时函数

  {

   unsigned int i=0;

   for (i=0;i<n;i++)

   delay_1us();

  }

  

void delay_1ms(void)                 //1ms延时函数

  {

   unsigned int i;

   for (i=0;i<1140;i++);

  }

  

void delay_nms(unsigned int n)       //N ms延时函数

  {

   unsigned int i=0;

   for (i=0;i<n;i++)

   delay_1ms();

  }



void process(unsigned int i,unsigned char *p)

{

    p[0] = i/1000;

    i = i%1000;

    p[1] = i/100;

    i = i%100;

    p[2] = i/10;

    i = i%10;

    p[3] = i;

}



void display(unsigned char *p)

{

    unsigned char i;

    unsigned char sel=0x01;

    for(i=0;i<4;i++)

    {

        PORTA =~sel;

        PORTB=~(table[p]);

        delay_nms(1);

        sel = sel<<1;

    }

}



int main(void)

{

  DDRA =0xff;

  DDRB =0xff;

  while(1)

  {

    process(cnt,q);

    display(q);

  }

}

出0入0汤圆

发表于 2006-3-19 12:01:52 | 显示全部楼层
Keil c7.5中有没有优化功能的?如有请试一下不用优化功能。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 04:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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