Tuier
发表于 2024-2-27 22:10:52
芯片焊接牛B{:4_250:}
ly1350
发表于 2024-2-27 22:30:02
Tuier 发表于 2024-2-27 22:10
芯片焊接牛B
用 SKDIP28 封装的省事!或者买转接板。我那是没有条件,才这样焊的
zhudean11
发表于 2024-2-28 05:48:28
{:4_250:}简单实用
ly1350
发表于 2024-2-28 08:08:01
#include<STC8H.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar dis={0,0,':',0,0};
uchar count=0,s=0,m=0,h=0;
void Led_Init()
{
P2M0 |= 0x7f; P2M1 &= ~0x7f; //设置P2.0-P2.6为推挽输出
P3M0 = (P3M0 & ~0x78) | 0x80; P3M1 &= ~0xf8; //设置P3.3-P3.6为高阻输入;p37为推挽输出
P33=1; //DG1
P34=1; //DG2
P35=1; //DG3
P36=1; //DG4
P37=0; //Pd
P20=0; //段A
P21=0; //段B
P22=0; //段C
P23=0; //段D
P24=0; //段E
P25=0; //段F
P26=0; //段G
}
void Delay1ms(void) //@24.000MHz
{
unsigned char data i, j;
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
void Delay10ms(void) //@24.000MHz
{
unsigned char data i, j;
i = 234;
j = 115;
do
{
while (--j);
} while (--i);
}
void Display(unsigned char val)
{
unsigned char i=0;
for(i=0;i<5;i++)
{
switch(val)
{
case 0 :
P20=1;
P21=1;
P22=1;
P23=1;
P24=1;
P25=1;
break;
case 1 :
P21=1;
P22=1;
break;
case 2 :
P20=1; //段A
P21=1; //段B
P22=0; //段C
P23=1; //段D
P24=1; //段E
P25=0; //段F
P26=1; //段G
break;
case 3 :
P20=1; //段A
P21=1; //段B
P22=1; //段C
P23=1; //段D
P24=0; //段E
P25=0; //段F
P26=1; //段G
break;
case4 :
P20=0; //段A
P21=1; //段B
P22=1; //段C
P23=0; //段D
P24=0; //段E
P25=1; //段F
P26=1; //段G
break;
case5 :
P20=1; //段A
P21=0; //段B
P22=1; //段C
P23=1; //段D
P24=0; //段E
P25=1; //段F
P26=1; //段G
break;
case6 :
P20=1; //段A
P21=0; //段B
P22=1; //段C
P23=1; //段D
P24=1; //段E
P25=1; //段F
P26=1; //段G
break;
case7 :
P20=1; //段A
P21=1; //段B
P22=1; //段C
P23=0; //段D
P24=0; //段E
P25=0; //段F
P26=0; //段G
break;
case8 :
P20=1; //段A
P21=1; //段B
P22=1; //段C
P23=1; //段D
P24=1; //段E
P25=1; //段F
P26=1; //段G
break;
case 9 :
P20=1; //段A
P21=1; //段B
P22=1; //段C
P23=1; //段D
P24=0; //段E
P25=1; //段F
P26=1; //段G
break;
case 'a' :
P20=1; //段A
P21=1; //段B
P22=1; //段C
P23=0; //段D
P24=1; //段E
P25=1; //段F
P26=1; //段G
break;
case 'b' :
P20=0; //段A
P21=0; //段B
P22=1; //段C
P23=1; //段D
P24=1; //段E
P25=1; //段F
P26=1; //段G
break;
case 'c' :
P20=1; //段A
P21=0; //段B
P22=0; //段C
P23=1; //段D
P24=1; //段E
P25=1; //段F
P26=0; //段G
break;
case 'd' :
P20=0; //段A
P21=1; //段B
P22=1; //段C
P23=1; //段D
P24=1; //段E
P25=0; //段F
P26=1; //段G
break;
case 'e' :
P20=1; //段A
P21=0; //段B
P22=0; //段C
P23=1; //段D
P24=1; //段E
P25=1; //段F
P26=1; //段G
break;
case 'f' :
P20=1; //段A
P21=0; //段B
P22=0; //段C
P23=0; //段D
P24=1; //段E
P25=1; //段F
P26=1; //段G
break;
case ':' : P37=1;break;
default : P26=1; //段G
}
switch(i)
{
case 0 : P33=0;break;
case 1 : P34=0;break;
case 2 : P34=0;break;
case 3 : P35=0;break;
case 4: P36=0;break;
}
Delay1ms();
Led_Init();
}
}
void Timer1_Init(void) //1毫秒@24.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x40; //设置定时初始值
TH1 = 0xA2; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1=1;
EA=1;
}
void main()
{
uchar i=0,f=0;
P3M0 &= ~0x04; P3M1 &= ~0x04; //设置P32为标准io口
EX0=0;
P32=1;
Timer1_Init();
while(1)
{
if(P32==0)
{
Delay10ms();
if(P32==0)
{
f++;
while(!P32);
}
}
if(f>=3) f=0;
if(count>=100)
{
count=0 ;
s+=1;
}
if(s>=60)
{
s=0;
m++;
}
if(m>=60)
{
m=0;
h++;
}
if(h>=24)h=0 ;
switch(f)
{
case 0 :
dis=s/10;
dis=s%10;
dis=count/10;
dis=count%10;
break;
case 1 :
dis=h/10;
dis=h%10;
dis=m/10;
dis=m%10;
break;
case 2 :
dis=m/10;
dis=m%10;
dis=s/10;
dis=s%10;
break;
default : break;
}
}
}
void Timer1_Isr() interrupt 3
{
Display(dis);
count++;
}
ly1350
发表于 2024-2-28 08:10:46
以上是完整的代码。但是,一按按键就停止计数了。要去掉第255行的 Delay10ms();
就运行正常,就是视频的效果。
ly1350
发表于 2024-2-28 09:38:53
目前我自己的解决方法是:
设置一个变量temp,记录两次按键端口检测为低之间的时间,如果大于20ms,就认定不是抖动。经测试,去抖问题解决了。
但是,我的疑问还在,为什么用软件延时,程序就死机呢?还是没搞明白
ly1350
发表于 2024-2-28 09:39:32
程序修改部分:
void main()
{
uchar i=0,f=0,temp=0;
P3M0 &= ~0x04; P3M1 &= ~0x04; //设置P32为标准io口
P32=1;
Timer1_Init();
while(1)
{
if((P32==0)&&(temp==0))
temp=count;
else if((P32==0)&&(count-temp)>20)
{
f++;
while(!P32);
}
ly1350
发表于 2024-2-28 09:43:31
本帖最后由 ly1350 于 2024-2-28 09:45 编辑
测试效果:貌似没有问题了。。。{:biggrin:}
下一步准备完善时间的设置问题。
ly1350
发表于 2024-2-28 09:44:08
70
dnajx
发表于 2024-3-9 07:49:07
学习中,我们一起加油!{:smile:}
页:
1
2
3
4
5
6
7
8
[9]
10
11
12
13
14