4개의 키를 각각 누를 때마다 누른 횟수 증가 하는 예제
PORTA0 ~ PORTA3까지 스위치를 연결하고 각 스위치를 누를 때마다 카운터를 증가시켜 LCD에 출력 하는 CodeVisionAVR 예제입니다.
< 시작 화면: 모든 값이 0으로 표시됩니다 >
< SW1는 5번, SW2는 3번, SW3는 2번, SW4는 4번 눌렀을 때 결과입니다.
전체 소스 CodeVision 1.24.0 용
/********************************************* Character LCD Control PORTB ==> LCD DataLine PORTA.7 ==> LCD E PORTA.6 ==> LCD RW PORTA.5 ==> LCD RS
PORTA.3 ==> SW1 PORTA.2 ==> SW2 PORTA.1 ==> SW3 PORTA.0 ==> SW4
Main Clock : 8Mhz
각키를누를때마다누른횟수증가하는예제
Tools : Codevision http://watsim.tistory.com *********************************************/
#include <stdio.h> //#include <string.h>
typedef signed int INT16S; typedef signed int UINT16; typedef unsigned int INT16US; typedef unsigned char INT8US; typedef unsigned int WORD; typedef unsigned char UINT8; typedef unsigned char BOOL; typedef unsigned char BYTE;
#define SetBit(PORT,ibit) (PORT=PORT| ((1<<ibit))) #define ClearBit(PORT, ibit) (PORT=PORT&(~(1<<ibit)))
#include <mega128.h> #define LCD_RS 5 #define LCD_EA 7 #define LCD_DATA_PORT PORTB #define LCD_CONTROL_PORT PORTA
void CLcdXY(BYTE x1, BYTE y1); void CLcdCommand(BYTE data); void CLcdOn(); BYTE CLcdBusyCheck(); void CLcdPutStrings(BYTE x, BYTE y, char *str); void CLcdPutChar(BYTE chr); void CLcdClear();
// time delay for us void WaitUS(unsigned char time_us) { register unsigned char i; for(i = 0; i < time_us; i++) { #asm PUSH R0 ; POP R0 ; PUSH R0 ; POP R0 ; #endasm } }
// time delay for ms void WaitMS(unsigned int time_ms) { register unsigned int i; for(i = 0; i < time_ms; i++) { WaitUS(250); WaitUS(250); WaitUS(250); WaitUS(250); } }
char chTemp[17]; unsigned int g_iSwCount[4];
// 스위치(키)의입력값이변경되었는지와마지막값확인용 unsigned char keyvalue = -1; // -1 은입력된값이없을때 unsigned char lastkeyvalue = -1; // -1 은입력된값이없을때
void GetSW() { keyvalue = PINA & 0x0F;
// switch 의값이변경되었을때만처리하자. if( keyvalue != lastkeyvalue) {
if((lastkeyvalue& 0x08) && !(keyvalue & 0x08)) { g_iSwCount[0] ++; if(g_iSwCount[0] >999) g_iSwCount[0] = 0; }
if((lastkeyvalue& 0x04) && !(keyvalue & 0x04)) { g_iSwCount[1] ++; if(g_iSwCount[1] >999) g_iSwCount[1] = 0; } if((lastkeyvalue& 0x02) && !(keyvalue & 0x02)) { g_iSwCount[2] ++; if(g_iSwCount[2] >999) g_iSwCount[2] = 0; }
if((lastkeyvalue& 0x01) && !(keyvalue & 0x01)) { g_iSwCount[3] ++; if(g_iSwCount[3] >999) g_iSwCount[3] = 0; }
lastkeyvalue = keyvalue; } }
void main(void) { DDRA = 0xF0; DDRB = 0xFF;
g_iSwCount[0]=0; g_iSwCount[1]=0; g_iSwCount[2]=0; g_iSwCount[3]=0;
SetBit(PORTD,LCD_EA); // ENABLE ClearBit(PORTD,6);
CLcdOn(); CLcdClear();
while (1) {
sprintf(chTemp,"S1:%4d,S2:%4d." ,g_iSwCount[0],g_iSwCount[1]); CLcdPutStrings(0,0,chTemp); sprintf(chTemp,"S3:%4d,S4:%4d." ,g_iSwCount[2],g_iSwCount[3]); CLcdPutStrings(0,1,chTemp);
GetSW(); } }
BYTE CLcdBusyCheck() { WaitMS(1);
return (0); }
void CLcdPutStrings(BYTE x, BYTE y, char *str) { int len = 0; CLcdXY(x,y); while(*str ){ if(len>16) break; CLcdPutChar(*str++); len++; } }
void CLcdPutChar(BYTE data) { while(CLcdBusyCheck()); ClearBit(LCD_CONTROL_PORT,LCD_EA); SetBit(LCD_CONTROL_PORT,LCD_RS); WaitUS(2); LCD_DATA_PORT= data; WaitUS(50); SetBit(LCD_CONTROL_PORT,LCD_EA); WaitUS(50); ClearBit(LCD_CONTROL_PORT,LCD_EA); }
void CLcdClear() { CLcdCommand(1); WaitMS(1); CLcdCommand(2); WaitMS(1); }
void CLcdXY(BYTE x, BYTE y) { BYTE position; if(x>16) x = 0; switch(y) { case 0 : position = 0x80; break; case 1 : position = 0xC0; break; } CLcdCommand(position + x); }
void CLcdCommand(BYTE data) { while(CLcdBusyCheck()){} ClearBit(LCD_CONTROL_PORT,LCD_RS); ClearBit(LCD_CONTROL_PORT,LCD_EA); WaitUS(1); LCD_DATA_PORT= data; WaitUS(50); SetBit(LCD_CONTROL_PORT,LCD_EA); WaitUS(20); ClearBit(LCD_CONTROL_PORT,LCD_EA); WaitUS(50); }
void CLcdOn() { CLcdCommand(0x01);// dummy CLcdCommand(0x38); CLcdCommand(0x0C ); CLcdCommand(0x01); CLcdCommand(0x06); CLcdCommand(0x01); WaitMS(2); } |
주요 부품
ATMEGA128 - 1EA ABC016002E57 – 1EA Switch – 4EA POWER 5V/1A |
실행파일 다운로드
이번 예제가 추가되면서 실행파일이 업데이트 되었습니다.
이 예제를 사용하기 위해서는 최신 버전(0.2.1.0 이상)으로 패치 하시기 바랍니다.
실행파일 ( 0.2.1.0)
WATSIM 프로젝트 파일과 Codevision 소스 파일
'CodeVision 용 소스' 카테고리의 다른 글
PORTB 에 연결된 LED 교차 ON/OFF (0) | 2011.06.24 |
---|---|
PORTA에 연결된 LED 시프트 (0) | 2011.06.06 |
Switch 4개의 상태에 따른 LED ON/OFF 변화 (0) | 2011.02.21 |
Character LCD Control (0) | 2011.02.18 |
LED 순차 소등 하기 PORTC.0 => PORTC.7 순서로 (0) | 2011.02.06 |