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!
Mã:
//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
#include
#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,0X09,0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,0X18,0X19,0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,0X28,0X29,0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39,0X40,0X41,0X42,0X43,0X44,0X45,0X46,0X47,0X48,0X49,0X50,0X51,0X52,0X53,0X54,0X55,0X56,0X57,0X58,0X59};
void delay(unsigned int msec )
{
int i ,j ;
for(i=0;i23)
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);
}