Trích:
Nguyên văn bởi nguyenhung1811
ban cho minh xin doan chuong trinh ma ban viet nhe'. Minh viet mai ma` chi co ghi duoc thoi. ko doc du lieu duoc.
|
Giờ mình viết xong rồi đây! Không biết gửi File đính kèm như thế nào cả, đành post cả chương trình trình lên vậy! Anh em thông cảm nha!
Tuy dùng Proteus mô phỏng ngon lành, nhưng mình test trên mạch thật thì gặp vấn đề này không giải thích được! Mong anh em giúp đỡ.
Mình đặt giá trị cho DS1307: setDateDs1307(01, 02, 03, 04, 05, 06, 07);
với mục đích hiển thị trên LCD là: Time: 03:02:01 Date: 05:06:07
Nhưng trên LCD lại hiển thị: Time: 05:03:00 Date: 07:00:00
Hic! Hiển thị sai rồi! Biết làm sao đây???
Code:
////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9)
#use i2c(Master,Fast,sda=PIN_A1,scl=PIN_A0)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define DS1307_SDA PIN_A1
#define DS1307_SCL PIN_A0
//************************************************
int8 val_sec1, val_min1, val_hou1, val_dat1, val_mon1, val_yea1;
int8 val_sec2, val_min2, val_hou2, val_dat2, val_mon2, val_yea2;
//************************************************
void display_lcd();
//************************************************
#int_ext // Khai bao chuong trinh ngat
RB0_isr() {
display_lcd();
return input(PIN_B1);
}
//**********************************************
int8 decToBcd(int8 val) {
return ( (val/10*16) + (val%10) );
}
//***********************************
int8 bcdToDec1(int8 val) { //Tach lay so hang chuc
return (val/16*10);
}
//***********************************
int8 bcdToDec2(int8 val) { //Tach lay so hang don vi
return (val%16);
}
//***********************************
void init_DS1307() {
output_float(DS1307_SCL); //Bus free
output_float(DS1307_SDA); //Bus free
}
//***********************************
void write_DS1307(byte address, byte data) {
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xd0);
while(status==1)
{
i2c_start();
status=i2c_write(0xd0);
}
}
//***********************************
BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return(data);
}
//***********************************
void setDateDs1307(int8 second, // 0-59
int8 minute, // 0-59
int8 hour, // 1-23
int8 dayOfWeek, // 1-7
int8 dayOfMonth, // 1-28/29/30/31
int8 month, // 1-12
int8 year) // 0-99
{
write_DS1307(0x0, decToBcd(second));
delay_ms(10);
write_DS1307(0x1, decToBcd(minute));
delay_ms(10);
write_DS1307(0x2, decToBcd(hour));
delay_ms(10);
write_DS1307(0x3, decToBcd(dayOfWeek));
delay_ms(10);
write_DS1307(0x4, decToBcd(dayOfMonth));
delay_ms(10);
write_DS1307(0x5, decToBcd(month));
delay_ms(10);
write_DS1307(0x6, decToBcd(year));
}
//***********************************
void display_lcd() {
LCD_putcmd(0x80);
Printf(LCD_putchar,"Time: ");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Date:");
//*******************************************
val_sec1 = bcdToDec1(read_DS1307(0x00)); //So giay hang chuc
val_sec2 = bcdToDec2(read_DS1307(0x00)); //So giay hang don vi
val_min1 = bcdToDec1(read_DS1307(0x01));
val_min2 = bcdToDec2(read_DS1307(0x01));
val_hou1 = bcdToDec1(read_DS1307(0x02));
val_hou2 = bcdToDec2(read_DS1307(0x02));
val_dat1 = bcdToDec1(read_DS1307(0x04));
val_dat2 = bcdToDec2(read_DS1307(0x04));
val_mon1 = bcdToDec1(read_DS1307(0x05));
val_mon2 = bcdToDec2(read_DS1307(0x05));
val_yea1 = bcdToDec1(read_DS1307(0x06));
val_yea2 = bcdToDec2(read_DS1307(0x06));
//*******************************************
//In lan luot cac so ra LCD
LCD_putcmd(0x8E);
Printf(LCD_putchar,"%u",val_sec1);
LCD_putcmd(0x8F);
Printf(LCD_putchar,"%u",val_sec2);
LCD_putcmd(0x8A);
Printf(LCD_putchar,"%u:",val_min1);
LCD_putcmd(0x8B);
Printf(LCD_putchar,"%u:",val_min2);
LCD_putcmd(0x86);
Printf(LCD_putchar,"%u:",val_hou1);
LCD_putcmd(0x87);
Printf(LCD_putchar,"%u:",val_hou2);
LCD_putcmd(0xC6);
Printf(LCD_putchar,"%u/",val_dat1);
LCD_putcmd(0xC7);
Printf(LCD_putchar,"%u/",val_dat2);
LCD_putcmd(0xCA);
Printf(LCD_putchar,"%u/",val_mon1);
LCD_putcmd(0xCB);
Printf(LCD_putchar,"%u/",val_mon2);
LCD_putcmd(0xCE);
Printf(LCD_putchar,"%u",val_yea1);
LCD_putcmd(0xCF);
Printf(LCD_putchar,"%u",val_yea2);
}
//***********************************
void main()
{
set_tris_b (0x01);
set_tris_d (0x00);
output_b (0x00);
output_c (0x00);
output_d (0x00);
LCD_init(); //Khoi tao LCD
LCD_putcmd(0x80);
Printf(LCD_putchar,"Time: ");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Date:");
init_DS1307(); //Khoi tao DS1307
write_DS1307(0x07, 0x90); //Cau hinh thanh ghi cua DS1307
setDateDs1307(01, 02, 03, 04, 05, 06, 07); //Vi du Time: 03:02:01 Date: 05:06:07
enable_interrupts(GLOBAL);
enable_interrupts(INT_ext);
while (1)
{
}
}
//************************************************** **
////////////////////////////////////////////////////////////////////////////////
//************************************************** **