Тема: Помилка в програмі
Вітаю. Потрібна допомога у виправленні коду програми. Викладач написав, що є помилки і потрібно їх виправити. В телефоні складно мені помітити, а ноутбука в даній ситуації не має.
Ось код:
1.#include <io.h>
2.#include <delay.h>
3.// LCD functions
4.#include <alcd.h>
5.#include <stdio.h>
6.
7.char lcd_buffer[16];
8.
9.//коди цифр 0--9
10.const char NUM_code[] = {0x3F,0x06,0x5B,0x4F,0x66,
11. 0x6D,0x7D,0x07,0x7F,0x6F};
12.
13.char tik,col=1; // крок і номер знакомісця
14.char ind_msg[4]; // масив кодів символів для видачі на індикатор
15.
16.// Налаштування і ініціалізація таймера-лічильника ТС2
17.void init_TC2(void)
18.{
19.// Clock source: System Clock
20.// Clock value: 16 MHz / 256
21.// Mode: Normal top=0xFF
22.// OC2 output: Disconnected
23.// Timer Period: 4 ms
24.
25.TCCR2= (1<<CS22) | (0<<CS21) | (0<<CS20); // поділка fo/256
26.TCNT2=0x00; OCR2=0x00;
27.TIMSK=1<<TOIE2; // режим переривання при переповнені ТС2
28.}
29.
30.// обробка переривання при переповнені лічільника ТС2
31.// виконання операції виводу одного байта на одне знакомісцє
32.interrupt [TIM2_OVF] void timer2_ovf_isr(void)
33.{
34. tik++; // рахуємо кроки (такти видачі)
35. if (tik>5)// мах 5 кроків (тактів)
37. { tik=0; // обнуляємо лічільник тактів
37. col=1; // повертаємось на першу позицію індикації
38. }
39. PORTD=ind_msg[tik]; // керування сегментами
40. PORTB=col; // підсвічуємо знакомісце
41. col<<=1; // переходимо на нову позицію
42.}
43.
44.// функція перевода 4-х розрядного числа в коди для індикації
45.void decode_4(int x)
46.{
47. inf_msg[3]=0; // стирання незначущих нулів
48. ind_msg[2]=0; // стирання незначущих нулів
49. ind_msg[1]=0; // стирання незначущих нулів
50. ind_msg[0]=NUM_code[x%10]; // визначення коду цифри в одиниціх
51. x/=10; // перенос значень до розряду одиниць
52. if(!x)return; // вихід як що х < 10
53. ind_msg[1]=NUM_code[x%10]; // визначення коду цифри в десятках
54. x/=10; // перенос значень до розряду одиниць
55. if(!x)return; // вихід як що х < 100
56. ind_msg[2]=NUM_code[x%10]; // визначення коду цифри в сотнях
57. x/=10;
58. if(!x)return; //вихід якщо х < 1000
59. ind_msg[3]=NUM_code[x%10]; // визначення коду цифри в тисячних
60.}
61.
62.void main(void)
63.{ int X=0;
64.// запис фіксуючих символів для тестового відображення
65. ind_msg[0]=0x1; // сегмент а
66. ind_msg[1]=0x2; // сегмент в
67. ind_msg[2]=0x4; // сегмент с
68. ind_msg[3]=0x8; // сегмент d
69.
70.// налаштування портів на видачу
71. DDRA=0xFF; // порт LCD (РКІ)
72. DDRD=0xFF; // сегменти ---> X8
73. DDRB=0xFF; // знакомісця ---> X10
74. init_TC2(); // налаштування лічильника ТС2
75. lcd_init(8); // налаштування РКІ - 8 символів в строчці
76. lcd_puts(" Test"); // тестове повідомлення
77. #asm("sei") // асемблерна команда дозволу 78.переривань-початок індикації
79. delay_ms(5000); // дивитись 5 секунд
80.
81.while (1) // вивід на екрани LCD і LED значення змінної Х
82. {
83. decode_4(X); // перевід значення X у коди символів
84. lcd_gotoxy(0,1); // первід курсора на другу строку
85. sprintf(lcd_buffer," %4d",X); //підготовка буфера 86.індикації для LCD
87. lcd_puts(lcd_buffer); // вивід буфера екрана LCD
88. delay_ms(500); // часова затримка в циклі
89. X++; if(X>9999) {X=0;} // максимальне значення Х - 9999
90. }
91.}