반응형

/* Atmega128 mtx128-s2보드와 ds3231 rtc모듈, char LCD wc0802C 제품으로 시계를 만들었다.

기능들을 함수로 빼놓았기 때문에 나중에 회로도와 핀맵만 맞는다면 사용할 수 있다.

회로도 그리기 너무 귀찮다아아

*/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/*
 * char_lcd.c
 *
 * Created: 2019-01-21 오후 4:25:21
 * Author : admin
 */
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include <stdio.h>
 
#define PORT_DATA PORTD
#define PORT_CONTROL PORTC
#define DDR_DATA DDRD
#define DDR_CONTROL DDRC
 
#define RS_PIN 0
#define RW_PIN 1
#define E_PIN 2
 
#define COMMAND_CLEAR_DISPLAY 0x01
#define COMMAND_8_BIT_MODE 0x38
#define COMMAND_4_BIT_MODE 0x28
 
#define COMMAND_DISPLAY_ON_OFF_BIT 2
#define COMMAND_CURSOR_ON_OFF_BIT 1
#define COMMAND_BLINK_ON_OFF_BIT 0
 
extern uint8_t MODE;
 
void LCD_Pulse_enable();
void LCD_write_data(uint8_t data);
void LCD_write_command(uint8_t command);
void LCD_clear();
void LCD_init();
void LCD_write_string(char *string);
void LCD_goto_XY(uint8_t row, uint8_t col);
//////////////////////////////////////////////////////////
 
void LCD_Pulse_enable(){
    PORT_CONTROL |= (1<<E_PIN);
    _delay_us(1);
    PORT_CONTROL &= ~(1<<E_PIN);
    _delay_us(1);
}
void LCD_write_data(uint8_t data){
    PORT_CONTROL |= (1<<RS_PIN);
    if(MODE == 8){
        PORT_DATA = data;
        LCD_Pulse_enable();
    }
    else{
        PORT_DATA = data& 0xf0;
        LCD_Pulse_enable();
        PORT_DATA = (data<<4)&0xf0;
        LCD_Pulse_enable();
    }
    _delay_ms(2);
}
void LCD_write_command(uint8_t command){
    PORT_CONTROL&= ~(1<<RS_PIN);
    
    if(MODE ==8){
        PORT_DATA =command;
        LCD_Pulse_enable();
    }
    else {
        PORT_DATA = command & 0xf0;
        LCD_Pulse_enable();
        PORT_DATA = (command <<4& 0xf0;
        LCD_Pulse_enable();
    }
    _delay_ms(2);
}
void LCD_clear(){
    LCD_write_command(COMMAND_CLEAR_DISPLAY);
    _delay_ms(2);
}
void LCD_init(){
    _delay_ms(50);
    if(MODE == 8){
        DDR_DATA =0xff;
    }
    else DDR_DATA |= 0xf0;
    PORT_DATA = 0x00;
    DDR_CONTROL |= (1<<RS_PIN)|(1<<RW_PIN)|(1<<E_PIN);
    
    PORT_CONTROL &= ~(1<<RW_PIN);
    
    if(MODE == 8){
        LCD_write_command(COMMAND_8_BIT_MODE);
    }
    else{
        LCD_write_command(0x02);
        LCD_write_command(COMMAND_4_BIT_MODE);
    }
    
    uint8_t command = 0x08|(1<<COMMAND_DISPLAY_ON_OFF_BIT);
    LCD_write_command(command);
    
    LCD_clear();
    
    LCD_write_command(0x06);
}
void LCD_write_string(char *string){
    uint8_t i;
    for(i=0;string[i];i++){
        LCD_write_data(string[i]);
    }
}
void LCD_goto_XY(uint8_t row, uint8_t col){
    col %=16;
    row%=2;
    
    uint8_t address = (0x40*row)+col;
    uint8_t command =0x80+address;
    
    LCD_write_command(command);
}
 
uint8_t MODE = 4;
 
#define I2C_SCL PD0
#define I2C_SDA PD1
 
unsigned int sec, min, hour, day, month, year, week;
 
 
void uartInit(long buadrate)
{
    UCSR0A = 0x00// ready flag clear
    UCSR0B = 0x18// rx, tx enable
    UCSR0C = 0x06// tx data len : 8bit
    UBRR0H = 0;
    switch(buadrate){
        case 115200:
        UBRR0L = 8;
        break;
        
        case 57600:
        UBRR0L = 16;
        break;
        
        case 38400:
        UBRR0L = 25;
        break;
        
        case 19200:
        UBRR0L = 51;
        break;
        
        case 14400:
        UBRR0L = 68;
        break;
        
        case 9600:
        UBRR0L = 103;
        break;
        
        // Default 19200
        default:
        UBRR0L = 51;
        break;
    }
}
void send_data(unsigned char data)
{
    while(!(UCSR0A&0x20)); // 송신데이터를 받을 준비가 될때까지 대기
    UDR0 = data;
}
void SendLine(char *string)
{
    while(*string != '\0')
    {
        send_data(*string);
        string++;
    }
}
 
void init_i2c(){
    DDRD |= (1<<I2C_SCL);
    DDRD |= (1<<I2C_SDA);
    
    TWBR = 32// 200khz
}
void i2c_start(){
    TWCR = (1<< TWINT)|(1<<TWSTA)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT))); // 시작완료 대기
}
void i2c_transmit(uint8_t data){
    TWDR = data;
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    while(!(TWCR&(1<<TWINT))); // 전송완료 대기
}
uint8_t i2c_receive_ACK(){
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    while(!(TWCR&(1<<TWINT)));
    return TWDR;
}
uint8_t i2c_receive_NACK(){
    TWCR = (1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT))); // 수신완료 대기
    return TWDR;
}
void i2c_stop(){
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
    _delay_us(100);
}
 
