Сб фев 04, 2023 09:30:38
Сб фев 04, 2023 10:25:46
Сб фев 04, 2023 16:00:52
Вс фев 05, 2023 11:34:24
Вс фев 05, 2023 11:45:48
Вс фев 05, 2023 11:51:22
Вс фев 05, 2023 12:27:51
Вс фев 05, 2023 12:41:03
Вс фев 05, 2023 12:45:17
Вс фев 05, 2023 13:00:33
Вт фев 07, 2023 16:24:04
Вт фев 07, 2023 18:39:02
Вт фев 07, 2023 18:59:25
Вт фев 07, 2023 19:16:25
Вт июн 06, 2023 17:50:04
Вт июн 06, 2023 18:08:58
veso74 писал(а):Объясните. Не понимал.
Вт июн 06, 2023 18:10:43
Вт июн 06, 2023 18:37:15
Вс июн 11, 2023 08:14:30
Вс сен 24, 2023 12:26:59
#define F_CPU 12000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stDIO.h>
#include <avr/iom32.h>
#include <math.h>
//#include "TM1637Display.h"
//*****************************************
//Это код от ИИ
/*
#define CLK PORTC0 // Подключите CLK к порту C0
#define DIO PORTC1 // Подключите DIO к порту C1
uint8_t digitSegments[] =
{
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
*/
//*****************************************
//**********************
//Настройка портов:
void Port_ini(void)
{
DDRC |= (1<<PORTC0)|(1<<PORTC1); //PORTC0 - CLK, PORTC1 - DIO
PORTC |= (1<<PORTC0)|(1<<PORTC1);
}
//**********************
//*****************************************
//Это код от https://www.chipmaker.ru/blogs/entry/2170/
//
void start(void) //Маркер начала посылки
{
_delay_us(100); //Пауза 100 мкс
PORTC |= (1<<PORTC0); //На выходе CLK "1"
PORTC |= (1<<PORTC1); //На выходе DIO "1"
_delay_us(100); //Пауза 100 мкс
PORTC &=~(1<<PORTC1); //На выходе DIO "0"
_delay_us(100); //Пауза 100 мкс
}
void end(void) //Маркер конца посылки
{
PORTC |= (1<<PORTC0); //На выходе CLK "1"
_delay_us(100); //Пауза 100 мкс
PORTC |= (1<<PORTC1); //На выходе DIO "1"
_delay_us(100); //Пауза 100 мкс
}
void outcom(unsigned char d) //Последовательный вывод. Выводимый байт находится в переменной "d"
{
unsigned char i = 0; //Рабочая переменная для счетчика цикла
unsigned char x = 0b00000001; //Рабочая переменная для выделения текущего передаваемого бита из байта "d"
for (i=0; i<=7; i++) //Побитно выводим байт на LED индикатор
{
PORTC &=~(1<<PORTC0); //На выходе CLK "0"
_delay_us(100); //Пауза 100 мкс
//Если текущий передаваемый бит = 1 -> установить в "1" PORTC1 (DIO), и через 100 мкс сбросить PORTC1 в "0"
if (d & x) PORTC |= (1<<PORTC1); //На выходе DIO "1"
else PORTC &=~(1<<PORTC1); //На выходе DIO "0"
_delay_us(100); //Пауза 100 мкс
PORTC |= (1<<PORTC0); //На выходе CLK "1"
_delay_us(100); //Пауза 100 мкс
x = x<<1; //Сдвигаем "x" влево на 1 бит
}
//Стоп-бит
DDRC &=~(1<<PORTC1); //PORTC1 - на вход, переключаем DIO как вход, чтобы исключить коллизию с ACK
PORTC &=~(1<<PORTC0); //На выходе CLK "0"
_delay_us(100); //Пауза 100 мкс
PORTC |= (1<<PORTC0); //На выходе CLK "1"
_delay_us(100); //Пауза 100 мкс
PORTC &=~(1<<PORTC0); //На выходе CLK "0"
PORTC &=~(1<<PORTC1); //На выходе DIO "0"
DDRC |= (1<<PORTC1); //PORTC1 - на выход, окончание стоп-бита, переключаем DIO как выход
//(Выходим с нулями на обеих шинах)
_delay_us(100); //Пауза 100 мкс
}
void incom(void) //Чтение кнопок
{
}
//
//*****************************************
//*****************************************
//Это код от ИИ
/*
void TM1637_start(void) {
DDRC |= (1<<DIO); // Установка DIO на выход
PORTC &= ~(1<<CLK); // CLK = 0
_delay_us(5); // Задержка
}
void TM1637_stop(void) {
DDRC &= ~(1<<DIO); // Установка DIO на вход
PORTC |= (1<<CLK); // CLK = 1
_delay_us(5); // Задержка
}
void TM1637_writeByte(uint8_t data) {
for(uint8_t i = 0; i < 8; i++) {
PORTC &= ~(1<<CLK); // CLK = 0
_delay_us(5); // Задержка
if(data & 0x01) { // Если бит данных равен 1
DDRC &= ~(1<<DIO); // Установка DIO на вход
} else {
DDRC |= (1<<DIO); // Установка DIO на выход
}
data >>= 1;
PORTC |= (1<<CLK); // CLK = 1
_delay_us(5); // Задержка
}
// Чтение подтверждения
DDRC &= ~(1<<DIO); // Установка DIO на вход
PORTC &= ~(1<<CLK); // CLK = 0
_delay_us(5); // Задержка
while(PINC & (1<<DIO)); // Ожидание подтверждения
PORTC |= (1<<CLK); // CLK = 1
_delay_us(5); // Задержка
}
void TM1637_displayDigit(uint8_t digit, uint8_t position) {
TM1637_start();
TM1637_writeByte(0x44); // Фиксированный адрес
TM1637_stop();
TM1637_start();
TM1637_writeByte(0xC0 | position); // Установка адреса
TM1637_writeByte(digitSegments[digit]); // Запись сегментов
TM1637_stop();
TM1637_start();
TM1637_writeByte(0x8F); // Включение дисплея
TM1637_stop();
}*/
//*****************************************
//***********
// ПРОГРАММА
//***********
int main(void)
{
//*****************************************
//Это код от ИИ
/*
// Инициализация портов
DDRC |= (1<<CLK); // Установка CLK на выход
PORTC |= (1<<CLK); // CLK = 1
// Инициализация дисплея
TM1637_start();
TM1637_writeByte(0x8F); // Включение дисплея
TM1637_stop();
// Вывод цифры 7 на позицию 0
TM1637_displayDigit(7, 0);
*/
//*****************************************
//*****************************************
//Это код от https://www.chipmaker.ru/blogs/entry/2170/
//
Port_ini(); //Конфигурация портов В/В
_delay_ms(2000); //Задержка в 2000 миллисекунд, чтобы Proteus 8 Professional корректно отобразил осциллограмму на виртуальном осциллографе
//Инициализация TM1637:
start();
outcom(0x88);
end();
_delay_us(100); //Пауза 100 мкс
//Включение режима передачи данных с автоинкрементом адреса:
start();
outcom(0x40);
end();
_delay_us(100); //Пауза 100 мкс
//Вывод сообщения "123" на табло:
start(); //Маркер начала посылки
outcom(0xC0); //Выводим начальный адрес (0хC0 - крайнее левое знакоместо)
outcom(0x06); //Выводим 1 в первый разряд
outcom(0x5b); //Выводим 2 во второй разряд
outcom(0x4f); //Выводим 3 в третий разряд
end(); //Маркер конца посылки
_delay_us(100); //Пауза 100 мкс
//
//*****************************************
while(1)
{
}
}