AFON//Радиотехник
C++Builder · проект 37/50

7-сегментный индикатор

Цифра 0…F → сегменты на Canvas.

Задача

Нарисовать семисегментный индикатор, зажигая сегменты по коду цифры 0…F.

Компоненты на форме

Edit (EditDigit), PaintBox, Button (ButtonShow).

Как работает

  1. Ввести шестнадцатеричную цифру.
  2. Получить маску сегментов из таблицы.
  3. Нарисовать семь сегментов, светящиеся — ярко.

Исходный код модуля

//---------------------------------------------------------------------------
// Проект 37. Рисованный 7-сегментный индикатор
// Цифра 0…F → сегменты, отрисовка на Canvas.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Таблица сегментов a…g для цифр 0..F в один байт (бит на сегмент).
// segMask — ядро, проверяется тестом на нескольких цифрах.
unsigned char segMask(int digit)
{
    static const unsigned char T[16]={
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
        0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
    return (digit>=0&&digit<16)?T[digit]:0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonShowClick(TObject *Sender)
{
    int d=StrToIntDef("0x"+EditDigit->Text,0) & 0xF;
    unsigned char m=segMask(d);
    TCanvas *c=PaintBox1->Canvas;
    c->Brush->Color=clBlack; c->FillRect(PaintBox1->ClientRect);
    c->Pen->Width=6; 
    // a
    c->Pen->Color=(m&0x01)?clRed:(TColor)RGB(40,0,0); c->MoveTo(30,20); c->LineTo(80,20);
    // b
    c->Pen->Color=(m&0x02)?clRed:(TColor)RGB(40,0,0); c->MoveTo(80,20); c->LineTo(80,70);
    // c
    c->Pen->Color=(m&0x04)?clRed:(TColor)RGB(40,0,0); c->MoveTo(80,70); c->LineTo(80,120);
    // d
    c->Pen->Color=(m&0x08)?clRed:(TColor)RGB(40,0,0); c->MoveTo(30,120); c->LineTo(80,120);
    // e
    c->Pen->Color=(m&0x10)?clRed:(TColor)RGB(40,0,0); c->MoveTo(30,70); c->LineTo(30,120);
    // f
    c->Pen->Color=(m&0x20)?clRed:(TColor)RGB(40,0,0); c->MoveTo(30,20); c->LineTo(30,70);
    // g
    c->Pen->Color=(m&0x40)?clRed:(TColor)RGB(40,0,0); c->MoveTo(30,70); c->LineTo(80,70);
}
//---------------------------------------------------------------------------

Пояснения

  • Ядро segMask возвращает байт с битами a…g.
  • Погашенный сегмент рисуется тёмно-красным для реализма.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.

Что дальше

Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.