uint8_t bcd_to_decimal(uint8_t bcd){
    return (bcd>>4*10 +(bcd&0x0f);
}
uint8_t decimal_to_bcd(uint8_t decimal){
    return (((decimal/10)<<4)|(decimal%10));
}
 
int main(void)
{    
    LCD_init();
    char lcd_buff[100];
    init_i2c();
    
    sec = min = hour = day = month = year = week= 0;
    char str[1000];
    
    uint8_t address = 0x68;
    // 초 분 시 요일 일 월 연
    uint8_t date[] = {0,10,12,2,10,10,19};
    
    
    i2c_start();
    i2c_transmit(address <<1);
    i2c_transmit(0);
    for (int i =0; i<7;i++){
        i2c_transmit(decimal_to_bcd(date[i]));
    }
    i2c_stop();
    DDRA = 0xff;
    PORTA = 0x00;
    
    while (1
    {
        i2c_start();
        i2c_transmit(address <<1);
        i2c_transmit(0);
        i2c_stop();
        
        i2c_start();
        i2c_transmit((address<<1)+1);
        
        sec = bcd_to_decimal(i2c_receive_ACK());
        min = bcd_to_decimal(i2c_receive_ACK());
        hour = bcd_to_decimal(i2c_receive_ACK());
        week = bcd_to_decimal(i2c_receive_ACK());
        day = bcd_to_decimal(i2c_receive_ACK());
        month = bcd_to_decimal(i2c_receive_ACK());
        year = bcd_to_decimal(i2c_receive_NACK());
        
        i2c_stop();
        
        LCD_goto_XY(0,0);
        sprintf(lcd_buff,"%d/%d/%d",year,month,day);
        LCD_write_string(lcd_buff);
        LCD_goto_XY(1,0);
        sprintf(str,"%d:%d:%d",hour,min,sec);
        LCD_write_string(str);
        
        /* LCD example
        LCD_goto_XY(1,1);
        LCD_write_string("hi");
        */
        
        //sprintf(lcd_buff,"%d/%d/%d",year,month,day);
        //sprintf (str, "%d sec, %d min, %d hour, %d week, %d day, %d month, %d year\r\n",sec,min,hour,week,day,month,year);
        //sprintf(str,"%d sec\r\n",sec);
        
    }
    return 0;
}
cs


반응형
반응형

Atmega8a 

8MHz Ext.OSC



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Study_Atmega8A.c
 *
 * Created: 2018-12-18 오후 10:30:25
 * Author : HeungSik
 */ 
 
#include <avr/io.h>
#define F_CPU 8000000
#define FOSC 8000000
#include <util/delay.h>
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
 
void init_serial();
void USART_Transmit(unsigned char data);
unsigned char USART_Receive( void );
 
void init_serial(unsigned int ubrr){
    UBRRH = (unsigned char)(ubrr >>8);
    UBRRL = (unsigned char)ubrr;
    //UBRRL = 25;
    /* Enable receiver and transmitter */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */
    UDR = data;
}
unsigned char USART_Receive( void )
{
    /* Wait for data to be received */
    while ( !(UCSRA & (1<<RXC)) )
    ;
    /* Get and return received data from buffer */
    return UDR;
}
void Transmit_Line(char *string){
    int i =0;
    while (*string != 0x00)
    {
        USART_Transmit(*string);
        i++;
    }
}
int main(void)
{
    
    init_serial(MYUBRR);
    
    while (1
    {
        USART_Transmit('a');
        
        _delay_ms(50);
    }
}
 
 
cs


다음은 BLE모듈 사용하여 LED 제어하기


반응형
반응형

https://m.blog.naver.com/PostView.nhn?blogId=ga1267&logNo=220111519302&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


https://webnautes.tistory.com/991

반응형
반응형

 

 

// Piano 만들기

1. Record mode, Listen mode 기능 구현

2. Exam mode 버그..

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
/*
 * myfunc.h
 *
 * Created: 2018-09-12 오전 11:14:38
 *  Author: USER
 */ 
 
 
#ifndef MYFUNC_H_
#define MYFUNC_H_
 
#include <avr/io.h>
#define F_CPU 16000000
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#include <stdio.h>
#include "lcd.h"
#include <stdlib.h>
#include <avr/interrupt.h>
 
#define POWER_ON_MODE 0
#define POWER_OFF_MODE 1
 
#define NOMAL_MODE 2
#define MENU_SELECT_MODE 3
 
#define RECORD_MODE 4
#define LISTEN_MODE 5
#define EXAM_SELECT_MODE 6
 
#define EXAM1_MODE 7
#define EXAM2_MODE 8
#define EXAM3_MODE 9
 
#define POWER_ON_DISPLAY 0
#define POWER_ON_UNDISPLAY 1
 
#define POWER_OFF_DISPLAY 0
#define POWER_OFF_UNDISPLAY 1
 
//메뉴
#define MENU_RECORD_MODE 0
#define MENU_LISTEN_MODE 1
#define MENU_EXAM_MODE 2
#define MENU_RETURN_MODE 3
 
//EXAM
#define EXAM1 0
#define EXAM2 1
#define EXAM3 2
#define EXAMRETURN 3
 
//음계
#define DO 261.63
#define RE 293.66
#define MI 329.63
#define FA 349.23
#define SOL 391.99
#define RA 440.0
#define SI 493.88
#define NO 0
 
#define DOUP 277.18
#define REUP 311.12
#define FAUP 369.99
#define SOLUP 415.30
#define RAUP 466.16
 
//KEY값
#define K_MENU  0b00101011
#define K_POWER 0b01001011
#define K_DO 0b00011110
#define K_RE 0b00101110
#define K_MI 0b1001110
#define K_FA 0b00011101
#define K_SOL 0b00101101
#define K_RA 0b01001101
#define K_SI 0b00011011
 
#define LED_DO 0b11111110
#define LED_RE 0b11111101
#define LED_MI 0b11111011
#define LED_FA 0b11110111
#define LED_SOL 0b11101111
#define LED_RA 0b11011111
#define LED_SI 0b10111111
 
//전역 변수
unsigned int count =0;
unsigned int mode =0,state =0;
unsigned int menuSelectCount =0;
unsigned int ExamSelectCount =0;
unsigned int timeCount =0,sec =0;
unsigned int PowerOnDisplayState =0,PowerOffDisplayState=0;
unsigned int key=0;
 
unsigned int tCount1 = 0, tCount2 = 0;
unsigned int msec = 0, rotSec = 0;
unsigned int note[100= {0,};
unsigned int note_time[100= {0,};
unsigned int n_index = 0, n_flag = 0;
 
void port_init(){
    TCCR1A =0x40;
    TCCR1B = 0x09;
    
    TIMSK = 0xc0// timer2 enable
    TCCR2 = 0x03// 64분주
    TCNT2 = 256-(256-6); // 0.001s = 1ms
}
 
void powerOn()
{
    if (PowerOnDisplayState == POWER_ON_DISPLAY){
        lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
        lcd_putsf(0,1,(unsigned char *)"    POWER ON!   ");
        _delay_ms(3000);
        PowerOnDisplayState =1;
    }
    else if(PowerOnDisplayState==POWER_ON_UNDISPLAY){
        lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
        lcd_putsf(0,1,(unsigned char *)"                ");
        mode = NOMAL_MODE;
    }
}
 
void powerOff()
{
    if(PowerOffDisplayState == POWER_OFF_DISPLAY){
        lcd_putsf(0,0,(unsigned char *)"  PIANO SYSTEM  ");
        lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
        _delay_ms(1000);
        lcd_putsf(0,0,(unsigned char *)"    GOOD BYE    ");
        lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
        _delay_ms(1000);
        PowerOffDisplayState =POWER_OFF_UNDISPLAY;
    }
    else if(PowerOffDisplayState == POWER_OFF_UNDISPLAY){
        lcd_putsf(0,0,(unsigned char *)"                ");
        lcd_putsf(0,1,(unsigned char *)"                ");
    }
}
 
 
// Key Matrix 함수
unsigned char getKey(){
    unsigned char key = 0;
    for (int i=0; i<3;i++){
        if (i==0)PORTD = 0b11111110;
        if (i==1)PORTD = 0b11111101;
        if (i==2)PORTD = 0b11111011;
        
        _delay_ms(5);
        
        key = (~PIND & 0xf0);
        if (key){
            return key|(PORTD & 0x0f);
        }
    }
    return 0;
}
 
// 음계 출력 Buzzer(주파수, 출력횟수)
void Buzzer(double hz,int count){
    for (int i=0;i<count; i++){
        PORTB = 0xff;
        _delay_ms(((double)1000/hz)/2);
        PORTB = 0x00;
        _delay_ms(((double)1000/hz)/2);
    }
}
 
//CTC 모드로 소리 출력
void freqSet(int freq, int delayTime){
    if (freq == 0) OCR1A = 0;
    else OCR1A = 8000000 /freq;
    _delay_ms(delayTime);
}
 
void freq(int freq){
    if (freq == 0) OCR1A = 0;
    else OCR1A = 8000000 /freq;
}
 
// 음악 저장
int doremi[10= {DO,RE,MI,FA,SOL,RA,SI,(DO*2)};
int school[100]= {SOL,SOL,RA,RA,SOL,SOL,MI, SOL,SOL,MI,MI,RE,SOL,SOL,RA,RA,SOL,SOL,MI,SOL,MI,RE,MI,DO};
int plane [100]= {MI,RE,DO,RE,MI,MI,MI,RE,RE,RE,MI,MI,MI,MI,RE,DO,RE,MI,MI,MI,RE,RE,MI,RE,DO};
 
 
int dog[100]    = {RA,RA,RA,SOL,RA,SOL,FA,2*FA,2*FA,2*MI,RA,2*RE,
                2*RE,2*RE,2*DO,RAUP,RA,SOL,FA,FA,SOL,SOL,2*DO,
                RA,RA,RA,SOL,RA,SOL,FA,2*FA,2*FA,2*MI,RA,2*RE,
                2*RE,2*RE,2*DO,RAUP,RA,SOL,FA,RE,FA,MI,FA,SOL,FA,
                RA,RAUP,RA,2*RE,2*MI,2*FA,2*MI,RA,2*RE,2*RE,2*DO,RAUP,RA,
                SOL,RA,RAUP,2*DO,2*FA,2*MI,2*RE,2*FA,2*FA,2*FA,2*MI,2*RE,2*DO,2*DO,
                2*FA,2*MI,2*FA,2*MI,2*RE,2*RE,2*RE,2*RE,2*DO,2*RE,2*DO,RA,
                FA,FA,SOL,SOL,2*DO,RA,FA,RE,FA,MI,FA,SOL,FA};
int dogtime[100]= {250,500,250,375,125,500,2000,250,750,500,500,2000,
                250,750,500,500,750,250,1000,1000,250,750,2000,
                250,500,250,375,125,500,2000,250,750,500,500,2000,
                250,750,500,500,750,250,1000,250,750,375,500,2000,
                375,125,375,1125,375,125,375,1125,250,750,500,500,2000,
                250,500,250,1000,500,500,1000,250,500,250,500,500,1500,500,
                1000,375,125,375,2125,250,500,250,375,125,500,2000,
                250,375,500,500,500,500,1000,250,750,375,125,500,2000};
int snow[500={RE,SI,RA,SI,2*RE,RA,NO,RE,RE,MI,SOL,SOL,MI,RE,NO,SOL,RA,
                SI,RA,SI,2*MI,2*RE,SI,NO,SI,SI,2*DO,SI,RA,SOL,SI,RA,NO,RE,SI,RA,SI,2*RE,RA,NO,RE,RE,
                MI,SOL,SOL,MI,RE,NO,SOL,RA,SI,RA,SI,2*MI,2*RE,SI,NO,SI,SI,2*DO,SI,RA,SOL,SOL,NO,
                NO,MI,SOL,2*RE,2*DO,SI,RA,RA,SOL,FAUP,SOL,MI,SOL,
                2*RE,2*MI,2*RE,2*DO,SI,RA,SI,NO,SOL,SOL,2*MI,2*FAUP,2*SOL,2*FAUP,2*MI,2*DOUP,2*RE,
                NO,2*MI,(2*FA),2*MI,2*RE,2*DO,SI,SOL,SOL,NO,MI,SOL,2*MI,2*REUP,2*MI,2*FAUP,SI,SI,
                2*SOL,2*FAUP,2*SOL,2*FAUP,2*SOL,2*FAUP,2*MI,2*RE,2*MI,2*SI,2*SI,NO,2*FAUP,2*SOL,2*RA,2*FAUP,2*MI,2*RE,2*RE,NO,SI,2*DO,2*RE,
                2*RE,2*DO,2*DO,2*MI,2*RE,SI,RA,SOL,NO,MI,SOL,2*RE,2*DO,2*DO,2*MI,2*MI,2*REUP,2*MI,2*FAUP,2*SOL,2*FAUP,2*SOL,2*FAUP,2*SOL,2*FAUP,2*MI,2*RE,
                2*MI,2*SI,2*SI,NO,2*FAUP,2*SOL,2*RA,2*FAUP,2*MI,2*MI,2*RE,2*RE,2*RA,2*SOL,SI,2*DO,2*RE,2*RE,2*DO,2*DO,2*RE,SI,RA,SOL,SOL,
                NO,SI,2*RE,2*RE,2*DO,DO,RE,2*MI,2*SOL,2*FAUP,FAUP,2*MI,2*FAUP,2*SOL,3*SOL,NO,RE};
int snowtime[500]={250,250,250,250,125,625,250,125,125,250,125,250,125,750,250,125,125,
                250,250,250,125,185,185,250,125,125,250,125,250,125,125,625,250,250,250,250,250,125,625,250,125,125,
                250,125,250,250,750,250,125,125,250,250,250,125,250,375,250,125,125,250,125,250,125,750,500,
                500,250,250,1250,250,250,250,250,250,250,750,250,250,
                750,125,375,125,250,125,1250,500,250,250,750,250,250,250,250,125,125,
                500,250,250,250,250,250,250,250,125,625,500,250,250,625,125,125,625,250,250,
                250,250,250,125,375,250,250,250,250,125,625,125,250,250,250,125,125,250,125,625,500,250,125,125,
                250,250,250,125,250,125,125,125,125,125,125,250,250,250,250,125,375,250,250,250,250,250,250,125,375,250,250,250,
                };
void snowplay(){
    for(int i =0; i<500;i++){
        freqSet(snow[i],snowtime[i]);
        freqSet(0,10);
    }mode = EXAM_SELECT_MODE;
}
void dogPlay(){
    for (int i= 0;i<100;i++){
        freqSet(dog[i],dogtime[i]);
        freqSet(0,10);
    }
    mode = EXAM_SELECT_MODE;
}
void schoolPlay(){
    for (int i= 0;i<25;i++){
        freqSet(school[i],500);
        freqSet(0,200);
    }
    mode = EXAM_SELECT_MODE;
}
void doremiPlay(){
    for (int i= 0;i<8;i++){
        freqSet(doremi[i],500);
        freqSet(0,200);
    }
    mode = EXAM_SELECT_MODE;
}
void key_init(){
    lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
    lcd_putsf(0,1,(unsigned char *)"                ");
    char keyPos = 25;
    char strConv[16];
    
    if (key == K_DO){ PORTA = LED_DO; freq(DO); keyPos =1;}
    else if (key==K_RE){ PORTA = LED_RE; freq(RE); keyPos=3;}
    else if (key == K_MI){ PORTA = LED_MI; freq(MI); keyPos =5;}
    else if (key == K_FA){ PORTA = LED_FA; freq(FA); keyPos =7;}
    else if (key == K_SOL){ PORTA = LED_SOL; freq(SOL); keyPos=9;}
    else if (key == K_RA){ PORTA = LED_RA; freq(RA); keyPos=11;}
    else if(key ==K_SI){ PORTA = LED_SI; freq(SI); keyPos =13;}
    else
    {
        OCR1A=0;
        PORTA = 0xff;
        sprintf(strConv,"                ");
        lcd_putsf(0,1,(unsigned char *)strConv);
    }
    
    sprintf(strConv,"                ");
    strConv[keyPos] = 0xff;
    lcd_putsf(0,1,(unsigned char *)strConv);
    
}
void recordDisplay(){
    lcd_putsf(0,0,(unsigned char *)"  Recording..   ");
    lcd_putsf(0,1,(unsigned char *)"                ");
}
void ListenDisplay(){
    lcd_putsf(0,0,(unsigned char *)"  Listening..   ");
    lcd_putsf(0,1,(unsigned char *)"                ");
}
 
 
void keyPowerOff(){
    if (key == K_POWER){ // POWER KEY 입력시 OFF 모드로 이동한다.
        mode = POWER_OFF_MODE;
        PowerOffDisplayState = POWER_OFF_DISPLAY;
        key =0;
        _delay_ms(100);
    }
}
void keyPowerOn(){
    if (key == K_POWER){
        mode = POWER_ON_MODE;
        PowerOnDisplayState = POWER_ON_DISPLAY;
        key =0;
        _delay_ms(100);
    }
}
 
 
void listen(){
    for (int i=1; i<n_index; i++)
    {
        freq(note[i]);
        _delay_ms(note_time[i] * 25);
    }
    freq(0);
    mode = MENU_SELECT_MODE; 
}
#endif /* MYFUNC_H_ */
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/*
* piano-0911.cpp
*
* Created: 2018-09-11 오전 11:27:56
* Author : USER
*/
 
 
#include "myfunc.h"
 
ISR(TIMER2_OVF_vect){
    TCNT2 = 6;
    count++// 0.001초마다 1회증가
    timeCount++;
    if(count >2000){
        menuSelectCount++;
        ExamSelectCount++;
        count =0;
        if(menuSelectCount>3) menuSelectCount=0;
        if(ExamSelectCount>3) ExamSelectCount=0;
    }
    if(timeCount >1000){ // 1초
        sec++;
        timeCount=0;
    }
}
int main(void)
{
    DDRA= 0xff// LED 출력 설정
    DDRB = 0xff// 스피커 출력 설정
    DDRD = 0x0f// key Matrix 입출력 설정
    
    PORTA = 0xff// LED OFF
    PORTD = 0xff// Key Matrix 초기값
 
    char str[16];
    
    
    sei();
    port_init();
    lcd_init();
    /* Replace with your application code */
    
    
    while (1)
    {
        key = getKey();
        
        if (mode == POWER_ON_MODE){
            powerOn();
        }
        else if(mode ==POWER_OFF_MODE){
            powerOff();
            if (key == K_POWER){
                mode = POWER_ON_MODE;
                PowerOnDisplayState = POWER_ON_DISPLAY;
                key =0;
                _delay_ms(100);
            }
        }
        else if(mode == NOMAL_MODE){
            key_init();
            if (key == K_POWER){ // POWER KEY 입력시 OFF 모드로 이동한다.
                mode = POWER_OFF_MODE;
                PowerOffDisplayState = POWER_OFF_DISPLAY;
                key =0;
                _delay_ms(100);
            }
            if (key == K_MENU){
                mode = MENU_SELECT_MODE;
                menuSelectCount =0;
                key=0;
                _delay_ms(100);
            }
        }
        else if(mode == MENU_SELECT_MODE){
            lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
            if (menuSelectCount == MENU_RECORD_MODE){
                lcd_putsf(0,1,(unsigned char *)"1. Recording    ");
                if (key == K_MENU){
                    mode = RECORD_MODE;
                    key=0;
                    _delay_ms(100);
                }
            }
            else if(menuSelectCount == MENU_LISTEN_MODE){
                lcd_putsf(0,1,(unsigned char *)"2. Listening    ");
                if (key == K_MENU){
                    mode = LISTEN_MODE;
                    key=0;
                    _delay_ms(100);
                }
            }
            else if(menuSelectCount == MENU_EXAM_MODE){
                lcd_putsf(0,1,(unsigned char *)"3. Example      ");
                if (key == K_MENU){
                    mode = EXAM_SELECT_MODE;
                    ExamSelectCount =0;
                    key=0;
                    _delay_ms(100);
                }
            }
            else if(menuSelectCount == MENU_RETURN_MODE){
                lcd_putsf(0,1,(unsigned char *)"4. Return       ");
                if (key == K_MENU){
                    mode = NOMAL_MODE;
                    key=0;
                    _delay_ms(100);
                }
            }
            if (key == K_POWER){ // POWER KEY 입력시 OFF 모드로 이동한다.
                mode = POWER_OFF_MODE;
                PowerOffDisplayState = POWER_OFF_DISPLAY;
                key =0;
                _delay_ms(100);
            }
        }
        else if(mode == RECORD_MODE){
            recordDisplay();
            if (key == K_DO && n_flag==0){ note_time[n_index] = msec; note[n_index + 1= DO;  msec =0; n_flag=1; n_index++; freq(DO); }
            else if(key == K_RE && n_flag == 0) { note_time[n_index] = msec; note[n_index + 1= RE; msec = 0; n_flag = 1; n_index++; freq(RE); }
            else if(key == K_MI && n_flag == 0) { note_time[n_index] = msec; note[n_index + 1= MI; msec = 0; n_flag = 1; n_index++; freq(MI); }
            else if(key == K_FA && n_flag == 0) { note_time[n_index] = msec; note[n_index + 1= FA; msec = 0; n_flag = 1; n_index++; freq(FA); }
            else if(key == K_SOL && n_flag == 0) { note_time[n_index] = msec; note[n_index + 1= SOL; msec = 0; n_flag = 1; n_index++; freq(SOL); }
            else if(key == K_RA && n_flag == 0) { note_time[n_index] = msec; note[n_index + 1= RA; msec = 0; n_flag = 1; n_index++; freq(RA); }
            else if(key == K_SI && n_flag == 0) { note_time[n_index] = msec; note[n_index + 1= SI; msec = 0; n_flag = 1; n_index++; freq(SI); }
            else if (key == 0 && n_flag == 1){ note_time[n_index] = msec; note[n_index + 1= NO; msec = 0; n_flag = 0; n_index++; freq(0); }
            if (key == K_MENU){
                mode = MENU_SELECT_MODE;
                key=0;
                _delay_ms(100);
            }
            
            if (key == K_POWER){ // POWER KEY 입력시 OFF 모드로 이동한다.
                mode = POWER_OFF_MODE;
                PowerOffDisplayState = POWER_OFF_DISPLAY;
                key =0;
                _delay_ms(100);
            }
        }
        else if(mode == LISTEN_MODE){
            ListenDisplay();
            listen();
            if (key == K_POWER){ // POWER KEY 입력시 OFF 모드로 이동한다.
                mode = POWER_OFF_MODE;
                PowerOffDisplayState = POWER_OFF_DISPLAY;
                key =0;
                _delay_ms(100);
            }
        }
        else if(mode == EXAM_SELECT_MODE){
            lcd_putsf(0,0,(unsigned char *)"   -Example-    ");
            if(ExamSelectCount == EXAM1){
                lcd_putsf(0,1,(unsigned char *)"1. Example 1    ");
            }
            else if(ExamSelectCount == EXAM2){
                lcd_putsf(0,1,(unsigned char *)"2. Example 2    ");
            }
            else if(ExamSelectCount == EXAM3){
                lcd_putsf(0,1,(unsigned char *)"3. Example 3    ");
            }
            else if(ExamSelectCount == EXAMRETURN){
                lcd_putsf(0,1,(unsigned char *)"4. Return       ");
            }
            if (key == K_POWER){ // POWER KEY 입력시 OFF 모드로 이동한다.
                mode = POWER_OFF_MODE;
                PowerOffDisplayState = POWER_OFF_DISPLAY;
                key =0;
                _delay_ms(100);
            }
            if (key == K_MENU){
                if (ExamSelectCount == EXAM1)mode = EXAM1_MODE;
                else if(ExamSelectCount == EXAM2)mode = EXAM2_MODE;
                else if(ExamSelectCount == EXAM3)mode = EXAM3_MODE;
                else if(ExamSelectCount == EXAMRETURN)mode = MENU_SELECT_MODE;
                key=0;
                _delay_ms(100);
            }
        }
        else if(mode ==EXAM1_MODE){
            doremiPlay();
        }
        else if(mode == EXAM2_MODE){
            schoolPlay();
        }
        else if(mode == EXAM3_MODE){
            dogPlay();
        }
        
    }
}
 
 
cs

 

 

 

lcd.h

 

반응형
반응형

 

// Piano 만들기

1. Menu Rotate, Exam Rotate 기능 구현 (Timer/Counter)

2. Record, listen mode 구현 필요

3. 구조적 변경 필요..

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/*
 * piano-0911.cpp
 *
 * Created: 2018-09-11 오전 11:27:56
 * Author : USER
 */ 
 
// last copy
 
#include "myfunc.h"
ISR(TIMER2_OVF_vect){
    TCNT2 = 6;
    count++// 0.001초마다 1회증가
    if(count >2000){
        menuMode++;
        Exammode++;
        count=0;
        if(menuMode >3) menuMode=0;
        if(Exammode >4) Exammode=0;
    }
}
 
int main(void)
{
    DDRA= 0xff// LED 출력 설정
    DDRB = 0xff// 스피커 출력 설정 
    DDRD = 0x0f// key Matrix 입출력 설정
    
    PORTA = 0xff// LED OFF
    PORTD = 0xff// Key Matrix 초기값
 
    int mode =OFFMODE , modeFlag =1, playmodeFlag=0;
    int menu =0, menuFlag=0,menuKeyflag=0;
    int menuModeKeyflag=0;
    
    int keyFlag =0;
    char str[16];
    int key =0;
    
    TCCR1A =0x40;
    TCCR1B = 0x09;
    
    lcd_init();
    lcd_clear();
    
    
    TIMSK = 0xc0// timer2 enable
    TCCR2 = 0x03// 64분주
    TCNT2 = 256-(256-6); // 0.001s = 1ms
    sei();
    /* Replace with your application code */
    
    while (1
    {        
        key = getKey();
        // SW8 00101011
        // SW9 01001011
        if (key == 0b01001011){
            if (mode == PLAYMODE){
                mode =OFFMODE; modeFlag=0;
            }
            else if (mode == OFFMODE){
                mode =PLAYMODE;
                playmodeFlag =0;
            }
            keyFlag=1;
        }
        else if (key== 0x00) keyFlag=0;
        
        if (mode == PLAYMODE){
            if (playmodeFlag ==0){
            lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
            lcd_putsf(0,1,(unsigned char *)"    POWER ON!   "); // 꺼짐 > 켜짐 상태 변경 후 3초 뒤 사라짐.
            _delay_ms(3000);
            lcd_putsf(0,1,(unsigned char *)"                ");
            playmodeFlag =1;
            }
            else if(playmodeFlag ==1){
                if((key == 0b00101011)&&(menuKeyflag==0)){ //SW8 키입력시 동작
                    menuFlag++;
                    menuKeyflag=1;
                    TCNT2=6;
                    if (menuFlag >2) menuFlag =0;
                }
                else if ((key == 0b00101011) && (menuMode == RECORDMENU)){
                    lcd_putsf(0,0,(unsigned char *)"  Recording..   ");
                    lcd_putsf(0,1,(unsigned char *)"                ");
                    
                }
                else if ((key == 0b00101011) && (menuMode == LISTENMENU)){
                    lcd_putsf(0,0,(unsigned char *)"  Listening..   ");
                    lcd_putsf(0,1,(unsigned char *)"                ");
                                
                }
                else if ((key == 0b00101011) && (menuMode == EXAMPLEMENU)){
                    lcd_putsf(0,0,(unsigned char *)"   -Example-    ");
                    if (Exammode == EXAM1)lcd_putsf(0,1,(unsigned char *)"1. Example 1    ");
                    else if(Exammode == EXAM2)lcd_putsf(0,1,(unsigned char *)"2. Example 2    ");    
                    else if(Exammode == EXAM3)lcd_putsf(0,1,(unsigned char *)"3. Example 3    ");    
                    else if(Exammode == 4)lcd_putsf(0,1,(unsigned char *)"4. Return       ");
                }
                else if ((key == 0b00101011) && (menuMode == RETRUNMENU)){
                    
                    menuFlag =0;
                    _delay_ms(100);
                }
                else if(key == 0x00){ 
                    menuKeyflag =0;
                }
 
                if (menuFlag==1){
                    if (menuMode ==RECORDMENU){
                        lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                        lcd_putsf(0,1,(unsigned char *)"1. Recording    ");
                    }
                    else if(menuMode ==LISTENMENU){
                        lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                        lcd_putsf(0,1,(unsigned char *)"2. Listening    ");
                    }
                    else if(menuMode == EXAMPLEMENU){
                        lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                        lcd_putsf(0,1,(unsigned char *)"3. Example      ");
                    }
                    else if(menuMode == RETRUNMENU){
                        lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                        lcd_putsf(0,1,(unsigned char *)"4. Return       ");
                    }
 
                }
                else if (menuFlag==0) {
                    lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
                    lcd_putsf(0,1,(unsigned char *)"                ");
                
                    if (key == 0b00011110){
                        PORTA = 0b11111110;
                        sprintf(str,"                ");
                        str[1]=255;
                        lcd_putsf(0,1,(unsigned char *)str);
                        freq(DO);
                    }
                    else if (key==0b00101110){
                        PORTA = 0b11111101;
                        sprintf(str,"                ");
                        str[3]=255;
                        lcd_putsf(0,1,(unsigned char *)str);
                        freq(RE);
                    }
                    else if (key == 0b1001110){
                        PORTA = 0b11111011;
                        sprintf(str,"                ");
                        str[5]=255;
                        lcd_putsf(0,1,(unsigned char *)str);
                        freq(MI);
                    }
                    else if (key == 0b00011101){
                        PORTA = 0b11110111;
                        sprintf(str,"                ");
                        str[7]=255;
                        lcd_putsf(0,1,(unsigned char *)str);
                        freq(FA);
                    }
                    else if (key == 0b00101101){
                        PORTA = 0b11101111;
                        sprintf(str,"                ");
                        str[9]=255;
                        lcd_putsf(0,1,(unsigned char *)str);
                        freq(SOL);
                    }
                    else if (key == 0b01001101){
                        PORTA = 0b11011111;
                        sprintf(str,"                ");
                        str[11]=255;
                        lcd_putsf(0,1,(unsigned char *)str);
                        freq(RA);
                    }
                    else if(key ==0b00011011){
                        PORTA = 0b10111111;
                        sprintf(str,"                ");
                        str[13]=255;
                        lcd_putsf(0,1,(unsigned char *)str);
                        freq(SI);
                    }
                    else 
                    {
                        OCR1A=0;
                        PORTA = 0xff;
                        sprintf(str,"                ");
                        lcd_putsf(0,1,(unsigned char *)str);
                    }
                }
            }
            //itoa(getKey(), str, 2); // char 문자열을 2진수로 변환 itoa함수 stdlib.h헤더파일에 위치함.
            //lcd_putsf(0,0,(unsigned char *)str); // LCD 출력
            //lcd_putsf(0,1,(unsigned char *)"  ");
            
        }
        else if (mode == OFFMODE){
            if(modeFlag ==0){
                lcd_putsf(0,0,(unsigned char *)"                ");
                lcd_putsf(0,1,(unsigned char *)"                ");
                lcd_putsf(0,0,(unsigned char *)"  PIANO SYSTEM  ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                lcd_putsf(0,0,(unsigned char *)"    GOOD BYE    ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                modeFlag=1;
            }
            else if (modeFlag==1){
                lcd_putsf(0,0,(unsigned char *)"                ");
                lcd_putsf(0,1,(unsigned char *)"                ");    
                lcd_clear();
            }
        }
    }
}
 
 
cs

//디버깅 중 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
/*
* piano-0911.cpp
*
* Created: 2018-09-11 오전 11:27:56
* Author : USER
*/
 
 
#include "myfunc.h"
#define SELECTMENU 0
#define DISSELECTMENU 1
#define POWER_ON_DISPLAY 0
#define POWER_ON_UNDISPLAY 1
#define POWER_OFF_DISPLAY 0
#define POWER_OFF_UNDISPLAY 1
 
ISR(TIMER2_OVF_vect){
    TCNT2 = 6;
    count++// 0.001초마다 1회증가
    if(count >2000){
        menuMode++;
        Exammode++;
        count=0;
        if(menuMode >3) menuMode=0;
        if(Exammode >4) Exammode=0;
    }
}
 
int main(void)
{
    DDRA= 0xff// LED 출력 설정
    DDRB = 0xff// 스피커 출력 설정
    DDRD = 0x0f// key Matrix 입출력 설정
    
    PORTA = 0xff// LED OFF
    PORTD = 0xff// Key Matrix 초기값
 
    int mode =OFFMODE , modeFlag =1, playmodeFlag=1;
    int menu =0, menuFlag=0,menuKeyflag=0;
    int menuModeKeyflag=0;
    
    int keyFlag =0;
    char str[16];
    int key =0;
    
    TCCR1A =0x40;
    TCCR1B = 0x09;
    
    lcd_init();
    lcd_clear();
    
    
    TIMSK = 0xc0// timer2 enable
    TCCR2 = 0x03// 64분주
    TCNT2 = 256-(256-6); // 0.001s = 1ms
    sei();
    /* Replace with your application code */
    
    int realMode = 255;
    int realExMode =255;
    int realmenuFlag =255;
    int realmenuSelect =255;
    
    while (1)
    {
        key = getKey();
        if(key == K_POWER){
            if (mode == PLAYMODE){
                mode =OFFMODE; modeFlag=0;
            }
            else if (mode == OFFMODE){
                mode =PLAYMODE;
                playmodeFlag =0;
            }
            keyFlag=1;
        }
        else if (key== 0x00) keyFlag=0;
        
        if(mode == PLAYMODE){
            if (playmodeFlag ==POWER_ON_DISPLAY){
                lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
                lcd_putsf(0,1,(unsigned char *)"    POWER ON!   "); // 꺼짐 > 켜짐 상태 변경 후 3초 뒤 사라짐.
                _delay_ms(3000);
                lcd_putsf(0,1,(unsigned char *)"                ");
                playmodeFlag =POWER_ON_UNDISPLAY;
            }
            else if(playmodeFlag ==POWER_ON_UNDISPLAY){
                if((key == 0b00101011)&&(menuKeyflag==0)){ //SW8 키입력시 동작
                    menuFlag++;
                    menuKeyflag=1;
                    TCNT2=6;
                    if (menuFlag >2) menuFlag =0;
                    key = 0;
                    _delay_ms(100);
                }
                else if(key == 0x00){
                    menuKeyflag =0;
                }
                if (menuFlag == 1){//
                    if (realMode == 255)
                    {
                        if (menuMode == RECORDMENU){
                            lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                            lcd_putsf(0,1,(unsigned char *)"1. Recording    ");
                        }
                        else if(menuMode == LISTENMENU){
                            lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                            lcd_putsf(0,1,(unsigned char *)"2. Listening    ");
                        }
                        else if(menuMode == EXAMPLEMENU){
                            lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                            lcd_putsf(0,1,(unsigned char *)"3. Example      ");
                        }
                        else if(menuMode == RETRUNMENU){
                            lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
                            lcd_putsf(0,1,(unsigned char *)"4. Return       ");
                        }
                        if (key == K_MENU)
                        {
                            realMode = menuMode;
                            key = 0;
                            _delay_ms(100);
                        }
                    }
                    else if (realMode == RECORDMENU)
                    {
                        lcd_putsf(0,0,(unsigned char *)"  Recording..   ");
                        lcd_putsf(0,1,(unsigned char *)"                ");
                    }
                    else if (realMode == LISTENMENU){
                        lcd_putsf(0,0,(unsigned char *)"  Listening..   ");
                        lcd_putsf(0,1,(unsigned char *)"                ");
                    }
                    else if (realMode == EXAMPLEMENU)
                    {
                        if (realExMode==255){
                            if (Exammode == EXAM1){
                                lcd_putsf(0,0,(unsigned char *)"   -Example-    ");
                                lcd_putsf(0,1,(unsigned char *)"1. Example 1    ");
                            }
                            else if (Exammode == EXAM2){
                                lcd_putsf(0,0,(unsigned char *)"   -Example-    ");
                                lcd_putsf(0,1,(unsigned char *)"2. Example 2    ");
                            }
                            else if (Exammode == EXAM3){
                                lcd_putsf(0,0,(unsigned char *)"   -Example-    ");
                                lcd_putsf(0,1,(unsigned char *)"3. Example 3    ");
                            }
                            else if (Exammode == EXAMRETURN){
                                lcd_putsf(0,0,(unsigned char *)"   -Example-    ");
                                lcd_putsf(0,1,(unsigned char *)"4. Return       ");
                            }
                            if (key == K_MENU)
                            {
                                realExMode = Exammode;
                            }
                        }
                        else if(realExMode == EXAM1){
                            for (int i = 0; i<5; i++){
                                freqSet(doremi[i],500);
                            }
                            OCR1A=0;
                            realExMode = 255;
                        }
                        else if(realExMode == EXAM2){
                            for (int i =0; i<25;i++){
                                freqSet(school[i],500);
                            }
                            OCR1A=0;
                            realExMode = 255;
                        }
                        else if(realExMode == EXAM3){
                            for (int i = 0;i<25; i++){
                                freqSet(plane[i],500);
                            }
                            OCR1A=0;
                            realExMode = 255;
                        }
                        else if(realExMode == EXAMRETURN){
                            realMode =255;
                            realExMode =255;
                        }
                    }
                    else if(realMode == RETRUNMENU){
                        menuMode= PLAYMODE;
                        realMode =255;
                    }
                }
                else if(menuFlag ==0){
                    lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
                    lcd_putsf(0,1,(unsigned char *)"                ");
                }
            }
        }
        else if (mode == OFFMODE){
            if(modeFlag ==POWER_OFF_DISPLAY){ 
                lcd_putsf(0,0,(unsigned char *)"                ");
                lcd_putsf(0,1,(unsigned char *)"                ");
                lcd_putsf(0,0,(unsigned char *)"  PIANO SYSTEM  ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                lcd_putsf(0,0,(unsigned char *)"    GOOD BYE    ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                modeFlag=POWER_OFF_UNDISPLAY;
            }
            else if (modeFlag==POWER_OFF_UNDISPLAY){
                lcd_putsf(0,0,(unsigned char *)"                ");
                lcd_putsf(0,1,(unsigned char *)"                ");
                lcd_clear();
            }
        }
    }
}
 
 
cs

 

 

// 구조 변경 후

모드별로 구조를 변경 함.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/*
 * piano-0912.cpp
 *
 * Created: 2018-09-12 오전 9:34:15
 * Author : USER
 */ 
 
#include "myfunc.h"
 
 
 
int main(void)
{
    DDRA= 0xff// LED 출력 설정
    DDRB = 0xff// 스피커 출력 설정
    DDRD = 0x0f// key Matrix 입출력 설정
    
    PORTA = 0xff// LED OFF
    PORTD = 0xff// Key Matrix 초기값
 
    char str[16];
    int key=0;
    TCCR1A =0x40;
    TCCR1B = 0x09;
    
    TIMSK = 0xc0// timer2 enable
    TCCR2 = 0x03// 64분주
    TCNT2 = 256-(256-6); // 0.001s = 1ms
    sei();
    
    lcd_init();
    /* Replace with your application code */
    int PowerOnDisplayState =0,PowerOffDisplayState=0;
    
    while (1
    {
        key = getKey();
        
        if (mode == POWER_ON_MODE){
            if (PowerOnDisplayState == POWER_ON_DISPLAY){
                lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
                lcd_putsf(0,1,(unsigned char *)"    POWER ON!   ");
                _delay_ms(300);
                PowerOnDisplayState =1;
            }
            else if(PowerOnDisplayState==POWER_ON_UNDISPLAY){
                lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
                lcd_putsf(0,1,(unsigned char *)"                ");
                mode = NOMAL_MODE;
            }
        }
        else if(mode ==POWER_OFF_MODE){
            if(PowerOffDisplayState == POWER_OFF_DISPLAY){
                lcd_putsf(0,0,(unsigned char *)"  PIANO SYSTEM  ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                lcd_putsf(0,0,(unsigned char *)"    GOOD BYE    ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                PowerOffDisplayState =POWER_OFF_UNDISPLAY;
            }
            else if(PowerOffDisplayState == POWER_OFF_UNDISPLAY){
                lcd_putsf(0,0,(unsigned char *)"                ");
                lcd_putsf(0,1,(unsigned char *)"                ");
            }
            if (key == K_POWER){
                mode = POWER_ON_MODE;
                key =0;
                _delay_ms(100);
            }
        }
        else if(mode == NOMAL_MODE){
            lcd_putsf(0,0,(unsigned char *)    "   NOMAL MODE   ");
            lcd_putsf(0,1,(unsigned char *)"                ");
            
            if (key == 0b00011110){
                PORTA = 0b11111110;
                sprintf(str,"                ");
                str[1]=255;
                lcd_putsf(0,1,(unsigned char *)str);
                freq(DO);
            }
            else if (key==0b00101110){
                PORTA = 0b11111101;
                sprintf(str,"                ");
                str[3]=255;
                lcd_putsf(0,1,(unsigned char *)str);
                freq(RE);
            }
            else if (key == 0b1001110){
                PORTA = 0b11111011;
                sprintf(str,"                ");
                str[5]=255;
                lcd_putsf(0,1,(unsigned char *)str);
                freq(MI);
            }
            else if (key == 0b00011101){
                PORTA = 0b11110111;
                sprintf(str,"                ");
                str[7]=255;
                lcd_putsf(0,1,(unsigned char *)str);
                freq(FA);
            }
            else if (key == 0b00101101){
                PORTA = 0b11101111;
                sprintf(str,"                ");
                str[9]=255;
                lcd_putsf(0,1,(unsigned char *)str);
                freq(SOL);
            }
            else if (key == 0b01001101){
                PORTA = 0b11011111;
                sprintf(str,"                ");
                str[11]=255;
                lcd_putsf(0,1,(unsigned char *)str);
                freq(RA);
            }
            else if(key ==0b00011011){
                PORTA = 0b10111111;
                sprintf(str,"                ");
                str[13]=255;
                lcd_putsf(0,1,(unsigned char *)str);
                freq(SI);
            }
            else
            {
                OCR1A=0;
                PORTA = 0xff;
                sprintf(str,"                ");
                lcd_putsf(0,1,(unsigned char *)str);
            }
            if (key == K_POWER){ // POWER KEY 입력시 OFF 모드로 이동한다.
                mode = POWER_OFF_MODE;
                PowerOnDisplayState = POWER_ON_DISPLAY;
                key =0;
                _delay_ms(100);
            }
            if (key == K_MENU){
                mode = MENU_SELECT_MODE;
                menuSelectCount =0;
                key=0;
                _delay_ms(100);
            }
        }
        else if(mode == MENU_SELECT_MODE){
            lcd_putsf(0,0,(unsigned char *)"    M E N U     ");
            if (menuSelectCount == MENU_RECORD_MODE){
                lcd_putsf(0,1,(unsigned char *)"1. Recording    ");
                if (key == K_MENU){
                    mode = RECORD_MODE;
                    key=0;
                    _delay_ms(100);
                }
            }
            else if(menuSelectCount == MENU_LISTEN_MODE){
                lcd_putsf(0,1,(unsigned char *)"2. Listening    ");
                if (key == K_MENU){
                    mode = LISTEN_MODE;
                    key=0;
                    _delay_ms(100);
                }
            }
            else if(menuSelectCount == MENU_EXAM_MODE){
                lcd_putsf(0,1,(unsigned char *)"3. Example      ");
                if (key == K_MENU){
                    mode = EXAM_SELECT_MODE;
                    ExamSelectCount =0;
                    key=0;
                    _delay_ms(100);
                }
            }
            else if(menuSelectCount == MENU_RETURN_MODE){
                lcd_putsf(0,1,(unsigned char *)"4. Return       ");
                if (key == K_MENU){
                    mode = NOMAL_MODE;
                    key=0;
                    _delay_ms(100);
                }
            }
        }
        else if(mode == RECORD_MODE){
            lcd_putsf(0,0,(unsigned char *)"  Recording..   ");
            lcd_putsf(0,1,(unsigned char *)"                ");
        }
        else if(mode == LISTEN_MODE){
            lcd_putsf(0,0,(unsigned char *)"  Listening..   ");
            lcd_putsf(0,1,(unsigned char *)"                ");
        }
        
    }
}
 
 
cs

 

 

반응형
반응형

piano.pdf

lcd.h

piano.zip

 

// Piano 만들기 시작

1. Power ON/OFF 기능 구현

2. Key Matrix 입력시 스피커 출력 음계 구현

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * piano-0911.cpp
 *
 * Created: 2018-09-11 오전 11:27:56
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#include <stdio.h>
#include "lcd.h"
#include <stdlib.h>
 
//MODE 전원
#define PLAYMODE 1
#define OFFMODE 0
 
//음계
#define DO 261.63
#define RE 293.66
#define MI 329.63
#define FA 349.23
#define SOL 391.99
#define RA 440.0
#define SI 493.88
 
// Key Matrix 함수
unsigned char getKey(){
    unsigned char key = 0,result =0;
    for (int i=0; i<3;i++){
        if (i==0)PORTD = 0b11111110;
        if (i==1)PORTD = 0b11111101;
        if (i==2)PORTD = 0b11111011;
    
        _delay_ms(5);
    
        key = (~PIND & 0xf0);
        if (key){
            return key|(PORTD & 0x0f);
        }
    }
    return 0;
}
 
// 음계 출력 Buzzer(주파수, 출력횟수)
void Buzzer(double hz,int count){
    for (int i=0;i<count; i++){
        PORTB = 0xff;
        _delay_ms(((double)1000/hz)/2);
        PORTB = 0x00;
        _delay_ms(((double)1000/hz)/2);
    }
}
 
// 음악 저장
int school[25]= {SOL,SOL,RA,RA,SOL,SOL,MI, SOL,SOL,MI,MI,RE,SOL,SOL,RA,RA,SOL,SOL,MI,SOL,MI,RE,MI,DO};
int plane [25]=    {MI,RE,DO,RE,MI,MI,MI,RE,RE,RE,MI,MI,MI,MI,RE,DO,RE,MI,MI,MI,RE,RE,MI,RE,DO};
    
int main(void)
{
    DDRA= 0xff// LED 출력 설정
    DDRB = 0xff// 스피커 출력 설정 
    DDRD = 0x0f// key Matrix 입출력 설정
    
    PORTA = 0xff// LED OFF
    PORTD = 0xff// Key Matrix 초기값
    
    int mode =0;
    
    char str[16];
    lcd_init();
    lcd_clear();
    /* Replace with your application code */
    
    while (1
    {        
        if (mode == PLAYMODE){
            lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
            lcd_putsf(0,1,(unsigned char *)"    POWER ON!   "); // 꺼짐 > 켜짐 상태 변경 후 3초 뒤 사라짐.
            
        
            //itoa(getKey(), str, 2); // char 문자열을 2진수로 변환 itoa함수 stdlib.h헤더파일에 위치함.
            //lcd_putsf(0,0,(unsigned char *)str); // LCD 출력
            //lcd_putsf(0,1,(unsigned char *)"  ");
            if (getKey() == 0b00011110){
                Buzzer(DO,50);
            }
            if (getKey()==0b00101110){
                Buzzer(RE,50);
            }
            if (getKey() == 0b1001110){
                Buzzer(MI,50);
            }
            if (getKey() == 0b00011101){
                Buzzer(FA,50);
            }
            if (getKey() == 0b00101101){
                Buzzer(SOL,50);
            }
            if (getKey() == 0b01001101){
                Buzzer(RA,50);
            }
            if(getKey()==0b00011011){
                Buzzer(SI,50);
            }
        
        }
        else if (mode == OFFMODE){
            // 켜짐 > 꺼짐
            lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
            lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
            //1초 후
            lcd_putsf(0,0,(unsigned char *)"    GOOD BYE    ");
            // 1초 후 공백
            lcd_putsf(0,0,(unsigned char *)"                ");
            lcd_putsf(0,0,(unsigned char *)"                ");
        }
    }
}
 
 
cs

 

 

//앞 뒤 납땜

 

 

 

 

 

// LCD출력중..

/*

모드별 LCD ON/OFF 문구 출력

키입력시 건반모양 출력 구현 필요

스위치(건반) 입력시 스피커 출력 타이머 카운터로 구현 필요

*/

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 * piano-0911.cpp
 *
 * Created: 2018-09-11 오전 11:27:56
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#include <stdio.h>
#include "lcd.h"
#include <stdlib.h>
 
//MODE 전원
#define PLAYMODE 1
#define OFFMODE 0
 
//음계
#define DO 261.63
#define RE 293.66
#define MI 329.63
#define FA 349.23
#define SOL 391.99
#define RA 440.0
#define SI 493.88
 
 
// Key Matrix 함수
unsigned char getKey(){
    unsigned char key = 0,result =0;
    for (int i=0; i<3;i++){
        if (i==0)PORTD = 0b11111110;
        if (i==1)PORTD = 0b11111101;
        if (i==2)PORTD = 0b11111011;
    
        _delay_ms(5);
    
        key = (~PIND & 0xf0);
        if (key){
            return key|(PORTD & 0x0f);
        }
    }
    return 0;
}
 
// 음계 출력 Buzzer(주파수, 출력횟수)
void Buzzer(double hz,int count){
    for (int i=0;i<count; i++){
        PORTB = 0xff;
        _delay_ms(((double)1000/hz)/2);
        PORTB = 0x00;
        _delay_ms(((double)1000/hz)/2);
    }
}
 
// 음악 저장
int school[25]= {SOL,SOL,RA,RA,SOL,SOL,MI, SOL,SOL,MI,MI,RE,SOL,SOL,RA,RA,SOL,SOL,MI,SOL,MI,RE,MI,DO};
int plane [25]=    {MI,RE,DO,RE,MI,MI,MI,RE,RE,RE,MI,MI,MI,MI,RE,DO,RE,MI,MI,MI,RE,RE,MI,RE,DO};
    
int main(void)
{
    DDRA= 0xff// LED 출력 설정
    DDRB = 0xff// 스피커 출력 설정 
    DDRD = 0x0f// key Matrix 입출력 설정
    
    PORTA = 0xff// LED OFF
    PORTD = 0xff// Key Matrix 초기값
 
    int mode =OFFMODE , modeFlag =1, playmodeFlag=0;
    int keyFlag =0;
    
    char str[16];
    lcd_init();
    lcd_clear();
    /* Replace with your application code */
    
    while (1
    {        
        // SW8 00101011
        // SW9 01001011
        if (getKey() == 0b01001011){
            if (mode == PLAYMODE){
                mode =OFFMODE; modeFlag=0;
            }
            else if (mode == OFFMODE){
                mode =PLAYMODE;
                playmodeFlag =0;
            }
            keyFlag=1;
        }
        else if (getKey()== 0x00) keyFlag=0;
        
        if (mode == PLAYMODE){
            if (playmodeFlag ==0){
            lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
            lcd_putsf(0,1,(unsigned char *)"    POWER ON!   "); // 꺼짐 > 켜짐 상태 변경 후 3초 뒤 사라짐.
            _delay_ms(3000);
            lcd_putsf(0,1,(unsigned char *)"                ");
            playmodeFlag =1;
            }
            else if(playmodeFlag ==1){
                lcd_putsf(0,0,(unsigned char *)"  PIANO START!  ");
            }
            //itoa(getKey(), str, 2); // char 문자열을 2진수로 변환 itoa함수 stdlib.h헤더파일에 위치함.
            //lcd_putsf(0,0,(unsigned char *)str); // LCD 출력
            //lcd_putsf(0,1,(unsigned char *)"  ");
            if (getKey() == 0b00011110){
                Buzzer(DO,50);
            }
            else if (getKey()==0b00101110){
                Buzzer(RE,50);
            }
            else if (getKey() == 0b1001110){
                Buzzer(MI,50);
            }
            else if (getKey() == 0b00011101){
                Buzzer(FA,50);
            }
            else if (getKey() == 0b00101101){
                Buzzer(SOL,50);
            }
            else if (getKey() == 0b01001101){
                Buzzer(RA,50);
            }
            else if(getKey()==0b00011011){
                Buzzer(SI,50);
            }
        }
        else if (mode == OFFMODE){
            if(modeFlag ==0){
                lcd_putsf(0,0,(unsigned char *)"                ");
                lcd_putsf(0,1,(unsigned char *)"                ");
                lcd_putsf(0,0,(unsigned char *)"  PIANO SYSTEM  ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                lcd_putsf(0,0,(unsigned char *)"    GOOD BYE    ");
                lcd_putsf(0,1,(unsigned char *)"   POWER OFF!   ");
                _delay_ms(1000);
                modeFlag=1;
            }
            else if (modeFlag==1){
                lcd_putsf(0,0,(unsigned char *)"                ");
                lcd_putsf(0,1,(unsigned char *)"                ");    
            }
        }
    }
}
 
 
cs

 

 

 

반응형
반응형

회로도 및 소스자료 참고.

 

 

01.NPAVR-100.pdf

02.AVR 교육자료(교재).pdf

 

반응형
반응형

* Dot Matrix

 

1. 하트를 그리고, 그 하트를 방향키를 이용하여 움직인다.

 

2. 불켜기 게임을 Dotmatrix로 구현한다. 25개를 다 켜면 HLED가 ON/OFF

 

3. 폭탄 피하기 게임

 

* Key Matrix

 

1. 핸드폰 영문자판 흉내내기

 - 키매트릭스를 핸드폰 자판이라 생각하고 LCD에 글을 써보자

 

* HLED 녹화하기

 - 타이머 인터럽트를 이용해서 구현하기

 

 

 

** 고난도 프로젝트

 

LCD에 Key입력을 받아 명령을 수행한다.

 

MTR RI 30 모터를 오른쪽으로 30도 이동 

MTR LE 15 모터를 왼쪽으로 15도 이동

 

...

반응형
반응형

 

// 서보모터 구현하기

Timer/Counter와 Delay를 이용하여 구현

 

1. Timer/Counter를 이용하여 구현

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
/*
 * avr_motor_0910.cpp
 *
 * Created: 2018-09-10 오후 2:07:45
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <stdio.h>
#include <avr/interrupt.h>
 
 
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
 
unsigned int tCount =0;
unsigned int servoCount =0;
 
ISR (TIMER0_OVF_vect){ // 100us
    TCNT0 = 256 -50;
    tCount ++;    
    if ( tCount>= 0 && tCount<=7) PORTB = 0xff;
    else if (tCount>7 && tCount <230) PORTB = 0x00;
    else tCount=0;
}
int main(void)
{
    /* Replace with your application code */
    DDRB = 0xff;
    DDRE = 0x00// 스위치
 
    PORTE = 0x70;
    PORTB = 0x01;
    
    io_init();
    lcd_init();
    
    int flag =0;
    TIMSK = 0x01;
    TCCR0 = 0x03;
    TCNT0 = 256 -50;
    sei();
    while (1
    {    
    
    
    }
}
 
 
cs

 

 

2. delay함수를 이용하여 구현

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
/*
 * avr_motor_0910.cpp
 *
 * Created: 2018-09-10 오후 2:07:45
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <stdio.h>
#include <avr/interrupt.h>
 
 
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
 
unsigned int tCount =0;
unsigned int servoCount =0;
 
 
int main(void)
{
    /* Replace with your application code */
    DDRB = 0xff;
    DDRE = 0x00// 스위치
 
    PORTE = 0x70;
    PORTB = 0x01;
    
    io_init();
    lcd_init();
    
    int flag =0;
    while (1
    {    
    
        
        
        if (((PINE & 0x10)== 0x00)&& flag ==0){
            
            for (int i=0; i<100;i++){
                PORTB = 0xff;
                _delay_us(700);
                PORTB = 0x00;
                _delay_us(19300);
            }
            flag =1;
        }
        else if (((PINE & 0x20)==0x00)&& flag==0){
                    for (int i = 0; i<100;i++){
                        PORTB = 0xff;
                        _delay_us(2300);
                        PORTB = 0x00;
                        _delay_us(17700);
                    }
            flag=1;
        }
        else if (((PINE &0x40)== 0x00)&& flag==0){
            for (int i = 0; i<100;i++){
                PORTB = 0xff;
                _delay_us(1500);
                PORTB = 0x00;
                _delay_us(18500);
            }
            flag =1;
        }
        else if (PINE==0xff) flag=0;
    
    }
}
 
 
cs

 

반응형
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * avr_motor_0910.cpp
 *
 * Created: 2018-09-10 오후 2:07:45
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <stdio.h>
 
void DC_Motor30(){
    PORTB = 0x40;
    _delay_us(30);
    PORTB = 0x20;
    _delay_us(70);
}
void DC_Motor50(){
    PORTB = 0x40;
    _delay_us(50);
    PORTB = 0x20;
    _delay_us(50);
}
void DC_Motor70(){
    PORTB = 0x40;
    _delay_us(70);
    PORTB = 0x20;
    _delay_us(30);
}
void Step_MotorFW(){
    PORTB = 0x01;
    _delay_ms(20);
    PORTB = 0x02;
    _delay_ms(20);
    PORTB = 0x04;
    _delay_ms(20);
    PORTB = 0x08;
    _delay_ms(20);
}
void Step_MotorBW(){
    PORTB = 0x08;
    _delay_ms(20);
    PORTB = 0x04;
    _delay_ms(20);
    PORTB = 0x02;
    _delay_ms(20);
    PORTB = 0x01;
    _delay_ms(20);
}
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
 
int main(void)
{
    /* Replace with your application code */
    DDRB = 0x0f;
    DDRE = 0x00// 스위치
 
    PORTE = 0x70;
    PORTB = 0x01;
    
    io_init();
    lcd_init();
 
    char temp[16];
    int degree =0,flag =0, current_degree=0;;
    
 
    while (1
    {        
 
        if (((PINE & 0x10)==0x00)&& flag ==0){
            if(degree >=15) degree = degree-15;
        flag =1;
        }
        else if (((PINE & 0x20)==0x00)&& flag ==0){
            if(degree <360) degree     = degree+15;
            flag=1;
        }
        else if(PINE == 0xff){
            flag=0;
        }
        // 스텝모터 동작(미완성)
        if (((PINE & 0x40== 0x00)&& flag ==0){ 
            if (current_degree < degree)
                PORTB= PORTB <<1;
                _delay_ms(20);
                if (PORTB ==0x10){ PORTB = 0x01;
                    _delay_ms(20);
                }
            }
            flag=1;
        }
        else if (PINE ==0xff) flag =0;
        sprintf(temp,"> %d    ", degree);
        lcd_putsf(0,0,"  Input Degree  ");
        lcd_putsf(0,1,temp);
    }
}
 
 
cs

 

// 여러 방법이 있지만, 여기서는  

void Step_MotorFW(){
    PORTB = 0x01;
    _delay_ms(20);
    PORTB = 0x02;
    _delay_ms(20);
    PORTB = 0x04;
    _delay_ms(20);
    PORTB = 0x08;
    _delay_ms(20);
}

// 4차례를 순서대로 이동시켜야 스텝모터가 동작 한다.

 

반응형

+ Recent posts