Основные элементы в схеме:
1. Четырехзнаковый 7-SEG индикатор (точка не в счет), выводим на три знака
2. at89c2051 (или at89c51)
В схеме порт P3 - знакоместо, P1 - значение для вывода на индикатор. Компилируется все SDCC.
Вот прога:
#include "at89x51.h"
typedef unsigned char byte; // задаем свой тип - байт
const int myTik=10000; // интервал времени таймера
#define mySegA 0x01 // сегменты индикатора
#define mySegB 0x02
#define mySegC 0x04
#define mySegD 0x08
#define mySegE 0x10
#define mySegF 0x20
#define mySegG 0x40
#define mySegH 0x80
__code byte myInd[15]= // массив индицируемых цифр и букв
{
mySegA|mySegB|mySegC|mySegD|mySegE|mySegF, //0
mySegB|mySegC, //1
mySegA|mySegB|mySegG|mySegE|mySegD, //2
mySegA|mySegB|mySegC|mySegD|mySegG, //3
mySegB|mySegC|mySegF|mySegG, //4
mySegA|mySegF|mySegG|mySegC|mySegD, //5
mySegC|mySegD|mySegE|mySegF|mySegA|mySegG, //6
mySegA|mySegB|mySegC, //7
mySegA|mySegB|mySegC|mySegD|mySegE|mySegF|mySegG, //8
mySegA|mySegB|mySegC|mySegD|mySegF|mySegG, //9
mySegA|mySegB|mySegC|mySegE|mySegF|mySegG, //A
mySegB|mySegC|mySegD|mySegF|mySegG, //У
mySegA|mySegB|mySegE|mySegF|mySegG, //Р
mySegA|mySegC|mySegD|mySegE|mySegF|mySegG, //Б
mySegA|mySegD|mySegE|mySegF|mySegG //Е
};
#define myClearMask 0xC7 // Маска для обнуления незначащих битов порта P3 (в данном случае C7h=11000111, т.е. исп. P3.3-P3.5)
__code byte myNumber[3]={11,12,10}; // Значения для индикации, подставляются в массив myInd, в данном случае результат - "УРА"
byte myCount10ms=0; // Счетчик интервалов времени
byte RazmerInd=6; // Граничное значение бита порта P3, в который осуществится вывод (смотрим процедуру IndZn)
byte CountZn=3; // Начальный бит порта P3,с которого начинается вывод
int i=0; // Переменная для организации цикла
void IndZn () // Процедура индикации 3 символов
{
P3=P3&myClearMask; // Обнуляем незначащие биты порта P3, в которые осуществляется вывод
P1=~myInd[myNumber[CountZn-3]]; // Выводим в P1 значение для индикации (инверсия, так как при подаче нуля - сегмент горит)
P3=P3|(1<<CountZn); // Устанавливаем бит, определяющий знакоместо
CountZn++; // Инкремент номера знакоместа
if (CountZn==RazmerInd) CountZn=3; // Установка начального значения знакоместа при переполнении
}
void IntOverT0 (void) __interrupt TF0_VECTOR // прерывание по таймеру 0
{
myCount10ms++; // Инкремент счетчика
IndZn(); // Индикация символа
}
void main(void)
{
TMOD = M0_0;
TL0=~myTik;
TH0=~(myTik>>8);
TR0=1;
ET0 = 1;
EA = 1;
while(1); // Бесконечный цикл
}


