共阳的数码管,你用共阴的代码,提问之前请先说明清楚。 |
共阳极的那你得吧两个SCON设置为推挽才行啊。要不然标准IO的高电平电流同时点亮8个段,即使亮也几乎看不到吧。消隐要让SCON=0,输出SEG之后再把对应的SCON=1 |
hjx5548 发表于 2024-5-19 13:44 这样也不能显示? |
xiaobendan001 发表于 2024-5-19 10:19 //倒计时 #include"stc8.h" #include "intrins.h" #define uint unsigned int #define uchar unsigned char #define SEG P1 sbit SCON1 = P3^7; sbit SCON2 = P3^6; sbit KEY = P3^2; uchar count=0; char num=60,ge,shi; uchar flag; uchar code table[]={ 0x03,/*0*/ 0x9F,/*1*/ 0x25,/*2*/ 0x0D,/*3*/ 0x99,/*4*/ 0x49,/*5*/ 0x41,/*6*/ 0x1F,/*7*/ 0x01,/*8*/ 0x09,/*9*/}; void T0_init() //5毫秒@11.0592MHz { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x00; //设置定时初始值 TH0 = 0xEE; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; ET0 = 1; //使能定时器0中断 EA = 1; } void IO_init() { P3M0 = 0x00; P3M1 = 0x00; P1M0 = 0xff; P1M1 = 0x00; } void TM0_Isr() interrupt 1 //5毫秒 { TL0 = 0x00; //设置定时初始值 TH0 = 0xEE; //设置定时初始值 flag++; if (flag=20) { flag=0; num--; if (num=0) { num=60; } } } void main() { IO_init(); T0_init() ; while (1) { SEG=0; shi=num/10; ge=num%10; switch (count) { case0:SCON1 = 0;SCON2=1; SEG = table[ge]; break; case1:SCON1 = 1;SCON2=0; SEG = table[shi]; break; default: break; } count++; if (count>1)count=0; } } |
xiaobendan001 发表于 2024-5-19 10:19 void TM0_Isr() interrupt 1 //5毫秒 { TL0 = 0x00; //设置定时初始值 TH0 = 0xEE; //设置定时初始值 flag++; if (flag=20) { flag=0; num--; if (num=0) { num=60; } } } |
原程序有多处错误:1. if (flag=20),应改为 if (flag==200) 2. 动态刷新时间太快,需合理设置count++的时间间隔 3. case0、case1应为case 0、case 1 …… 程序修改如下,仅供参考: void TM0_Isr() interrupt 1 //5毫秒 { TL0 = 0x00; //设置定时初始值 TH0 = 0xEE; //设置定时初始值 flag++; if(flag==200) { flag=0; num--; if (num==0) { num=60; } } //动态扫描刷新周期为10毫秒 count++; if (count>1) { count=0; } } void main() { IO_init(); T0_init() ; while(1) { shi=num/10; ge=num%10; SCON1 = 1; SCON2 = 1; //消隐 switch(count) { case 0: SCON1 = 1; SCON2 = 0; SEG = table[ge]; break; case 1: SCON1 = 0; SCON2 = 1; SEG = table[shi]; break; default: break; } } } |
每当flag++到20时,flag = 0然后立刻flag=60,然后flag++以后就得等他++到255再变0,重复++到20时再变60,再重复。就是大概flag计数215次num--一次,1075ms减一次,应该可以啊。为啥不显示?是不显示还是不计时?另外,SEG=0XFF是想消隐,但是你这是共阴的,因为你的SCON是设置的标准IO,那么只能共阴极了。共阴极的段码要给0x00才行消隐,你这0xff不是一直亮着吗?还有扫描切换不要放到主循环,这扫描速度得有多快啊。一个位的显示时间可能太短了。消隐也可以把两个SCON都置1。 |