标题:
单片机数码管外部中断动态扫描程序,亮度不一,按键也又有时灵有时不灵
[打印本页]
作者:
wznb
时间:
2022-4-22 10:26
标题:
单片机数码管外部中断动态扫描程序,亮度不一,按键也又有时灵有时不灵
数码管动态扫描,仿真上可以运行,实物上就亮度不一,按键也又有时灵有时不灵
51单片机,型号是89C52,感谢大家,查了好多资料也看不明白,可能跟本人智商有关嘿嘿
可能消隐没消好,我也搞不明白
单片机源程序如下:
#include <REGX52.H>//头文件
#include "Delay.h"
int duan[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, }; //段选
int wei[]={0x08,0x04,0x02,0x01};
int number=1000;//初始值
char qian,bai,shi,ge;
void INT0_inti()//外部中断初始化
{
EA=1;
IT0=1;
EX0=1;
}
void INT2_inti()//外部中断初始化
{
EA=1;
IT1=1;
EX1=1;
}
void jisuan()//计算子程序
{
qian=number/1000;
bai=number%1000/100;
shi=number%1000%100/10;
ge=number%1000%100%10;
P2=0x01;
P0=duan[qian];
Delay(5);
P2=0x00;
P2=0x02;
P0=duan[bai];
Delay(5);
P2=0x00;
P2=0x04;
P0=duan[shi];
Delay(5);
P2=0x00;
P2=0x08;
P0=duan[ge];
Delay(5);
P2=0x00;
}
void main()
{
INT0_inti();//中断初始化
INT2_inti();//中断初始化
P3_4=0;//键盘是矩阵的,所以给了3-4低电位,用的是P3-2,P3-3
while(1)
{
jisuan();//数码管
}
}
void IWT0_ISR() interrupt 0//进入中断
{
number=number+1;
if(number==10000)
number=0;
if(number==-1)
number=9999;
}
void IWT2_ISR() interrupt 2//进入中断
{
number=number-1;
if(number==10000)
number=0;
if(number==-1)
number=9999;
}
作者:
人工置顶员
时间:
2022-4-22 19:55
顶一下
作者:
wulin
时间:
2022-4-22 21:56
不要轻易使用外部中断做按键输入这种简单任务,既不易消抖,也占用有限资源。数码管亮度不一排除硬件因素后多为消隐不良和动态扫描周期不均衡。给你改了,你试试。
#include <REGX52.H>//头文件
//#include "Delay.h"
//unsigned char sec_s=0,min_s=0;//秒、分设置变量
//void Cnt10ms=0; //中断计时变量
unsigned char code duan[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, }; //段选
unsigned char code wei[]={0x01,0x02,0x04,0x08};
unsigned char cache[4];
unsigned int number=1000;//初始值
//unsigned char qian,bai,shi,ge;
unsigned char count=0;
bit sign=0;
unsigned char num=0;
void Delay(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);
}
/*
void INT0_inti()//外部中断初始化
{
EA=1;
IT0=1;
EX0=1;
}
void INT2_inti()//外部中断初始化
{
EA=1;
IT1=1;
EX1=1;
}*/
void jisuan()//计算子程序
{//分解数据,保存入缓存
cache[0]=duan[number/1000%10];
cache[1]=duan[number/100%10];
cache[2]=duan[number/10%10];
cache[3]=duan[number%10];
P2=0x00;//消隐
P0=cache[num];//送段码
P2=wei[num];//送位码
Delay(1);//延时
num=++num%4;//循环计数
}
void main()
{
// INT0_inti();//中断初始化
// INT2_inti();//中断初始化
P3_4=0;//键盘是矩阵的,所以给了3-4低电位,用的是P3-2,P3-3
while(1)
{
if(!P3_2||!P3_3)
{
if(++count>=10 && sign==0)//消抖
{
sign=1;
if(!P3_2)
{
if(number<9999)number++;
}
if(!P3_3)
{
if(number>0)number--;
}
}
}
else
{
count=0;
sign=0;
}
jisuan();//数码管
}
}
/*
void IWT0_ISR() interrupt 0//进入中断
{
number=number+1;
if(number==10000)
number=0;
if(number==-1)
number=9999;
}
void IWT2_ISR() interrupt 2//进入中断
{
number=number-1;
if(number==10000)
number=0;
if(number==-1)
number=9999;
}*/
复制代码
作者:
wznb
时间:
2022-4-23 16:33
wulin 发表于 2022-4-22 21:56
不要轻易使用外部中断做按键输入这种简单任务,既不易消抖,也占用有限资源。数码管亮度不一排除硬件因素后 ...
真的牛
作者:
liucan2020
时间:
2022-8-17 10:42
一个完整的代码,是不是要有主循环函数?根据标志位在主循环里面处理,我之 前自己做了个小车,红外遥控也是反应迟钝,时灵时不灵,一直有这个困惑。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1