/*********************************************
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);
} |
댓글을 달아 주세요