matassan
16-04-2013, 10:24 AM
LCD based Digital Clock with 8051 Microcontroller & RTC DS12C887 : Circuit & C Code (http://diendandien.com/links.php?url=http://www.engineersgarage.com/microcontroller/8051projects/lcd-clock-rtc-12c887-AT89C51-update-interrupt-circuit)
Em tình cờ tìm thấy trang web này hướng dẫn làm đồng hồ số sử dụng LCD 16X2 rất đầy đủ. Em là dân ngoại đạo nên không hiểu và chỉ biết bắt chước làm theo mà thôi. layout rồi làm mạch in với em là chuyện nhỏ. Tuy nhiên code thì em thua :-??. Họ có cung cấp code nhưng em dùng C chuyển thành file HEX thì không được các bác ạ! Mong bác nào làm được thì chuyễn giúp em, hoặc hướng dẫn em chuyển với ạ.. Em xin đa tạ các bác!
//Program for an LCD based clock using RTC DS12C887 and 8051 microcontroller (AT89C51) using update interrupt
/*24 hr clock
set p3^3=0,then start=0 them set time by dig_hr1 & dig_min1, then remove p3^3 & start */
#include<reg51.h>
#include<absacc.h>
#define dataport P2
#define port P1
sbit reset = port^0;
sbit rs = port^1;
sbit rw = port^2;
sbit e = port^3;
sbit dig_hr1=port^4;
sbit dig_min1=port^5;
sbit start=port^6;
int hr0 ,hr1=0;
int min0,min1=0;
int sec0,sec1=0;
unsigned char temp,hr,min,sec,num[60]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X0 9,0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,0X18,0X1 9,0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,0X28,0X2 9,0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X3 9,0X40,0X41,0X42,0X43,0X44,0X45,0X46,0X47,0X48,0X4 9,0X50,0X51,0X52,0X53,0X54,0X55,0X56,0X57,0X58,0X5 9};
void delay(unsigned int msec )
{
int i ,j ;
for(i=0;i<msec;i++)
for(j=0; j<1275; j++);
}
void lcd_cmd(unsigned char item)
{
dataport = item;
rs= 0;
rw=0;
e=1;
delay(1);
e=0;
return;
}
// DATA SENDING FUNCTION
void lcd_data(unsigned char item)
{
dataport = item;
rs= 1;
rw=0;
e=1;
delay(1);
e=0;
return;
}
void lcd_data_string(unsigned char *str)
{
int i=0;
while(str[i]!='\0')
{
lcd_data(str[i]);
i++;
delay(1);
}
return;
}
lcd_data_int(int time_val)
{
int int_amt;
int_amt=time_val/10;
lcd_data(int_amt+48);
int_amt=time_val;
lcd_data(int_amt+48);
}
void lcd() // Function to initialize LCD
{
lcd_cmd(0x38);
delay(5);
lcd_cmd(0x0F);
delay(5);
lcd_cmd(0x80);
delay(5);
}
void set_rtc_time() // Function to set time in RTC
{
XBYTE[10]=0x20;
XBYTE[11]=0x82;
XBYTE[0]=0x00;
XBYTE[2]=min;
XBYTE[4]=hr;
XBYTE[7]=0x01;
XBYTE[8]=0x01;
XBYTE[9]=0x10;
XBYTE[1]=0xFF;
XBYTE[3]=0xFF;
XBYTE[5]=0xFF;
XBYTE[11]=0x12;
}
void set_hr1()
{
hr1++;
if(hr1>23)
hr1=0;
lcd_cmd(0xc3);
lcd_data_int(hr1);
lcd_data(':');
hr0=hr1;
}
void set_min1()
{
min1++;
if(min1>59)
min1=0;
lcd_cmd(0xc6);
lcd_data_int(min1);
min0=min1;
}
void set_time() interrupt 2 // Time set
{
lcd_cmd(0x01);
if(start==0)
{
lcd_data_string("SET TIMING");
lcd_cmd(0xc3);
lcd_data_int(hr1);
lcd_data(':');
lcd_data_int(min1);
while(start==0)
{
delay(10);
if(dig_hr1==0)
set_hr1();
if(dig_min1==0)
set_min1();
}
}
lcd_cmd(0x01);
hr=num[hr1];
min=num[min1];
set_rtc_time();
}
bcdconv(unsigned char mybyte)
{
unsigned char x,y;
x= mybyte & 0x0F;
x=x | 0x30;
y= mybyte & 0xF0;
y=y>>4;
y=y | 0x30;
lcd_data(y);
lcd_data(x);
}
void read_rtc_display() interrupt 0 // Alarm interrupt
{
lcd_cmd(0x01);
lcd_cmd(0x80);
lcd_data_string("TIME:");
lcd_cmd(0X87);
reset=0;
reset=1;
XBYTE[11]=0x12;
hr=XBYTE[4];
temp=0x87;
bcdconv(hr);
lcd_data(':');
min=XBYTE[2];
bcdconv(min);
lcd_data(':');
sec=XBYTE[0];
bcdconv(sec);
}
void main()
{
reset=1;
lcd();
XBYTE[10]=0x20;
XBYTE[11]=0x12;
lcd_cmd(0x01);
IE=0x85;
while(1);
}
Em tình cờ tìm thấy trang web này hướng dẫn làm đồng hồ số sử dụng LCD 16X2 rất đầy đủ. Em là dân ngoại đạo nên không hiểu và chỉ biết bắt chước làm theo mà thôi. layout rồi làm mạch in với em là chuyện nhỏ. Tuy nhiên code thì em thua :-??. Họ có cung cấp code nhưng em dùng C chuyển thành file HEX thì không được các bác ạ! Mong bác nào làm được thì chuyễn giúp em, hoặc hướng dẫn em chuyển với ạ.. Em xin đa tạ các bác!
//Program for an LCD based clock using RTC DS12C887 and 8051 microcontroller (AT89C51) using update interrupt
/*24 hr clock
set p3^3=0,then start=0 them set time by dig_hr1 & dig_min1, then remove p3^3 & start */
#include<reg51.h>
#include<absacc.h>
#define dataport P2
#define port P1
sbit reset = port^0;
sbit rs = port^1;
sbit rw = port^2;
sbit e = port^3;
sbit dig_hr1=port^4;
sbit dig_min1=port^5;
sbit start=port^6;
int hr0 ,hr1=0;
int min0,min1=0;
int sec0,sec1=0;
unsigned char temp,hr,min,sec,num[60]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X0 9,0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,0X18,0X1 9,0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,0X28,0X2 9,0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X3 9,0X40,0X41,0X42,0X43,0X44,0X45,0X46,0X47,0X48,0X4 9,0X50,0X51,0X52,0X53,0X54,0X55,0X56,0X57,0X58,0X5 9};
void delay(unsigned int msec )
{
int i ,j ;
for(i=0;i<msec;i++)
for(j=0; j<1275; j++);
}
void lcd_cmd(unsigned char item)
{
dataport = item;
rs= 0;
rw=0;
e=1;
delay(1);
e=0;
return;
}
// DATA SENDING FUNCTION
void lcd_data(unsigned char item)
{
dataport = item;
rs= 1;
rw=0;
e=1;
delay(1);
e=0;
return;
}
void lcd_data_string(unsigned char *str)
{
int i=0;
while(str[i]!='\0')
{
lcd_data(str[i]);
i++;
delay(1);
}
return;
}
lcd_data_int(int time_val)
{
int int_amt;
int_amt=time_val/10;
lcd_data(int_amt+48);
int_amt=time_val;
lcd_data(int_amt+48);
}
void lcd() // Function to initialize LCD
{
lcd_cmd(0x38);
delay(5);
lcd_cmd(0x0F);
delay(5);
lcd_cmd(0x80);
delay(5);
}
void set_rtc_time() // Function to set time in RTC
{
XBYTE[10]=0x20;
XBYTE[11]=0x82;
XBYTE[0]=0x00;
XBYTE[2]=min;
XBYTE[4]=hr;
XBYTE[7]=0x01;
XBYTE[8]=0x01;
XBYTE[9]=0x10;
XBYTE[1]=0xFF;
XBYTE[3]=0xFF;
XBYTE[5]=0xFF;
XBYTE[11]=0x12;
}
void set_hr1()
{
hr1++;
if(hr1>23)
hr1=0;
lcd_cmd(0xc3);
lcd_data_int(hr1);
lcd_data(':');
hr0=hr1;
}
void set_min1()
{
min1++;
if(min1>59)
min1=0;
lcd_cmd(0xc6);
lcd_data_int(min1);
min0=min1;
}
void set_time() interrupt 2 // Time set
{
lcd_cmd(0x01);
if(start==0)
{
lcd_data_string("SET TIMING");
lcd_cmd(0xc3);
lcd_data_int(hr1);
lcd_data(':');
lcd_data_int(min1);
while(start==0)
{
delay(10);
if(dig_hr1==0)
set_hr1();
if(dig_min1==0)
set_min1();
}
}
lcd_cmd(0x01);
hr=num[hr1];
min=num[min1];
set_rtc_time();
}
bcdconv(unsigned char mybyte)
{
unsigned char x,y;
x= mybyte & 0x0F;
x=x | 0x30;
y= mybyte & 0xF0;
y=y>>4;
y=y | 0x30;
lcd_data(y);
lcd_data(x);
}
void read_rtc_display() interrupt 0 // Alarm interrupt
{
lcd_cmd(0x01);
lcd_cmd(0x80);
lcd_data_string("TIME:");
lcd_cmd(0X87);
reset=0;
reset=1;
XBYTE[11]=0x12;
hr=XBYTE[4];
temp=0x87;
bcdconv(hr);
lcd_data(':');
min=XBYTE[2];
bcdconv(min);
lcd_data(':');
sec=XBYTE[0];
bcdconv(sec);
}
void main()
{
reset=1;
lcd();
XBYTE[10]=0x20;
XBYTE[11]=0x12;
lcd_cmd(0x01);
IE=0x85;
while(1);
}