| Total 38 (32/38) | ºÎ·ÏÀ» Æ÷ÇÔÇÏ¿© ÃÑ 38°Á·Π±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù. Ã¥À» ÀеíÀÌ ¾ÕÆä¿¡ÁöºÎÅÍ »ç¿ëÇϽʽÿä |
Á¦9Àå 8051 È°¿ë- 3°
5. ÀÎÅÍ·´Æ® Á¦¾î (¸ÞÀΠȸ·Îµµ¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù)
/*********************************************************************/
/* Subject : 3 Port LED Driving by Interrupt Code */
/*********************************************************************/
/************************ Declear Preprocessor ***********************/
#include
#define read_CODE(address) (((char *)0x020000)[address])
#define read_XDATA(address) (((char *)0x010000)[address])
#define write_XDATA(address,value) (((char *)0x010000)[address]=value)
#define PA 0x7400 /* PPI 8255 Address Map => ROM - 27c256 */
#define PB 0x7401
#define PC 0x7402
#define CR 0x7403 /* Control Register */
#define CW 0x80 /* Control Word
PA,PB,PC ALL Output Mode */
unsigned char ON_OFF=1; /* switch is a Advice to cpu Interrupt */
/*********************** Function Module ************************/
void delay() /* function module is delay in 0.5 sec */
{
unsigned int i;
for(i=0;i<20000;i++);
}
void init_INT() /* module is Initial interrupt rutine */
{
TCON=0x00; /* INT0 ÀÇ ÀÔ·ÂÀÌ LOW ·¹º§·Î µÉ ¶§ ¸¶´Ù ÀÎÅÍ·´Æ® ¹ß»ý */
EA=1; /* Interrupt enable */
EX0=1; /* IE ÀÇ D0 ºñÆ® */
EX1=1; /* IE ÀÇ D1 ºñÆ® */
}
void init_8255() /* module is Initial PPI 8255 */
{
write_XDATA(CR,CW); /* writing CW to CR of PPI */
delay();
}
void a_led() /* Initial reset led display */
{
unsigned int i,A=1;
for(i=0;i<128;i++)
{
P1=A;
delay();
if(A==128)A=1;
else
A=A<<1;
}
}
void b_led(unsigned int nn) /* LED display about Port PA */
{
unsigned int i;
for(i=0;i
{
write_XDATA(PA,0xff);
delay();
write_XDATA(PA,0x00);
delay();
}
}
void c_led(unsigned int nn) /* LED DISPLAY about Port PB */
{
unsigned int i;
for(i=0;i
{
write_XDATA(PB,0xff);
delay();
write_XDATA(PB,0x00);
delay();
}
}
/********************* Wake up Interrupt *************************/
interrupt[0x03] void EX0_int(void) /* Initial INT0 Interrupt */
{
if(ON_OFF=1) b_led(5); /* ½ÇÇàÈÄ Ãʱâ¸ðµâÀ» ¼öÇàÇ϶ó */
}
interrupt[0x13] void EX1_int(void) /* Initial INT1 Interrupt */
{
if(ON_OFF=1) c_led(5); /* ½ÇÇàÈÄ Ãʱâ¸ðµâÀ» ¼öÇàÇ϶ó */
}
/************************* Main Body *****************************/
void main(void)
{
unsigned int i;
init_INT();
init_8255();
while(1)
a_led();
}
/* End Code */
6. ŸÀ̸Ó/Ä«¿îÅÍ Á¦¾î
/***************************************************************************/
/* 8051ÀÇ Å¸À̸Ó/Ä«¿îÅÍ interrupt¸¦ ÀÌ¿ëÇÑ LED ¼øÂ÷Á¦¾î */
/***************************************************************************/
/***************************** ¾Ë°í¸®Áò ************************************/
/* Timer_0 Mode 1 ¸¦ ÀÌ¿ëÇÏ¿© LEDÀÇ Á¡¸êÁֱ⸦ 1ÃÊ·Î ÇÏ¿© ±¸µ¿ */
/****************************************************************************/
#include
data int i,count=0;
data int co=0;
void Init_T0(void)
{ TMOD = 0x00; /* timer_0 mode 1¼³Á¤ */
TR0 = 1; /* timer_0 counting start */
EA = 1; /* interrupt all bit on */
ET0 = 1; /* timer_0 overflow Çü¼º */ }
/**************************** ÆÞ½º°è»ê *********************************/
/* A=>1¸Ó½Å»çÀÌŬ : (11059200/12) */
/* B=>³»ºÎŬ·Ï1°³´ç ÁÖ±â : 1/(110592/12) => 1/A */
/* C=>1/1000ÃÊ Áֱ⸦ À§ÇÑ Å¬·Ï¼ö(ÆÞ¼ö°³¼ö) : 0.001 x 1/(11059200/12) */
/* TH °ª : 8191 - (C-1) = 8191 - (920-1) = 7271 => 0x1c67 ¸¦ 3Á Shift */
/* Çϸé TH = 0xe3/ TL = 0x07 */
/***********************************************************************/
interrupt[0x0b] void T0_int(void) /* timer_0 interrupt serve rutine Çü¼º */
{
TH0 = 0xe3; /* counting cycle °áÁ¤ */
TL0 = 0x07;
count++;
if(count >= 1000) /* count¸¦ 1000¹ø ºÎ¸£¸é 1ÃÊ => P1±¸µ¿ */
{
count=0;
P1=0x00;
co++;
if(co >= 10) /* co°¡ 10¹ø ºÒ·ÁÁö¸é 10ÃÊ => P3±¸µ¿ */
{
co=0;
P3=0x00;
for(i=0;i<1000;i++);
P3=0xff;
}
}
else
P1=0xff;
}
void main(void)
{
Init_T0( );
while(1){}
}
/***************************************************************************/
/* Timer_0 Mode 1 ¸¦ ÀÌ¿ëÇÏ¿© LEDÀÇ Á¡¸êÁֱ⸦ 1ÃÊ·Î ÇÏ¿© ±¸µ¿ */
/* - ±×¸² 9-9 LCDÀÇ ±¸µ¿È¸·Îµµ ÂüÁ¶ÇϽÿÀ - */
/***************************************************************************/
#include
#define LINE1 0x80
#define LINE2 0xbf
#define LCDIR 0x7600
#define LCDDR 0x7601
data unsigned char hour,min,sec,msec;
void Init_T0(void)
{
TMOD = 0x01; /* timer_0 mode 1¼³Á¤ */
TR0 = 1; /* timer_0 counting start */
EA = 1; /* interrupt all bit on */
ET0 = 1; /* timer_0 interrupt Çü¼º */
}
interrupt[0x0b] void T0_int(void) /* timer_0 interrupt serve rutine Çü¼º */
{
TH0 = 0x3c; /* counting cycle °áÁ¤ */
TL0 = 0xb0;
msec++;
if(msec >= 20) /* msec¸¦ 20¹ø ºÎ¸£¸é 1ÃÊ */
{
msec=0;
sec++;
}
if(sec >= 60) /* sec¸¦ 60¹ø ºÎ¸£¸é 1ºÐ */
{
sec=0;
min++;
}
if(min >= 60) /* minÀ» 60¹ø ºÎ¸£¸é 1½Ã°£ */
{
min=0;
hour++;
}
if(hour >= 24) /* hour¸¦ 24¹ø ºÎ¸£¸é 1ÀÏ */
hour=0;
}
void lcd_delay(int p)
{
int i;
for(i=0;i
}
void lcd_busy()
{
lcd_delay(100);
}
void lcd_init()
{
write_XDATA(LCDIR,0x38);lcd_busy();
write_XDATA(LCDIR,0x0e);lcd_busy();
write_XDATA(LCDIR,0x02);lcd_busy();
write_XDATA(LCDIR,0x01);lcd_busy();
}
void lcd_house(int a)
{
write_XDATA(LCDIR,a);
lcd_busy();
}
void lcd_clear()
{
int i;
write_XDATA(LCDIR,0x01);
for(i=0;i<100;i++);
}
void char_out(char s)
{
int i;
write_XDATA(LCDDR,s);
for(i=0;i<100;i++);
}
void string_out(char *str)
{
int i=0;
do{
char_out(str[i]);
}while(str[++i]!=0);
}
void x_y_position(char x,char y)
{
int i;
unsigned char position;
if(y>1)y=1;
if(x>15)x=15;
position=y ? x+0xc0 : x + 0x80;
write_XDATA(LCDIR,position);
for(i=0;i<100;i++);
}
void lcd_num(unsigned char num)
{
unsigned char buf;
buf = num/10;
num %= 10;
char_out(buf + 0x30);
char_out(num + 0x30);
}
void main(void)
{
Init_T0( );
lcd_init();
lcd_clear();
msec=sec=min=hour=0;
while(1)
{
if(msec==0)
{
x_y_position(0,0);
string_out(" H :M :S ");
lcd_house(LINE2 + 1);lcd_num(hour);char_out(':');
lcd_house(LINE2 + 4);lcd_num(min);char_out(':');
lcd_house(LINE2 + 7);lcd_num(sec);char_out(':');
}
}
}
|
|
 |
|