Хочу сделать: "При нажатии кнопки 1, по стандарту выставляется число 0, если нажать ещё раз - выставится 1, потом 2. и так до числа 9. После 9 идёт 0."
На данный момент есть это:
Код:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// План работы простейшего калькулятора, умеющего считать однозначные числа //
// 1) Очистка содержимого портов //
// 2) Установка портов на нужные биты(выходы) //
// 3) При нажатии кнопки 1, по стандарту выставляется число 0, если нажать ещё раз - выставится 1, потом 2. //
// и так до числа 9. //
// 4) При выборе первой кнопкой нужного числа, пользователь нажимает вторую чтобы сохранить результат. //
// Это число сохраняется в памяти чтобы в дальнейшем его использовать. //
// 5) Повторяется пункт 3 для второго числа. //
// 6) Повторяется пункт 4 для второго числа. //
// 7) Пользователю даётся возможность выбрать число от 0 до 3. 0 - сложение, 1 - вычитание, 2 - умножение, 3 - деление. //
// 8) На "полосе" светодиодов проанимировать полосу загрузки. Типо всё так круто что он там что-то думает и считает =) //
// 9) Выдать готовый результат на табло. //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define F_CPU 16000000UL //16MHz
#include <avr/io.h>
#include <util/delay.h>
#define DIG1_PD4 4
#define DIG2_PD5 5
#define A_PD6 6
#define B_PD7 7
#define C_PB0 0
#define D_PB1 1
#define E_PB2 2
#define F_PB3 3
#define G_PB4 4
#define DELAY_MS 1000
#define BUTTON1_PD 3
#define BUTTON2_PD 2
void clean(void) {
//1. Очистка содержимого портов
PORTD |= ((1<<A_PD6)|(1<<B_PD7));
PORTB |= ((1<<C_PB0)|(1<<D_PB1)|(1<<E_PB2)|(1<<F_PB3)|(1<<G_PB4));
PORTD |= ((1<<DIG1_PD4)|(1<<DIG2_PD5)|(1<<A_PD6)|(1<<B_PD7)); //отключение битов 4-7 порта D
PORTB |= ((1<<C_PB0)|(1<<D_PB1)|(1<<E_PB2)|(1<<F_PB3)|(1<<G_PB4)); //отключение битов 0-4 порта B
PORTD = 0x00;
PORTB = 0x00;
PORTC = 0x00;
}
int main(void) {
//2. Установка портов на нужные биты(выходы)
UCSRB &=~((1<<RXEN)|(1<<THEN));//некуда было пихнуть
DDRD = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD |= ((1<<DIG1_PD4)|(1<<DIG2_PD5)|(1<<A_PD6)|(1<<B_PD7)); //выставление битов 4-7 порта D на вывод
DDRB |= ((1<<C_PB0)|(1<<D_PB1)|(1<<E_PB2)|(1<<F_PB3)|(1<<G_PB4)); //выставление битов 0-4 порта B на вывод
DDRD &= ~((1<<BUTTON1_PD)|(1<<BUTTON2_PD));
PORTD |= ((1<<BUTTON1_PD)|(1<<BUTTON2_PD));
}
// функция включения цифр от 0 до 9
void show(int digit) {
switch(digit) {
case 0: {
PORTD &= ~((1<<A_PD6)|(1<<B_PD7));
PORTB &= ~((1<<C_PB0)|(1<<D_PB1)|(1<<E_PB2)|(1<<F_PB3));
}
break;
case 1: {
PORTD &= ~(1<<B_PD7);
PORTB &= ~(1<<C_PB0);
}
break;
case 2: {
PORTD &= ~((1<<A_PD6)|(1<<B_PD7));
PORTB &= ~((1<<D_PB1)|(1<<E_PB2)|(1<<G_PB4));
}
break;
case 3: {
PORTD &= ~((1<<A_PD6)|(1<<B_PD7));
PORTB &= ~((1<<C_PB0)|(1<<D_PB1)|(1<<G_PB4));
}
break;
case 4: {
PORTD &= ~(1<<B_PD7);
PORTB &= ~((1<<C_PB0)|(1<<F_PB3)|(1<<G_PB4));
}
break;
case 5: {
PORTD &= ~(1<<A_PD6);
PORTB &= ~((1<<C_PB0)|(1<<D_PB1)|(1<<F_PB3)|(1<<G_PB4));
}
break;
case 6: {
PORTD &= ~(1<<A_PD6);
PORTB &= ~((1<<C_PB0)|(1<<D_PB1)|(1<<E_PB2)|(1<<F_PB3)|(1<<G_PB4));
}
break;
case 7: {
PORTD &= ~((1<<A_PD6)|(1<<B_PD7));
PORTB &= ~(1<<C_PB0);
}
break;
case 8: {
PORTD &= ~((1<<A_PD6)|(1<<B_PD7));
PORTB &= ~((1<<C_PB0)|(1<<D_PB1)|(1<<E_PB2)|(1<<F_PB3)|(1<<G_PB4));
}
break;
case 9: {
PORTD &= ~((1<<A_PD6)|(1<<B_PD7));
PORTB &= ~((1<<C_PB0)|(1<<D_PB1)|(1<<F_PB3)|(1<<G_PB4));
}
break;
}
}
main(void) {
while(1) {
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(0);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(1);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(2);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(3);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(4);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(5);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(6);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(7);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(8);
}
if( (PIND & 1<<BUTTON1_PD) == 0 ) {
show(9);
}
}
Не вникайте в очистку и настройку выходов. Ведь у каждого микроконтроллера по своему это делается. Меня больше интересует самая нижняя часть кода. Как поставить счётчик на show или на case. Или надо цикл поменять? Или инкремент где-то поставить?