Вс дек 13, 2020 23:11:51
Пн дек 14, 2020 14:09:45
Пн дек 14, 2020 15:50:18
Пн дек 14, 2020 16:24:22
Пн дек 14, 2020 16:51:33
Пн дек 14, 2020 17:30:04
// отправляем в цикле по два байта в сдвиговые регистры
for(byte i = 0; i <= 3; i++){
digitalWrite(RCLK, LOW); // открываем защелку
shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]); // отправляем байт с "числом"
shiftOut(DIO, SCLK, MSBFIRST, chr[i]); // включаем разряд
digitalWrite(RCLK, HIGH); // защелкиваем регистры
delay(1); // ждем немного перед отправкой следующего "числа"
}
}
Пн янв 11, 2021 20:28:31
Пн янв 11, 2021 23:13:31
Вт янв 12, 2021 04:08:29
Вс янв 17, 2021 16:56:23
/* ATtiny13 + ( 74HC595 + ULN2803 )
Весёлый стоп-сигнал
*/
#define F_CPU 128000UL // 128 kHz clock speed
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/io.h>
#define DATA_PORT PORTB
#define DATA_DDR DDRB
#define DATA PB0 // Data pin (DS) pin location
#define CLOCK PB2 // Shift Clock (SH_CP) pin location
#define LATCH PB3 // Store Clock (ST_CP) pin location
#define BUTTON PB1 //
#define HC595DataHigh() ( DATA_PORT |= (1<<DATA) )
#define HC595DataLow() ( DATA_PORT &=(~(1<<DATA)) )
volatile uint8_t k = 0;
const uint8_t led_pattern[9] = {
0b11111111,
0b11111110,
0b11111100,
0b11111000,
0b11110000,
0b11100000,
0b11000000,
0b10000000,
0b00000000
};
//-------
void HC595Pulse(void){ // Pulse the Shift Clock
DATA_PORT |= (1<<CLOCK); // HIGH
DATA_PORT &=(~(1<<CLOCK)); // LOW
}
//-------
void HC595Latch(void){ // Pulse the Store Clock
DATA_PORT |=( 1<<LATCH ); // HIGH
_delay_ms(1);
DATA_PORT&=(~(1<<LATCH)); // LOW
_delay_ms(1);
}
//-------
void HC595Write(uint8_t data){
//Последовательная отправка каждые 8 бит
//Send each 8 bits serially
//Order is MSB first
for( uint8_t i=0; i<8; i++ ){
//Output the data on DS line according to the Value of MSB
if(data & 0b10000000) { HC595DataHigh();} //MSB is 1 so output high
else { HC595DataLow(); } //MSB is 0 so output high
HC595Pulse(); //Pulse the Clock line
data = (data<<1); //Now bring next bit at MSB position
}
//Now all 8 bits have been transferred to shift register
//Move them to output latch at one
HC595Latch();
}
//-------
void HC595Init(void){ // Initialize HC595
// Make the Data(DS), Shift clock (SH_CP), Store Clock (ST_CP) lines output
DATA_DDR|=((1<<DATA)|(1<<CLOCK)|(1<<LATCH));
HC595Write(0b00000000);
}
/* Настройка таймера */
void setupTimer0(void){
TCCR0A = TCCR0B = TCNT0 = 0;// Clear registers
OCR0A = 4;// 25 Hz (128000/((4+1)*1024))
TCCR0A |= (1 << WGM01);// CTC
//TCCR0B |= (1 << CS02) | (1 << CS00);// Prescaler 1024, перенесено в прерывания
TIMSK0 |= (1 << OCIE0A);// Output Compare Match A Interrupt Enable
}
/* Настраиваемое прерывание _П_П_П_П_П_П_ */
void setupINT0(void){
GIMSK |= (1<<INT0);
MCUCR |= (1<<ISC00); // Любое логическое изменение на INT0 генерирует запрос прерывания.
}
/* Таймер, CTC режим */
ISR( TIM0_COMPA_vect ){
k=(k>9) ? (k=0) : (k+1);
if( !(PINB & (1<<BUTTON)) ) {// Кнопка нажата
sleep_disable();// Проснуться
HC595Write( led_pattern[9-k] ); }
else { HC595Write( led_pattern[k] ); } // Кнопка отпущена
if( k==9 ){
TCCR0B = 0; // Останавливаем таймер
sleep_cpu(); // Спать!
}
}
/* Обработчик прерывания INT0 */
ISR( INT0_vect ){
TCCR0B |= (1 << CS02) | (1 << CS00);// Запускаем таймер
if( PINB & (1<<BUTTON) ){// Кнопка отпущена
k=0;
}
}
//-------
int main(void){
cli();
HC595Init();
setupINT0();
setupTimer0();
DDRB &= ~(1<<BUTTON); // вход
PORTB |= (1<<BUTTON); // подтянут
/* Отключаем не используемые функции, для экономии электроэнергии */
ADCSRA &= ~(1<<ADEN); //Disable ADC
ACSR = (1<<ACD); //Disable the analog comparator
/* Подготовка ко сну */
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Sleep Mode: Power Down
sleep_enable(); // Enable Sleep Mode
sei();
while(1){ /* */ }
}
/* ATtiny13 + ( 74HC595 + ULN2803 )
Весёлый сигнал поворотника
*/
#define F_CPU 128000UL // 128 kHz clock speed
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/sleep.h> // Режимы сна
#define DATA_PORT PORTB
#define DATA_DDR DDRB
#define DATA PB2 // Data pin (DS) pin location
#define CLOCK PB0 // Shift Clock (SH_CP) pin location
#define LATCH PB3 // Store Clock (ST_CP) pin location
#define BUTTON PB4 //
#define HC595DataHigh() ( DATA_PORT |= (1<<DATA) )
#define HC595DataLow() ( DATA_PORT &=(~(1<<DATA)) )
volatile uint8_t k = 0;
const uint8_t led_pattern[9] = {
0b11111111, // 255
0b11111110, // 254
0b11111100, // 252
0b11111000, // 248
0b11110000, // 240
0b11100000, // 224
0b11000000, // 192
0b10000000, // 128
0b00000000 // 0
};
//-------
void HC595Pulse(void){ // Pulse the Shift Clock
DATA_PORT |= (1<<CLOCK); // HIGH
DATA_PORT &=(~(1<<CLOCK)); // LOW
}
//-------
void HC595Latch(void){ // Pulse the Store Clock
DATA_PORT |=( 1<<LATCH ); // HIGH
_delay_ms(1);
DATA_PORT&=(~(1<<LATCH)); // LOW
_delay_ms(1);
}
//-------
void HC595Write(uint8_t data){
//Последовательная отправка каждые 8 бит
//Send each 8 bits serially
//Order is MSB first
for( uint8_t i=0; i<8; i++ ){
//Output the data on DS line according to the Value of MSB
if(data & 0b10000000) { HC595DataHigh();} //MSB is 1 so output high
else { HC595DataLow(); } //MSB is 0 so output high
HC595Pulse(); //Pulse the Clock line
data = (data<<1); //Now bring next bit at MSB position
}
//Now all 8 bits have been transferred to shift register
//Move them to output latch at one
HC595Latch();
}
/* Initialize HC595 */
void HC595Init(void){
// Make the Data(DS), Shift clock (SH_CP), Store Clock (ST_CP) lines output
DATA_DDR|=((1<<DATA)|(1<<CLOCK)|(1<<LATCH));
HC595Write(0b00000000);
}
/* Не настраиваемое прерывание _П_П_П_П_П_П_ по любому фронту */
void setupPCINT0(void){
GIMSK |= (1<<PCIE); // Разрешаем внешние прерывания PCINT0.
PCMSK |= (1<<BUTTON); // Разрешаем по маске прерывания.
}
/* Настройка таймера */
void setupTimer0(void){
TCCR0A = TCCR0B = TCNT0 = 0; // Clear registers
OCR0A = 4; // 25 Hz (128000/((4+1)*1024))
TCCR0A |= (1 << WGM01); // CTC
//TCCR0B |= (1 << CS02) | (1 << CS00); // Prescaler 1024, перенесено в прерывания
TIMSK0 |= (1 << OCIE0A); // Output Compare Match A Interrupt Enable
}
/* Обработчик прерывания PCINT0 */
ISR( PCINT0_vect ){
// Кнопка нажата
if( !(PINB & (1<<BUTTON)) ){
// Проснуться
sleep_disable();
// Запускаем таймер
TCCR0B |= (1 << CS02) | (1 << CS00);
} else { // Кнопка отпущена
// Останавливаем таймер
TCCR0B = 0;
HC595Write(0b00000000);
k = 0;
sleep_cpu(); // Спать!
}
}
/* Таймер, CTC режим */
ISR( TIM0_COMPA_vect ){
k=( (k>9) ? (k=0) : (k+1) );
if( k < 10 ){
HC595Write( led_pattern[9-k] );
}
}
int main(void){
cli();
HC595Init();
setupPCINT0();
setupTimer0();
PORTB|= (1 << BUTTON); //Устанавливаем pull-up режим ножки BUTTON
DDRB &= ~(1 << BUTTON); //Настраиваем ножку BUTTON в режим входа
/* Отключаем не используемые функции, для экономии электроэнергии */
ADCSRA &= ~(1<<ADEN); //Disable ADC
ACSR = (1<<ACD); //Disable the analog comparator
/* Подготовка ко сну */
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Sleep Mode: Power Down
sleep_enable(); // Enable Sleep Mode
sei(); // разрешаем прерывания
while(1){ /* здесь делать нечего */ }
}
Сб янв 23, 2021 15:25:20
void HC595Write(uint8_t data)
{
for (uint8_t mask=0x80; mask; )
{
if(data & mask) DATA=1; else DATA=0;
mask>>=1;
CLK=1; CLK=0;
}
LE=1;
LE=0;
}