Сообщение от
Alex
void Send8SPI(byte d){ // send 8 bit, MSB first
byte i;
CS=0;
for (i=0; i < 8; i++) {
CLK = 0;
SDA= ((d & 0x80) == 0) ? 0 : 1;
d <<= 1;
CLK=1;
}
CLK=0; SDA=0;
CS=1;
}
А как вывести например 0b010101111 такое на индикатор если в сдвиговом регистре заранее знаем какие пины подключены к индикатору и как ?
Мне главное понять как это делать..
Я так понял с Вашего кода, что он просто инициализирует SPI . Верно?
---------- Добавлено в 02:17 ---------- Предыдущее сообщение в 02:04 ----------
Сообщение от
Alex
не, кристаллы хорошие, фирма говеная
слишком часто меняет кристаллы не предупредив, снимают с производства. а их внедренцы да продавцы - вруны паталогические.
Я тоже это заметил=)
Кстати по поводу пиков.. Пришлось мне работать с микроконтроллером PIC10F200
в корпусе SOT23.6 прошивал накидая провода на дорожки программатором Тритон и когда прошивал третий МК припаял шлейф шиворот на выворот
и соответственно пытался як щирий Украинець=))) раз десять запрограммировать этот чип... не получилось. Но после устранения косяка, микроконтроллер нормально запрограммировался и отлично работает.
А программа к тритону Выдала последний раз ошибку "сработала защита по питанию" при такой ошибке атмелы уже умирали....
---------- Добавлено в 03:46 ---------- Предыдущее сообщение в 02:17 ----------
А как мне правильно оформить управление меню 1?
Мне нужно чтоб при выборе 1,2 или три в меню 1 выводило PORTF. 2 . 3 и 4 соответственно единици...
пробовал по всякому только так компилятор не ругается, но реально программа не работает так как я хочу
void menu_show_1() {
led_buff[0]=led_table[20];
led_buff[1]=led_table[0];
led_buff[2]=led_table[21];
led_buff[3]=led_table[12];
led_buff[4]=led_table[11];
led_buff[5]=led_table[temp1];
if (temp1==1){
PORTF = (1<<2);
PORTF = (0<<3);
PORTF = (0<<4);
}
if (temp1==2) {
PORTF = (0<<2);
PORTF = (1<<3);
PORTF = (0<<4);
}
if (temp1==3) {
PORTF = (0<<2);
PORTF = (0<<3);
PORTF = (1<<4);
}
}
void menu_act_1() {
if (BTN_MENU==0) {
menu=3;
while (BTN_MENU==0);
}
if (BTN_PLUS==0) {
if (temp1<3) temp1++; else temp1=1;
while (BTN_PLUS==0);
}
if (BTN_MINUS==0) {
if (temp1>1) temp1--; else temp1=3;
while (BTN_MINUS==0);
}
}
//--------------- END MENU 2 --------------------
---------- Добавлено в 03:48 ---------- Предыдущее сообщение в 03:46 ----------
А так впринципе уже за 3часа клацанья в компиляторе, все проблемы порешал, осталось только меню и регулировку громкости сделать и все =)
---------- Добавлено в 03:49 ---------- Предыдущее сообщение в 03:48 ----------
и потом париться с устройством в железе...
---------- Добавлено в 04:15 ---------- Предыдущее сообщение в 03:49 ----------
Получилось настроить меню=)
так только работает:
void menu_act_1() {
if (BTN_MENU==0) {
menu=3;
while (BTN_MENU==0);
}
if (BTN_PLUS==0) {
if (temp1<3) temp1++; else temp1=1;
while (BTN_PLUS==0);
}
if (BTN_MINUS==0) {
if (temp1>1) temp1--; else temp1=3;
while (BTN_MINUS==0);
}
if (temp1==1){
//PORTF = 0b00000100;
PORTF = (0<<3);
PORTF = (0<<4);
PORTF = (1<<2);
}
if (temp1==2) {
//PORTF = 0b00001000;
PORTF = (0<<2);
PORTF = (0<<4);
PORTF = (1<<3);
}
if (temp1==3) {
//PORTF = 0b00010000;
PORTF = (0<<2);
PORTF = (0<<3);
PORTF = (1<<4);
}
}
//--------------- END MENU 2 --------------------
Нужно сначала обнулять биты а потом устанавливать.
Теперь проблема...
после отключения устройства и последующем включении не сохраняется конфигурация пинов Порта F ...
востанавливается только после того как я зайду опять в меню
Как сделать чтоб сохраняло конфигурацию?
Еще одну переменную EEP_Temp создать?
---------- Добавлено в 04:19 ---------- Предыдущее сообщение в 04:15 ----------
Вот исходник который более мение работает в симуляторе.
Код:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : Pocessor amplifier
Version : 1.0
Date : 13.02.2011
Author : Ugrimov
Company : UAA
Comments:
Chip type : ATmega128
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
#include <mega128.h>
#include <m8_128.h>
//#include <mega128_bits.h>
//#include <STDIO.H>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS1820 8
// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds1820_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds1820_rom_codes[MAX_DS1820][9];
//*****************************************
#include "delay.h"
#define EPP_SING 0x5a
#define LED_DIG_COUNT 6
#define LED_DOT_MASK 0x7f
#define BTN_PLUS PINE.2
#define BTN_MENU PINE.3
#define BTN_MINUS PINE.4
#define BTN_MUTE PINE.5
#define BTN_ERROR0 PINA.7 // опрос входов ошибок
#define BTN_ERROR1 PINA.2
#define BTN_ERROR2 PINA.3
#define BTN_ERROR3 PINA.4
#define BTN_ERROR4 PINA.5
#define BTN_ERROR5 PINA.6 // сброс защиты
typedef unsigned char byte;
//--------------- 0-9 10 ........... 18 символов
//Символы для LED (0-9, ,-,t,L,A,r,d,b,DP)
flash byte led_table[23]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x87,0xC7,0x88,0xAF,0xA1,0x83,0x7F,0x8C,0xC6,0xC1,0x86};
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// [] - t L A r d b Dp P C U E
byte menu=0; //Индек меню
byte menu_tmr=0;
byte menu_tmr2=0;
byte menu_tmr3=0; //Счетчик в меню
byte led_dig=0; //Отображаемый разряд LED
byte led_buff[LED_DIG_COUNT]; //Буфер дял LED
byte temp1; //обьявление переменных
byte temp2;
byte temp3;
eeprom byte epp_sing=EPP_SING; //Сигнатура корректности еепром
eeprom byte epp_temp1=1;//Загрузка значения в Еепром
eeprom byte epp_temp2=1;
eeprom byte epp_temp3=1;
void epp_load() { //Загрузка данных с еепром
if (epp_sing==EPP_SING) { //Если сигнатура прявельнаяб читаем данные с еепром
temp1=epp_temp1; // загрузка из еепром при выходе из меню
temp2=epp_temp2;
temp3=epp_temp3;
}else{
temp1=1; // если сигнатура битая
temp2=1; // грузим единици.
temp3=1;
}
}
void epp_save() { //Сохранение данных в еепром
epp_temp1=temp1; // Запись данных темп в Еепром
epp_temp2=temp2;
epp_temp3=temp3;
epp_sing=EPP_SING;// сигнатура соответствия Еепром
}
void clear_leds() { //функция очистки лед.
byte i; // переменная
for (i=0;i<LED_DIG_COUNT;i++) led_buff[i]=led_table[10]; //прибавляем единицу гоняем пустой знак по дисплею
}
//-----------------ERROR CHANEL---------------------
// отображение активных ошибок
// и блокировка работы реле
void error_5 () {
if (BTN_ERROR1==0){
led_buff[0]=led_table[22]; //Заполняем буфер разрядов
led_buff[1]=led_table[15]; // индикация Error ток выхода
led_buff[2]=led_table[15];
led_buff[3]=led_table[20];
led_buff[4]=led_table[11];
led_buff[5]=led_table[0];
menu=5;
}
if (PINE.6==0){ // сброс защиты
menu=0;
while (PINE.6==0) ;
}
}
void error_6 () {
if (BTN_ERROR2==0){
led_buff[0]=led_table[22]; //Заполняем буфер разрядов
led_buff[1]=led_table[15]; // индикация ошибки Error напряжение входа
led_buff[2]=led_table[15];
led_buff[3]=led_table[21];
led_buff[4]=led_table[11];
led_buff[5]=led_table[1];
//PORTF ^= 0b00000110;
menu=5;
}
if (PINE.6==0){ // сброс защиты
menu=0;
while (PINE.6==0) ;
}
}
void error_7 () {
if (BTN_ERROR3==0){
led_buff[0]=led_table[22]; //Заполняем буфер разрядов
led_buff[1]=led_table[15]; // индикация ошибки Error напряжение выхода
led_buff[2]=led_table[15];
led_buff[3]=led_table[21];
led_buff[4]=led_table[11];
led_buff[5]=led_table[0];
//PORTF ^= 0b00000110;
//menu=5;
}
if (PINE.6==0){ // сброс защиты
menu=0;
while (PINE.6==0) ;
}
}
void error_8 () {
if (BTN_ERROR4==0){
led_buff[0]=led_table[22]; //Заполняем буфер разрядов
led_buff[1]=led_table[15]; // индикация ошибки Error напряжение питания
led_buff[2]=led_table[15];
led_buff[3]=led_table[21];
led_buff[4]=led_table[11];
led_buff[5]=led_table[19];
menu=5;
}
if (PINE.6==0){ // сброс защиты
menu=0;
while (PINE.6==0) ;
}
}
void error_9 () {
if (BTN_ERROR5==0){
led_buff[0]=led_table[22]; //Заполняем буфер разрядов
led_buff[1]=led_table[15]; // индикация ошибки Error нагрузка выхода
led_buff[2]=led_table[15];
led_buff[3]=led_table[13];
led_buff[4]=led_table[11];
led_buff[5]=led_table[0];
//PORTF ^= 0b00000110; // изменить два бита порта F
menu=5;
}
if (PINE.6==0){ // сброс защиты
menu=0;
while (PINE.6==0) ;
}
}
// индикация ошибки
void led_error () {
if (menu_tmr3==4) {
PORTB.1 = 1;
//PORTB |= (1 << 1); // установить бит 4 порта F
}
if (menu_tmr3==5) {
PORTB.1 = 1;
//PORTB |= (1 << 1);
}
if (menu_tmr3==6) {
PORTB.1 = 1;
//PORTB |= (1 << 1);
}
if (menu_tmr3==7) {
PORTB.1 = 1;
//PORTB |= (1 << 1);
}
else {
PORTB.1 = 0;
//PORTB ^= (1 << 1); // изменить бит 4 порта F
}
}
//---------------END ERROR-----------------------
//-----------------READY-------------------------
// мигалка - это индикация о нормальной работе микроконтроллера
void menu_shou_5 () {
if (menu_tmr3==5) {
PORTB.0 = 1;
}
if (menu_tmr3==6) {
PORTB.0 = 1;
}
if (menu_tmr3==7) {
PORTB.0 = 1;
}
else {
PORTB.0 = 0;
}
}
//---------------END READY-----------------------
//-----------------LOAD--------------------------
void menu_show_4 () {
// индикация загрузки и управление реле
if (menu_tmr2==3) { //если таймер достиг.... вывести на индикатор следующее...
led_buff[0]=led_table[10]; //Заполняем буфер разрядов
led_buff[1]=led_table[10]; // индикация пустого меню
led_buff[2]=led_table[10];
led_buff[3]=led_table[10];
led_buff[4]=led_table[10];
led_buff[5]=led_table[10];
PORTB.2=1;
}
if (menu_tmr2==5) { //если таймер достиг.... вывести на индикатор следующее...
led_buff[0]=led_table[10]; //Заполняем буфер разрядов
led_buff[1]=led_table[10]; //индикация пустого меню
led_buff[2]=led_table[10];
led_buff[3]=led_table[10];
led_buff[4]=led_table[10];
led_buff[5]=led_table[10];
PORTB.3=1;
}
if (menu_tmr2==8) { //если таймер достиг.... вывести на индикатор следующее...
led_buff[0]=led_table[10]; //Заполняем буфер разрядов
led_buff[1]=led_table[10]; //индикация пустого меню
led_buff[2]=led_table[10];
led_buff[3]=led_table[10];
led_buff[4]=led_table[10];
led_buff[5]=led_table[10];
PORTB.4=1;
}
else {
led_buff[0]=led_table[13]; //индикация LOAD
led_buff[1]=led_table[0];
led_buff[2]=led_table[14];
led_buff[3]=led_table[16];
led_buff[4]=led_table[10];
led_buff[5]=led_table[10];
} // таймер отсчитывает за секунду примерно 20 значений tmr2
}
// при достижении таймера заданого значения перейти в следующее (рабочее) меню
void menu_act_4 () {
if (menu_tmr2==9) {
menu=1;
}
}
//-----------------END---------------------------
//----------------- MENU 1 ----------------------
void menu_show_0 () {
{ // режим работа ЕРР
led_buff[0]=led_table[14];
led_buff[1]=led_table[19];
led_buff[2]=led_table[19];
led_buff[3]=led_table[10];
led_buff[4]=led_table[10];
led_buff[5]=led_table[10];
} // режим тишина индикация
if (PORTE & 0b10000000) { //если на 4пине лог.1 вывести на индикатор следующее...
led_buff[0]=led_table[21]; //Заполняем буфер разрядов
led_buff[1]=led_table[12]; // отображение режима тишина
led_buff[2]=led_table[22];
led_buff[3]=led_table[14];
led_buff[4]=led_table[10];
led_buff[5]=led_table[10];
}
}
void menu_act_0() {
if (BTN_MENU==0) { //Если кнопка нажата
menu=2; //Переходим к меню 1
while (BTN_ERROR0==0); //Ждем пока отпустят кнопку
}
if (BTN_MUTE==0) { // режим тишина,
PORTE.7 = ~PORTE.7;
while (BTN_MUTE==0);
}
if (BTN_ERROR0==0) { // опрос входов ошибок
menu=5;
}
if (BTN_ERROR1==0) {
menu=6;
}
if (BTN_ERROR2==0) {
menu=7;
}
if (BTN_ERROR3==0) {
menu=8;
}
if (BTN_ERROR4==0) {
menu=9;
}
}
//--------------- END MENU 1 --------------------
//----------------- MENU 2 ----------------------
void menu_show_1() {
led_buff[0]=led_table[20];
led_buff[1]=led_table[0];
led_buff[2]=led_table[21];
led_buff[3]=led_table[12];
led_buff[4]=led_table[11];
led_buff[5]=led_table[temp1];
/*if (temp1==1){
PORTF = 0b00000100;
//PORTF = (0<<3);
//PORTF = (0<<4);
}
if (temp1==2) {
PORTF = 0b00001000;
//PORTF = (1<<3);
//PORTF = (0<<4);
}
if (temp1==3) {
PORTF = 0b00010000;
//PORTF = (0<<3);
//PORTF = (1<<4);
} */
}
void menu_act_1() {
if (BTN_MENU==0) {
menu=3;
while (BTN_MENU==0);
}
if (BTN_PLUS==0) {
if (temp1<3) temp1++; else temp1=1;
while (BTN_PLUS==0);
}
if (BTN_MINUS==0) {
if (temp1>1) temp1--; else temp1=3;
while (BTN_MINUS==0);
}
if (temp1==1){
//PORTF = 0b00000100;
PORTF = (0<<3);
PORTF = (0<<4);
PORTF = (1<<2);
}
if (temp1==2) {
//PORTF = 0b00001000;
PORTF = (0<<2);
PORTF = (0<<4);
PORTF = (1<<3);
}
if (temp1==3) {
//PORTF = 0b00010000;
PORTF = (0<<2);
PORTF = (0<<3);
PORTF = (1<<4);
}
}
//--------------- END MENU 2 --------------------
//----------------- MENU 3 ----------------------
void menu_show_2() {
led_buff[0]=led_table[19];
led_buff[1]=led_table[15];
led_buff[2]=led_table[0];
led_buff[3]=led_table[12];
led_buff[4]=led_table[11];
led_buff[5]=led_table[temp2];
}
void menu_act_2() {
if (BTN_MENU==0) {
menu=4;
while (BTN_MENU==0);
}
if (BTN_PLUS==0) {
if (temp2<3) temp2++; else temp2=1;
while (BTN_PLUS==0);
}
if (BTN_MINUS==0) {
if (temp2>1) temp2--; else temp2=3;
while (BTN_MINUS==0);
}
}
//--------------- END MENU 3 --------------------
//----------------- MENU 4 ----------------------
void menu_show_3() {
led_buff[0]=led_table[12];
led_buff[1]=led_table[3];
led_buff[2]=led_table[10];
led_buff[3]=led_table[temp3];
led_buff[4]=led_table[10];
led_buff[5]=led_table[10];
}
void menu_act_3() {
if (BTN_MENU==0) {
menu=1;
epp_save(); //Сохраняем в еепром
while (BTN_MENU==0);
}
if (BTN_PLUS==0) {
if (temp3<4) temp3++; else temp3=1;
while (BTN_PLUS==0);
}
if (BTN_MINUS==0) {
if (temp3>1) temp3--; else temp3=4;
while (BTN_MINUS==0);
}
}
//--------------- END MENU --------------------
void menu_show() { //Список вывода на LED, в зависимости от меню
switch (menu) {
case 0:menu_show_4();break;
case 1:menu_show_0();break;
case 2:menu_show_1();break;
case 3:menu_show_2();break;
case 4:menu_show_3();break;
case 5:led_error();break;
}
}
void menu_act() { //Список обработки кнопок, в зависимости от меню
switch (menu) {
case 0:menu_act_4();break;
case 1:menu_act_0();break;
case 2:menu_act_1();break;
case 3:menu_act_2();break;
case 4:menu_act_3();break;
}
}
interrupt [TIM0_OVF] void timer0_ovf_isr() {
PORTC&=0xc0; //Отключаем все разряды LED
PORTD=led_buff[led_dig]; //Загружаем в порт данные текущего разряда
PORTC|=1<<led_dig; //Отображаем нужный разряд
led_dig++; //Счетчик разрядов
if (led_dig>(LED_DIG_COUNT-1)) led_dig=0;
}
//*****************************************
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTA=0b11111101;
DDRA=0b00000010;
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTD=0xFF;
DDRD=0xFF;
// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTE=0b01111111;
DDRE=0b10000000;
// Port F initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTF=0x00;
DDRF=0xFF;
// Port G initialization
// Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State4=0 State3=0 State2=0 State1=0 State0=0
PORTG=0x00;
DDRG=0x1F;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCNT0=0xFD;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=2;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ETIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// SPI initialization
// SPI Type: Slave
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
//SPCR=0x40;
//SPSR=0x00;
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);
epp_load(); //Загружаем данные с еепром
clear_leds();
#asm("sei") //Разрешаем все прерывания
TCCR0=2; // вкл. таймер 0
while (1)
{
menu_act(); //Опрашиваем кнопки меню
menu_show(); //Отображаем меню
error_5 ();
error_6 ();
error_7 ();
error_8 ();
error_9 ();
delay_ms(50);
menu_shou_5 (); //Пауза для опроса кнопок и отображения меню, 20 раз в секунду
menu_tmr++; //Считает до 20 примерно за 1 секунду
if (menu_tmr>100) menu_tmr=0;
menu_tmr2++; // считает до 10
if (menu_tmr2>10) menu_tmr2=0;
menu_tmr3++;
if (menu_tmr3>15) menu_tmr3=0;
};
}
Социальные закладки