НЕТ СМЫСЛА РИСКОВАТЬ.
возможно под 10-ку х64 и запустится, но "ловить вирь" или переустанавливать ОС желания как-то НЕТУ.
Код: Выделить всё
#include "Arduino.h"
#include "MsTimer2.h"
#include "TM74HC595Display.h"
int ledPin = 13;
int SCLK = 7;
int RCLK = 6;
int DIO = 5;
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];
void setup()
{
LED_0F[0] = 0xC0; //0
LED_0F[1] = 0xF9; //1
LED_0F[2] = 0xA4; //2
LED_0F[3] = 0xB0; //3
LED_0F[4] = 0x99; //4
LED_0F[5] = 0x92; //5
LED_0F[6] = 0x82; //6
LED_0F[7] = 0xF8; //7
LED_0F[8] = 0x80; //8
LED_0F[9] = 0x90; //9
LED_0F[10] = 0x88; //A
LED_0F[11] = 0x83; //b
LED_0F[12] = 0xC6; //C
LED_0F[13] = 0xA1; //d
LED_0F[14] = 0x86; //E
LED_0F[15] = 0x8E; //F
LED_0F[16] = 0xC2; //G
LED_0F[17] = 0x89; //H
LED_0F[18] = 0xF9; //I
LED_0F[19] = 0xF1; //J
LED_0F[20] = 0xC3; //L
LED_0F[21] = 0xA9; //n
LED_0F[22] = 0xC0; //O
LED_0F[23] = 0x8C; //P
LED_0F[24] = 0x98; //q
LED_0F[25] = 0x92; //S
LED_0F[26] = 0xC1; //U
LED_0F[27] = 0x91; //Y
LED_0F[28] = 0xFE; //hight -
}
void flash()
{
static boolean output = HIGH;
digitalWrite(ledPin, output);
output = !output;
}
int main()
{
pinMode(ledPin, OUTPUT);
MsTimer2::set(500, flash); // 500ms period
MsTimer2::start();
setup();
sei();
for (;;)
{
disp.send(LED_0F[0], 0b0001); //send digital "0" to 1st indicator
_delay_ms(2000);
disp.send(LED_0F[3], 0b0110); //send digital "3" to 2nd and 3rd indicator
_delay_ms(2000);
disp.send(LED_0F[10], 0b1111); //send simbol "A" to all indicators
_delay_ms(2000);
for (int i = 0; i <= 99; i++)
{
disp.digit2(i, 0b0001, 50); //send counter 0-99 with delay 50 cicles int 1st and 2nd view ports
}
for (int i = 0; i <= 99; i++)
{
disp.digit2(i, 0b0100, 50); //send counter 0-99 with delay 50 cicles int 3st and 4rd view ports
}
for (int i = 0; i <= 100; i++)
{
disp.digit4showZero(i, 50); //send counter 0-100 with delay 50 cicles with zero
}
for (int i = 0; i <= 9999; i++)
{
disp.digit4(i, 50); //send counter 0-9999 with delay 50 cicles and hide zero
}
}
return 0;
}имхо надо ближе к народу/китайпрому быть - ардуине-ардуиново, пошел и купил задешево. Но и без доп. микросхем ардуинщики все давно разжевали:Только вот именно без дополнительных мелкосхем надо прокрутить...
Код: Выделить всё
#include "SevSeg.h"
SevSeg sevseg;
void setup(){
byte numDigits = 4;
byte digitPins[] = {10, 11, 12, 13};
byte segmentPins[] = {9, 2, 3, 5, 6, 8, 7, 4};
bool resistorsOnSegments = true;
bool updateWithDelaysIn = true;
byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}
void loop(){
sevseg.setNumber(4999, 3);
sevseg.refreshDisplay();
}Код: Выделить всё
/*
*
* шаблон-заготовка обработчика клавиатуры-дисплея
* базовая модель МК - atmega8
* автономно-независимое исполнение по прерыванию
* обмен с основной программой через буфер предподготовки данных и
* буфер содержимого байта кода клавиатуры
* данные в буфере предподготовки представлены
* уже в виде сегментного кода
* флаги -
* наличие данных в буфере содержимого байта кода клавиатуры
* в текущем скан-цикле
* и
* запрос обновления данных из буфера предподготовки в
* буфер видеопамяти
*
*/
//*****************************************************************
// Секция include: здесь подключается заголовочный файл к модулю
//*****************************************************************
//#include "leds4.h" // заголовочный *.h файл текущего проекта
//
// содержимое leds4.h на этапе тестирования на симуляторе
//
// знакогенератор
#define s_A 0 // значение номера сегмента A
#define s_B 1 // значение номера сегмента B
#define s_C 2 // значение номера сегмента C
#define s_D 3 // значение номера сегмента D
#define s_E 4 // значение номера сегмента E
#define s_F 5 // значение номера сегмента F
#define s_G 6 // значение номера сегмента G
#define s_H 7 // значение номера сегмента H
/* "кодовая страница кракозябр 7-сегментных"
раскладка сегментов по символам определяется стандартной разметкой A-H
по условию, что активный уровень(сегмент астивен/светится) принят за 1 */
#define fnt_bl 0
#define fnt_0 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F) // цмфра 0 или символ "О"
#define fnt_1 (1<<s_B | 1<<s_C)
#define fnt_2 (1<<s_A | 1<<s_B | 1<<s_D | 1<<s_E | 1<<s_G)
#define fnt_3 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // цифра 3 или символ "З"
#define fnt_4 (1<<s_B | 1<<s_C | 1<<s_F | 1<<s_G) // цифра 4 или символ "Ч"
#define fnt_5 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // цифра 5 или символ "S"
#define fnt_6 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G)
#define fnt_7 (1<<s_A | 1<<s_B | 1<<s_C)
#define fnt_8 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G)
#define fnt_9 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G)
#define fnt_A (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "A"
#define fnt_b (1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "b"
#define fnt_C (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F) // символ "C"
#define fnt_d (1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_G) // символ "d"
#define fnt_E (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "E"
#define fnt_F (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G) // символ "F"
#define fnt_P (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G | 1<<s_B) // символ "P"
#define fnt_L (1<<s_E | 1<<s_F | 1<<s_D) // символ "L"
#define fnt_H (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "H"
#define fnt_U (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_D) // символ "U"
#define fnt_I (1<<s_E | 1<<s_F) // левая 1 или латинская I
#define fnt_S (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // аналог цифры 5
#define fnt_J (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E) // символ "J"
#define fnt_r (1<<s_G | 1<<s_E) // символ "r"
#define fnt_n (1<<s_G | 1<<s_E | 1<<s_C) // символ "п"
#define fnt_c (1<<s_G | 1<<s_E | 1<<s_D) // символ "с"
#define fnt_o (1<<s_G | 1<<s_E | 1<<s_D | 1<<s_C) // нижний кружок "о"
#define fnt_u (1<<s_C | 1<<s_E | 1<<s_D) // символ "u"
#define fnt_h (1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "h"
#define fnt_rusg (1<<s_A | 1<<s_E | 1<<s_F) // символ "Г"
#define fnt_rusP (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_B | 1<<s_C) // символ "П"
#define fnt_rus_iE (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // символ Э (инверсное Е)
#define fnt_rusY (1<<s_F | 1<<s_G | 1<<s_B | 1<<s_C | 1<<s_D) // символ "У"
#define fnt_qest (1<<s_A | 1<<s_B | 1<<s_E | 1<<s_G) // символ "?"
#define fnt_rC (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D) // символ ) (обратная скобка)
#define fnt_gradus (1<<s_A | 1<<s_B | 1<<s_F | 1<<s_G) // верхний кружок "символ грвдуса"
#define fnt_minus (1<<s_G) // символ "-" (средняя черта)
#define fnt_aplin (1<<s_A) // символ "верхняя черта"
#define fnt_dnlin (1<<s_D) // символ "_" (нижняя черта)
#define fnt_trlin (1<<s_A | 1<<s_G | 1<<s_D) // символ "три черты"
#define fnt_coma (1<<s_H) // символ "," (децимальная точка)
// определение линий интерфейса
// линии интерфейса связи для программного I2C обмена
// активный уровень для сегментных ключей = 1
// режим работы OUTPUT
// состояние по сбросу = все Z
// состояние при инициализации = все OUTPUT = 1
#define segline_a 11 // управление сегментным ключом A на D12
#define segline_b 12 // управление сегментным ключом B на D13
#define segline_c 14 // управление сегментным ключом C на D14
#define segline_d 15 // управление сегментным ключом D на D15
#define segline_e 16 // управление сегментным ключом E на D16
#define segline_f 17 // управление сегментным ключом F на D17
#define segline_g 18 // управление сегментным ключом G на D18
#define segline_h 19 // управление сегментным ключом H на D19
// активный уровень для анодных ключей = 0
// режим работы OUTPUT
// состояние по сбросу = все с внешней подтяжкой к 1
// состояние при инициализации = все OUTPUT = 1
#define sa_line0 3 // управление анодным ключом 0 на D11
#define sa_line1 6 // управление анодным ключом 1 на D10
#define sa_line2 5 // управление анодным ключом 2 на D9
#define sa_line3 4 // управление анодным ключом 3 на D8
// линия контроля ЛВК (линия возврата клавиатуры)
// режим работы INPUT с внешней подтяжкой к 1
// активный уровень = 0
#define lvk_line 8 // линия контроля ЛВК на D7
// линия выходного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея
#define sdr_clco 13 // источник тактового сигнала ККД на D4
// линия входного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея
#define sdr_clci 2 // приемник тактового сигнала ККД на D2 (INT0)
// константы и маски
#define kkd_freq 30000 //260 // константа генератора регенерации ККД
#define llq 10 // константа малого цикла (10тиков/переполнение)
#define hlq 10 //26 // константа большого цикла (26циклов/переполнение)
#define nump 4 // константа для счетчика позиций (0-3)
#define mask_sa0 B00000001 // маска линии sa_line0
#define mask_sa1 B00000010 // маска линии sa_line1
#define mask_sa2 B00000100 // маска линии sa_line2
#define mask_sa3 B00001000 // маска линии sa_line3
// переменные ККД
volatile byte cntk=0; // счетчик позиций(кадров) дисплея в строке развертки
volatile byte cntl=0; // счетчик малого цикла интервала текущего кадра
volatile byte cnth=0; // счетчик большого цикла интервала текущего кадра
volatile byte lvk_mask=0; // буфер текущей маски ЛВК
volatile byte lvk_data=0; // буфер данных ЛВК за текущий цикл развертки
volatile byte lvk_dold=0; // буфер данных ЛВК за предшествующий цикл развертки
volatile byte qf_sn_press=0; // флаг наличия нажатия в текущем цикле
volatile byte qf_sn_stabl=0; // флаг наличия подтвержденных данных в lvk_dold
volatile byte qf_refram=0; // флаг запроса перезаписи информации из
// pp_ram в v_ram
byte v_ram[4]={fnt_0,fnt_1,fnt_2,fnt_3}; // массив видеопамяти текущего отображения
byte pp_ram[4]={fnt_4,fnt_5,fnt_6,fnt_7}; // массив буфера предподготовки данных
// Секция прототипов функций
void sdr_prog(); // основной обработчик регенерации ККД
//**************************************************
// Секция создания экземпляров классов
// задаем соответствие физических линий интерфейса
// и передаваемых параметров
// закрытым переменным членам класса
//***************************************************
//------------------------------------------------
//*************************************************
// Секция начальной инициализации setup
// (выполняется однократно при запуске системы)
//*************************************************
void setup() {
// put your setup code here, to run once:
// инициализация железа при подаче питания
//сегментные ключи, уровень
digitalWrite(segline_a,HIGH); digitalWrite(segline_b,HIGH);
digitalWrite(segline_c,HIGH); digitalWrite(segline_d,HIGH);
digitalWrite(segline_e,HIGH); digitalWrite(segline_f,HIGH);
digitalWrite(segline_g,HIGH); digitalWrite(segline_h,HIGH);
//сегментные ключи, режим
pinMode(segline_a,OUTPUT); pinMode(segline_b,OUTPUT);
pinMode(segline_c,OUTPUT); pinMode(segline_d,OUTPUT);
pinMode(segline_e,OUTPUT); pinMode(segline_f,OUTPUT);
pinMode(segline_g,OUTPUT); pinMode(segline_h,OUTPUT);
//анодные ключи, уровень
digitalWrite(sa_line0,LOW); digitalWrite(sa_line1,LOW);
digitalWrite(sa_line2,LOW); digitalWrite(sa_line3,LOW);
//анодные ключи, режим
pinMode(sa_line0,INPUT); pinMode(sa_line1,INPUT);
pinMode(sa_line2,INPUT); pinMode(sa_line3,INPUT);
//линия контроля ЛВК
digitalWrite(lvk_line,HIGH);
//линия контроля ЛВК, режим
pinMode(lvk_line,INPUT);
// линия выходного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, уровень
digitalWrite(sdr_clco,HIGH);
// линия выходного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, режим
pinMode(sdr_clco,OUTPUT);
// линия входного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, уровень
digitalWrite(sdr_clci,HIGH);
// линия входного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, режим
digitalWrite(sdr_clci,INPUT);
//подключение прерывания обработчика ККД
attachInterrupt(digitalPinToInterrupt(sdr_clci), sdr_prog, FALLING);
//запуск ККД
tone(sdr_clco, kkd_freq);
}
//***************************************************
// Секция основной программы (в обычном Си = main)
//***************************************************
void loop() {
// put your main code here, to run repeatedly:
}
//------------------------------------------------
//***************************************************
// ПОДВАЛ С ФУНКЦЯМИ
//***************************************************
//----------**********************----------
// прерывание по INT0 - обработчик ККД
void sdr_prog()
{
if(cntl==0)
{
switch (cnth)
{
case 0:
//do something when var equals 0
// гашение по анодам
// пауза задержки отключения силовых ключей
pinMode(sa_line0,INPUT); pinMode(sa_line1,INPUT);
pinMode(sa_line2,INPUT); pinMode(sa_line3,INPUT);
break;
case 1:
//do something when var equals 1
// загрузка текущего содержимого сегментного кода в порт вывода
// согласно содержимого ячейки массива v_ram, на которую указывает
// текущее значение cntk
digitalWrite(segline_a,bitRead(v_ram[cntk], 0));
digitalWrite(segline_b,bitRead(v_ram[cntk], 1));
digitalWrite(segline_c,bitRead(v_ram[cntk], 2));
digitalWrite(segline_d,bitRead(v_ram[cntk], 3));
digitalWrite(segline_e,bitRead(v_ram[cntk], 4));
digitalWrite(segline_f,bitRead(v_ram[cntk], 5));
digitalWrite(segline_g,bitRead(v_ram[cntk], 6));
digitalWrite(segline_h,bitRead(v_ram[cntk], 7));
// внутренний switch (cntk) для включения соответствующего анода
// и заполнения буфера маски для текущей кнопки lvk_mask
switch (cntk)
{
case 0:
//do something when var equals 0
pinMode(sa_line0,OUTPUT); lvk_mask=mask_sa0;
break;
case 1:
//do something when var equals 1
pinMode(sa_line1,OUTPUT); lvk_mask=mask_sa1;
break;
case 2:
//do something when var equals 2
pinMode(sa_line2,OUTPUT); lvk_mask=mask_sa2;
break;
case 3:
//do something when var equals 3
pinMode(sa_line3,OUTPUT); lvk_mask=mask_sa3;
break;
default:
// if nothing else matches, do the default
// default is optional
break;
}
break;
//-----------------------------------------------------------
case (hlq-1): //9 //25
//do something when var equals 25
cntk++; // счетчик позиций +1
// все дальнейшее проводится только в последнем кадре строки
if (cntk==nump)
{ cntk=0;
// анализ флага qf_refram и перезапись данных
// из pp_ram в v_ram со сбросом qf_refram=0
if (qf_refram)
{
for (byte cnt=0; cnt<=3; cnt++)
{
v_ram[cnt]=pp_ram[cnt];
}
qf_refram=0;
}
// проверка флага наличия нажатия в строке qf_sn_press
if (qf_sn_press)
{
if (lvk_dold==lvk_data)
{
qf_sn_stabl=1; // при совпадении установить
// флаг наличия подтвержденных данных
}
else
{
lvk_dold=lvk_data; // при несовпадении заместить
// содержимое в lvk_dold
qf_sn_stabl=0; // и сбросить флаг
// наличия подтвержденных данных
}
// сброс флага qf_sn_press, обнуление lvk_data и выход из проверки
qf_sn_press=0; lvk_data=0;
}
// если НЕТ (qf_sn_press=0) тогда
// qf_sn_press=0; lvk_data=0; по умолчанию (таковы при входе)
else
{
if (lvk_dold==lvk_data)
{
qf_sn_stabl=0; // сбросить флаг наличия подтвержденных данных
}
else
{
lvk_dold=lvk_data; // антидребезг статуса "все кнопки отпущены"
}
}
}
break;
default:
// if nothing else matches, do the default
// default is optional
// все остальные значения используются для опроса ЛВК
if (!digitalRead(lvk_line))
{
lvk_data = lvk_data | lvk_mask; qf_sn_press = 1;
}
break;
}
}
cntl++;
if (cntl == llq) //10
{
cntl=0; cnth++;
if (cnth == hlq) //10 //26
{
cnth=0;
}
}
}
//------------------------------------------------
//-------------конец файла/end of file---------------------
Код: Выделить всё
// ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА (режим совпадения по OCR0A)
OCR0A = 140;
TIMSK0 |= (1 << OCIE0A);Это уже из "дополнительных библиотек" (MsTimer2).
В рамки "абсолютного референса" не входит. А мне интерес на минимуме соорудить, с тем, что ВСЕГДА под когти попадает.
Настраивая прерывания на Timer 0 вы теряете:
перестают работать функции времени (delay(), millis()…), не работает генерация ШИМ на пинах D5 и D6, перестают работать все библиотеки, так или иначе завязанные на системном времени
Код: Выделить всё
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))Код: Выделить всё
unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;
// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;
return m;
}