challis 发表于 2024-1-26 11:04:33

元件和线路测试成功后,主要就是修改程序逻辑了
我考虑的是做一个小时钟,带按钮,平时就正常冒号闪烁显示时间
按mode按钮后分钟闪烁,可以通过up/down按钮来调整分钟
再按一次mode按钮后时钟闪烁,可以通过up/down按钮来调整小时

challis 发表于 2024-1-26 11:05:54

为了显示方便,我用seg_4bit_data来直接储存需要显示的内容,用Timer4来循环显示seg_4bit_data的数据
//2毫秒@6.000MHz
void Timer4_Isr(void) interrupt 20
{
    switch(t4_iter)
    {
    case 0:   //seg1
      SEG_4 = 0;
      t4_iter = 1;
      SEG_LED = seg_4bit_data;
      SEG_1 = 1;
      break;
    case 1:   //seg2
      SEG_1 = 0;
      t4_iter = 2;
      SEG_LED = seg_4bit_data;
      SEG_2 = 1;
      break;
    case 2:   //seg3
      SEG_2 = 0;
      t4_iter = 3;
      SEG_LED = seg_4bit_data;
      SEG_3 = 1;
      break;
    case 3:   //seg4
      SEG_3 = 0;
      t4_iter = 0;
      SEG_LED = seg_4bit_data;
      SEG_4 = 1;
      break;
    }
}

challis 发表于 2024-1-26 11:07:45

最开始所有代码都写在main.c中,发现实在太乱套了,于是,数码管设置相关的函数被抽离出来,写到了seg.h中
#ifndef SEG_H
#define SEG_H
#include "STC8H.h"

#define SEG_NULL 0xff

//led数字
uchar xdata seg_led_data[]={
                0xC0,//"0"
                0xF9,//"1"
                0xA4,//"2"
                0xB0,//"3"
                0x99,//"4"
                0x92,//"5"
                0x82,//"6"
                0xF8,//"7"
                0x80,//"8"
                0x90,//"9"
                0x88,//"A"
                0x83,//"B"
                0xC6,//"C"
                0xA1,//"D"
                0x86,//"E"
                0x8E,//"F"
                0x89,//"H"
                0xC7,//"L"
                0xC8,//"n"
                0xC1,//"u"
                0x8C,//"P"
                0xA3,//"o"
                0xBF,//"-"
                0xFF,//熄灭
};
//4位数码管的具体数据
uchar seg_4bit_data = {SEG_NULL,SEG_NULL,SEG_NULL,SEG_NULL};

//设置前2个数码管,show_dot为是否显示冒号
void SetSeg4BitData_1(uchar d,uchar show_dot)
{
    if(d == SEG_NULL)
    {
      seg_4bit_data = 0xff;
      if(show_dot)
            seg_4bit_data = 0x7f;
      else
            seg_4bit_data = 0xff;
    }
    else
    {
      seg_4bit_data = seg_led_data;
      if(show_dot)
            seg_4bit_data = seg_led_data & 0x7f;
      else
            seg_4bit_data = seg_led_data;
    }
}
//设置后2个数码管
void SetSeg4BitData_2(uchar d)
{
    if(d == SEG_NULL)
    {
      seg_4bit_data = 0xff;
      seg_4bit_data = 0xff;
    }
    else
    {
      seg_4bit_data = seg_led_data;
      seg_4bit_data = seg_led_data;
    }
}
#endif//SEG_H
外部直接调用SetSeg4BitData_1,SetSeg4BitData_2来设置前2位数码管和后2位数码管所显示的内容,也就是seg_4bit_data的内容

challis 发表于 2024-1-26 11:09:21

将时间相关的代码放到了clock.h文件中
#ifndef CLOCK_H
#define CLOCK_H

uchar hour=0,minute=0,second=0;
void AddSec()
{
    if(second >= 59)
    {
      second = 0;
      if(minute >= 59)
      {
            minute = 0;
            if(hour >= 23)
                hour = 0;
            else
                ++hour;
      }
      else
            ++minute;
    }
    else
      ++second;
}
#endif //CLOCK_H
AddSec来实现增加一秒,以及自动增加分钟和小时

challis 发表于 2024-1-26 11:13:35

本帖最后由 grstory 于 2024-1-26 11:17 编辑

再开一个Timer3定时器来处理业务流程,控制闪烁用is_show_dot变量,每隔500ms将会在1,0间变动,每隔1000ms调用一次AddSec函数,用SetSeg4Bit函数来将需要显示的数据写入具体变量,以供Timer4进行循环显示
#define Mode_Show_1 minute
#define Mode_Show_2 second

void SetSeg4Bit()
{
      SetSeg4BitData_1(Mode_Show_1,is_show_dot);
      SetSeg4BitData_2(Mode_Show_2);
}

//100毫秒@6.000MHz
void Timer3_Isr(void) interrupt 19
{
    ++t3_iter;
    if(t3_iter == 5)
    {
      is_show_dot = !is_show_dot;
      SetSeg4Bit();
    }
    else if(t3_iter == 10)
    {
      AddSec();
      is_show_dot = !is_show_dot;
      SetSeg4Bit();
      t3_iter = 0;
    }
}

challis 发表于 2024-1-26 11:20:06

直接用母对母的插线太不稳定了,经常线就掉了,多掉几根,还需要找对应的接口,于是决定将数码管焊到电路板上,本来想把单片机也焊上去,但是为了以后方便拆卸单片机,就焊了几根带母口的插线到数码管上了,单片机转接板上也焊上了排插

challis 发表于 2024-1-26 11:21:06

为了方便调试,正常应该是显示小时,分钟的现在改为显示分钟,秒钟,用了2个宏定义,方便后期修改#define Mode_Show_1 minute
#define Mode_Show_2 second

challis 发表于 2024-1-26 11:23:54

本帖最后由 grstory 于 2024-1-26 11:25 编辑

烧录程序,接上自制的简易电源,测试,能正常的显示时间流逝,并且冒号闪烁正常了!

challis 发表于 2024-1-26 11:28:27

接下来就是添加按钮,然后实现调整时间的功能了,对了,请问下大佬们,按钮一端接IO口,另一端是接地还是接VCC?中间需要加电阻吗?

manzunzu 发表于 2024-1-26 15:09:43

你好这个代码能分享下吗,我做出来的乱码{:4_187:}
页: 1 2 [3] 4 5 6 7 8 9 10 11
查看完整版本: 从零开始做一个数码管时钟-开天斧,程序开源 | 已完结