当前位置: 代码迷 >> 单片机 >> 请进。C51利用两个外部中断控制8个led分别显示外部中断数,关于延时有关问题
  详细解决方案

请进。C51利用两个外部中断控制8个led分别显示外部中断数,关于延时有关问题

热度:33   发布时间:2016-04-28 16:10:08.0
请进。C51利用两个外部中断控制8个led分别显示外部中断数,关于延时问题
Q1:最后一句delay(150);去掉会是led亮度下降,只有led[7]正常(一横排,8个led,左侧到右侧0-7),这是什么原因?我觉得是led刷新太快,无法驱动led到正常亮度,但led[7]应该也是暗的才对啊???

C/C++ code
#include"reg51.h"#include"intrins.h"sbit pa=P2^2;sbit pb=P2^3;sbit pc=P2^4;void delay(unsigned int i){    char j;    for(i; i > 0; i--)        for(j = 200; j > 0; j--);}//字模unsigned char charmodel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};unsigned char charvis[8]=0;//八个led所要显示的字模组int led0=0,led1=0;void led00() interrupt 0{EX0=0;//外部中断0不允许。可视为中断响应信号led0++;EX0=1;}//外部中断0允许void led11() interrupt 2{EX1=0;led1++;EX1=1;}void main(){int i;EX0=1;EX1=1;//中断允许IT0=0;IT1=1;//中断触发方式,1:下降沿;0:高电平EA=1; //总中断while(1){charvis[3]=charmodel[led0%10];charvis[2]=charmodel[led0%100/10];charvis[1]=charmodel[led0%1000/100]|0x80;charvis[0]=charmodel[led0%10000/1000];charvis[7]=charmodel[led1%10];charvis[6]=charmodel[led1%100/10];charvis[5]=charmodel[led1%1000/100];charvis[4]=charmodel[led1%10000/1000];for(i=0;i<8;i++){P0=charvis[i];//每个led显示的字模:称之为扫描显示switch(i){//通过74138片选分别显示各个led的内容case 0:pc=0;pb=0;pa=0;break;case 1:pc=0;pb=0;pa=1;break;case 2:pc=0;pb=1;pa=0;break;case 3:pc=0;pb=1;pa=1;break;case 4:pc=1;pb=0;pa=0;break;case 5:pc=1;pb=0;pa=1;break;case 6:pc=1;pb=1;pa=0;break;case 7:pc=1;pb=1;pa=1;break;} delay(150);//去掉会是led亮度下降,只有led【7】正常?};}}


------解决方案--------------------
led[7]操作完后跳回while头部,你那边一堆除法取余很占运行时间,等于给了led[7] delay
  相关解决方案