Сб окт 26, 2019 22:22:52
.device AT90USB162
.include "usb162def.inc"
.def tmp= r16
rjmp reset ;прерывание по сбросу
.org $0040 ;*******начало основной программы
reset:
ldi tmp,High(RAMEnd)
out sph,tmp
ldi tmp,Low(RAMEnd)
out spl,tmp
ldi tmp,0b11111111
out DDRB,tmp
ldi tmp,0b11111111
out DDRD,tmp
ldi tmp,0b01100000
out PORTD,tmp
main:
ldi r21, 1 ; выводим единицы
call decode
call delay
ldi r21, 10 ;гасим
call decode
call delay
jmp main
decode:
lsl r21
ldi zh, high(DcMatrix*2)
ldi zl, low(DcMatrix*2)
ldi tmp,0
add zl,r21
adc zh,tmp
lpm r0,z
out PORTB,r0; вывод кода индикации в порт
ret
DcMatrix:
.db 0b00111111
.db 0b00000110
.db 0b01011011
.db 0b01001111
.db 0b01100110
.db 0b01101101
.db 0b01111101
.db 0b00000111
.db 0b01111111
.db 0b01101111
.db 0b00000000
delay:
ldi r17,255
ldi r18,200
ldi r19,0
ldi r20,0
_delay: subi r17,0x1
sbci r18,0
sbci r19,0
sbci r20,0
brcc _delay
ret
Вс окт 27, 2019 00:44:39
Вс окт 27, 2019 05:02:23
.include "usb162def.inc"
.def tmp= r16
.def ZERO=R15
rjmp reset ;прерывание по сбросу
.org $0040 ;*******начало основной программы
reset:
ldi tmp,High(RAMEnd)
out sph,tmp
ldi tmp,Low(RAMEnd)
out spl,tmp
; Reset Watchdog Timer
WDR
CLR ZERO
OUT MCUSR,ZERO
; Start timed sequence
LDI R16,1<<WDCE|1<<WDE
STS WDTCSR, R16
CBR R16,1<<WDE
STS WDTCSR,R16
ldi tmp,0b11111111
out DDRB,tmp
ldi tmp,0b11111111
out DDRD,tmp
ldi tmp,0b01100000
out PORTD,tmp
main:
ldi r21, 1 ; выводим единицы
call decode
call delay
ldi r21, 10 ;гасим
call decode
call delay
jmp main
decode:
; lsl r21
ldi zh, high(DcMatrix*2)
ldi zl, low(DcMatrix*2)
; ldi tmp,0
add zl,r21
adc zh,ZERO
lpm r0,z
out PORTB,r0; вывод кода индикации в порт
ret
DcMatrix:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
.db 0b00000000,0b00000000 ;
delay:
ldi r17,255
ldi r18,200
ldi r19,0
ldi r20,0
_delay: subi r17,0x1
sbci r18,0
sbci r19,0
sbci r20,0
brcc _delay
ret
.EXIT
Пт янв 03, 2020 15:22:09
/* --------- ATiny85 --------- */
#define F_CPU 8000000UL //частота процессора 8 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "shiftreg.h"
#define Prescaler_No (1<<CS00) //No prescaling)
#define Prescaler_8 (1<<CS01)
#define Prescaler_64 (1<<CS01)|(1<<CS00)
#define Prescaler_256 (1<<CS02)
#define Prescaler_1024 (1<<CS00)|(1<<CS02);
volatile uint8_t trigger = 1;
volatile uint8_t dat = 0;
volatile uint8_t temp;
uint8_t display[4];
uint8_t digits[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00
};
SHIFTREG_register reg;
void INT0_init( void )
{
GIMSK = (1 << INT0);
MCUCR = (1 << ISC01);
};
ISR(INT0_vect)//External Interrupt
{
dat++;
};
void TIM0_COMPA_init(void ){
TCNT0 = 0; //Очищаем счетный регистр (на вcякий случай)
OCR0A = (256-1)-0;//Регистр сравнения, (256-1)-число
TCCR0A = (1<<WGM01);// Сброс при совпадении.
TIFR = (1<<OCF0A); // Регистр флагов прерываний таймера счетчика
TIMSK = (1<<OCIE0A); //Разрешение прерывания по совпадению таймера/счётчика 0A
TCCR0B = Prescaler_1024;// Делитель частоты
};
ISR(TIM0_COMPA_vect){
trigger = (trigger==0)?(1):(0);
switch (dat) {
case 0:{ display[0] = 23; break; }
case 1:{ display[0] = 55; break; }
case 2:{ display[0] = 119; break; }
case 3:{ display[0] = 247; break; }
case 4:{ display[0] = (trigger) ? (247) : (19); break;}
case 5:{ display[0] = (trigger) ? (247) : (51); break;}
case 6:{ display[0] = (trigger) ? (247) : (115); break;}
case 7:{ display[0] = 243; break; }
case 8:{ display[0] = (trigger) ? (243) : (17); break;}
case 9:{ display[0] = (trigger) ? (243) : (49); break;}
case 10:{ display[0] = (trigger) ? (243) : (113); break;}
case 11:{ display[0] = 241; break; }
case 12:{ display[0] = (trigger) ? (241) : (16); break;}
case 13:{ display[0] = (trigger) ? (241) : (48); break;}
case 14:{ display[0] = (trigger) ? (241) : (112); break;}
case 15:{ display[0] = 240; break; }
default:{ break; }
}
temp = (dat / 100) % 10;
display[3] = digits[temp];
temp = (dat / 10) % 10;
display[2] = digits[temp];
temp = dat % 10;
display[1] = digits[temp];
SHIFTREG_OutputValue( ®, display, 4 );
if( dat>15 ){ dat=0; }
};
int main(void)
{
DDRB &= ~(1 << PB2);
// ds_pin,st_cp_pin,sh_cp_pin
reg = SHIFTREG_InitRegister(&DDRB, &PORTB, PB0, PB1, PB3);
TIM0_COMPA_init();
INT0_init();
sei();
while (1) { }
return 0;
}
/*
23,55, ... 240 коды, при отправке которых в регистр 74HC595, загораются светодиоды в матрице
----------
(0) 23 ---------D0
(1) 55 ---------D0,D1
(2) 119 --------D0,D1,D2
(3) 247 --------D0,D1,D2,D3
(4) 247+19 -----D0,D1,D2,D3 + D4 (динамическая индикация)
(5) 247+51 -----D0,D1,D2,D3 + D4,D5 (динамическая индикация)
(6) 247+115 ----D0,D1,D2,D3 + D4,D5,D6 (динамическая индикация)
(7) 243 --------D0,D1,D2,D3,D4,D5,D6,D7
(8) 243+17 -----D0,D1,D2,D3,D4,D5,D6,D7 + D8 (динамическая индикация)
(9) 243+49 -----D0,D1,D2,D3,D4,D5,D6,D7 + D8,D9 (динамическая индикация)
(10) 243+113 ---D0,D1,D2,D3,D4,D5,D6,D7 + D8,D9,D10 (динамическая индикация)
(11) 241 -------D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11
(12) 241+16 ----D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11 + D12 (динамическая индикация)
(13) 241+48 ----D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11 + D12,D13 (динамическая индикация)
(14) 241+112 ---D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11 + D12,D13,D14 (динамическая индикация)
(15) 240 -------D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15
*/
Пт янв 03, 2020 19:48:30
Пт янв 03, 2020 20:13:22
Пт янв 03, 2020 21:46:57