Atmega8515 делаем игровые автоматы (казино) на языке С в MPLab X

На основе предыдущей записи:

“микроник.рус/7491/”

Ниже Вы сможете скачать hex, с файлы для прошивки Atmega8515.

Программу писал в MPLab X 5.35 и компилятор MPlab XC8 версии 2.10, как установить её на Linux смотрите здесь:

Скачать MPLAB X v5.35 + MPLAB XC8 можно здесь:
“https://web.archive.org/web/20200724202813/https://www.microchip.com/development-tools/pic-and-dspic-downloads-archive”

“rutube.ru/video/eb28c94503b777a0a6ffc61dc9a5b3ed/”

1. Учимся мигать светодиодом:

Теперь давайте создадим игровой автомат из казино на Atmega8515 – сделаем пока простое устройство из 6 светодиодов (два ряда по 3 светодиода) и кнопки – нужно зажечь светодиоды так, чтобы они были в одном ряду – как на автомате “однорукий бандит”.

Вот схема устройства:

То есть 3 зелёных светодиода подключены к ножкам PC0 PC1 PC2, остальные 3 жёлтых светодиода к ножкам PA0 PA2 PA3, кнопка подключена к ножке PD2.

Вот код устройства на языке С:



#include <xc.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define F_CPU 1000000UL // 1 MHz clock speed
 
int main(void)
{
PORTC=0xFF;
DDRC=0xFF; 

PORTA=0xFF;
DDRA=0xFF; 

DDRD = 0b0000110;  // ????????????? ????? ????? PA1 2 - ??? ????
PORTD |= ( 1 << 1 ); // ?????????? ? PA1 ????????????? ???????? ?? ???? ???????
PORTD |= ( 1 << 2 ); // ?????????? ? PA2 ????????????? ???????? ?? ???? ???????
char in = 1;  // ????????? ?????????? in ? ?????????? ? ??? ????? 1
char ip = 0; // ????????? ?????????? in ? ?????????? ? ??? ????? 0 - ????? ?????????? ????? ?????? ????????
 
while (ip==0)
      {
      PORTC = 0b0000001; 
      _delay_ms(100);
      
            if (!(PIND & (1<<PIND2)) && in == 1 )    /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
         {
in = 0;    // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1;    // ?????? ?????? ??????
_delay_ms(100);    // 2. ???????? 100??. ???????? ????????? ???????? ?????????
          }
   // ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0)    /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1;    // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100); 
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
      
   
      
      PORTC = 0b0000010; 
      _delay_ms(100);
      
        if (!(PIND & (1<<PIND2)) && in == 1 )    /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
         {
in = 0;    // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1;    // ?????? ?????? ??????
_delay_ms(100);    // 2. ???????? 100??. ???????? ????????? ???????? ?????????
          }
   // ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0)    /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1;    // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100); 
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
      
      
      
      
      PORTC = 0b0000100; 
      _delay_ms(100);
      
        if (!(PIND & (1<<PIND2)) && in == 1 )    /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
         {
in = 0;    // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1;    // ?????? ?????? ??????
_delay_ms(100);    // 2. ???????? 100??. ???????? ????????? ???????? ?????????
          }
   // ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0)    /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1;    // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100); 
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
      
}

while (ip==1)
{      
      PORTA = 0b0000001; 
      _delay_ms(100);
      
        if (!(PIND & (1<<PIND2)) && in == 1 )    /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
         {
in = 0;    // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 2;    // ?????? ?????? ??????
_delay_ms(100);    // 2. ???????? 100??. ???????? ????????? ???????? ?????????
          }
   // ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0)    /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1;    // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100); 
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
      
      
      
      PORTA = 0b0000100; 
      _delay_ms(100);
      
      
        if (!(PIND & (1<<PIND2)) && in == 1 )    /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
         {
in = 0;    // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 2;    // ?????? ?????? ??????
_delay_ms(100);    // 2. ???????? 100??. ???????? ????????? ???????? ?????????
          }
   // ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0)    /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1;    // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100);  
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
      
      
      
      PORTA = 0b0001000;  
      _delay_ms(100);
      
  if (!(PIND & (1<<PIND2)) && in == 1 )    /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
         {
in = 0;    // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 2;    // ?????? ?????? ??????
_delay_ms(100);    // 2. ???????? 100??. ???????? ????????? ???????? ?????????
          }
   // ?????? ???? ???????, ????? ????? ????? ????????:
if (PIND & (1 << PIND2) && in == 0)    /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1;    // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100); 
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}
      
      }

}

Скачать hex файл и файл с можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве

Видео, работы устройства:

“rutube.ru/video/1585e9eeb53b12e11a952c474569898b/”

Теперь увеличим количество светодиодов, первое, что сделаю – перекину кнопку на ножку PB2:

DDRB |= ( 1 << 2 );
PORTB |= ( 1 << 2 ); 

И нужно заменить проверку нажатия кнопки соответственно на PB2:

if (!(PINB & (1<<PINB2)) && in == 1 )    /* ???? PB1 ???? ????? ???? ? ???????? in ??? ???? = 1, ?? ?? ??????? ????????? ?????? ?? ?????, ?. ?. ??????? ?? 1 ? 0 */
         {
in = 0;    // 1. ????? ???? ??????? ???????? ??????? ???? ????? ????
ip = 1;    // ?????? ?????? ??????
_delay_ms(100);    // 2. ???????? 100??. ???????? ????????? ???????? ?????????
          }
   // ?????? ???? ???????, ????? ????? ????? ????????:
if (PINB & (1 << PINB2) && in == 0)    /* ???? PB1 ???? ????? ??????? ? in = 0,
?? ?? ??????? ?? ????? ?????????? ??????, ?. ?. ??????? ?? 0 ? 1 */
{
in = 1;    // ? ???? ?????? ??????? ???????? ??????? ???? ????? ????
_delay_ms(100); 
break;
/* ???????? 100?? - ????? ???? ????????? ????????,
?????? ?????? ? ?????? ?????????? ?????? ?????? ?? ????? */
}

Вот код – скачать си файл:
Скачать си файл в tar.gz архиве.
Скачать си файл в zip архиве.

Подключил 12 светодиодов (3 ряда по 4 светодиода).

Видео:

“rutube.ru/video/bf95adf6879527e6e31e735f22672313/”

Скачать hex файл и файл с для 12 светодиодов можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве

————————————–

Добавил световой эффект “змейки” по кругу при зажигании трёх светодиодов в одном ряду, как в казино!!!

Скачать hex файл и файл с для 12 светодиодов можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве

Добавил переменные, при их равенстве срабатывает выигрышная подсветка!

—————————————

Немного замедлил мигание светодиодов (для тестирования устройства – самое то), добавив код задержки перед зажиганием светодиодов – результат мне понравился – стабильная работа устройства:

Скачать hex файл и файл с для 12 светодиодов можно ниже:
– скачать в tar.gz архиве
– скачать в zip архиве

————————————-

Сделал прототип устройства – упаковал в коробку из под конфет:

Сделал выходы под + и -, а также под перепрограммирование: reset, sck, miso и mosi, а также перемычку – отключающую светодиоды при перепрограммировании.

———————————————-

Чтобы перезапустить игру – нужно выключить и включить его заново. Можно поставить перезапуск на кнопку, а также добавить музыку…

Добавить комментарий