从零开始做一个数码管时钟-开天斧,程序开源 | 已完结
免费申请的开天斧到货了,在淘宝上购买了华强北的一堆小零件后,准备开始做一个小数码管时钟测试芯片为STC-8H8K64U-TSSOP20,频率6MHz,电压3.7v
开天斧同样适用
实现了显示时间,修改时间,设置闹钟,闹钟提醒,以及定时器的功能
最新代码在88楼
LED代码查询V1.1 在91楼
先用 3.7v 电池接 100Ω电阻,来测量一下数码管各个引脚的位置,我买的这个 4 位共阳极时钟数码管,12 个引脚,应该是正常的 8 个阴极引脚控制单个数码管的显示,4 个阳极引脚来控制具体显示哪个数码管,测量后,果然和我预想的一样,奇怪的是,这个晶体管的引脚居然不是顺序排列的,感觉内部弄得好随意!用纸记录下引脚功能,以便以后使用 确定数码管引脚功能后,开始接线,因为我最终准备用 stc8h8u64 tssop20 这个芯片,于是 使用 p30~p37 控制数码管阴极,p1.4~p1.7 控制阳极 写一个通用的数码管显示的函数
//seg:0x01-P14,0x02-P15,0x04-P16,0x08-P17
void ShowSeg(uchar led,uchar seg)
{
P14 = 0;
P15 = 0;
P16 = 0;
P17 = 0;
_nop_();
P3 = led;
P14 = seg & 0x01;
P15 = (seg>>1) & 0x01;
P16 = (seg>>2) & 0x01;
P17 = (seg>>3) & 0x01;
}
uchar led 控制共阳极数码管显示情况
uchar seg 控制显示哪些数码管,如果显示第一个就是0x01,如果想同时显示第一个和第三个就是0x01|0x04
并用程序生成好led显示的数据 {:hug:} 把数码管连上开发板,初始化端口,调用ShowSeg函数来测试一下
P1M0 = 0x00;
P1M1 = 0x00;
P0 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P3 = 0xff;
ShowSeg(seg_led_data,0x01);
while(1);
发现数码管点亮了,但是亮度有点太暗了 测压阳极和阴极之间的电压,发现只有1.61v,是不是IO口驱动不够?
我尝试把P14~P17改为推挽输出模式,这下数码管显示正常了! 接下来就是利用定时器来循环点亮4个数码管了,初始化定时器,在定时器函数内添加显示第二个数码管的代码,来测试一下定时中断是否正常
void Timer4_Isr(void) interrupt 20
{
ShowSeg(seg_led_data,0x02);
}
烧录后,发现数码管并没有显示2,而是和之前一样,只显示1,那么说明定时器中断没有进入,打开万能的手册去找找答案!
我去,原来是EA没有设置为1,这里给STC官方烧录软件提个小小的建议,定时器计算器功能中生成使能定时器中断的示例代码里面把EA=1加上,不然新手容易漏掉这个,导致无法进入中断