PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Anh chị cho em hỏi cách ghi data vào eprom của Pic16f877a (http://www.picvietnam.com/forum/showthread.php?t=11036)

vanchang1987 03-09-2011 01:25 PM

Anh chị cho em hỏi cách ghi data vào eprom của Pic16f877a
 
Chào anh chị!
Số là em đang viết code đồng hồ thời gian thực dùng ds1307+pic16f887a+lcd 1602. em viết nó chạy rồi mà giờ em muốn làm thêm phần hẹn giờ. Nhưng e ko biết ghi vào eprom để khi mất điện nó còn còn giờ đã hẹn:

Đây là code của em:
- main.c
#include <main.h>
#include <def_877a.h>
#include <ds1307.h>
#include <ds1307.c>
#include <lcd_lib_4bit.c>

#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)

#define seconds gca_ds1307_regs[0]
#define munites gca_ds1307_regs[1]
int8 hours=(gca_ds1307_regs[2]&0x1f);
#define hours_mode gca_ds1307_regs[2]
#define days gca_ds1307_regs[3]
#define dates gca_ds1307_regs[4]
#define months gca_ds1307_regs[5]
#define years gca_ds1307_regs[6]
#define radc read_adc()
void clock_menu(int8 chon);

#define k1 rb4
#define k2 rb5
#define k3 rb6
#define k4 rb7

INT16 k,adc;

char do_letter[8]={2,5,2,0,0,0,0,0};
char cusor[8]={8,12,14,15,14,12,8,0};

void change_days(int8 x);
void change_dates(int8 x);

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void info()
{
lcd_gotoxy(1,1);
lcd_putchar("Real Time Clock");
lcd_gotoxy(2,0);
lcd_putchar("Designed:LeChang");
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void i2c_dislay()
{
lcd_gotoxy(1,2);
switch(days)
{
case 1: Printf(LCD_putchar,"Sun"); break;
case 2: Printf(LCD_putchar,"Mon"); break;
case 3: Printf(LCD_putchar,"Tue"); break;
case 4: Printf(LCD_putchar,"Wen"); break;
case 5: Printf(LCD_putchar,"Thu"); break;
case 6: Printf(LCD_putchar,"Fri"); break;
case 7: Printf(LCD_putchar,"Sat"); break;
}
lcd_putchar(' ');
lcd_putchar(48+dates/10);
lcd_putchar(48+dates%10);
lcd_putchar('/');
lcd_putchar(48+months/10);
lcd_putchar(48+months%10);
lcd_putchar('/');
lcd_putchar("20");
lcd_putchar(48+years/10);
lcd_putchar(48+years%10);

lcd_gotoxy(2,1);
if(bit_test(hours_mode,5)) lcd_putchar("PM");
else lcd_putchar("AM");

lcd_gotoxy(2,4);
lcd_putchar(48+hours/10);
lcd_putchar(48+hours%10);
lcd_putchar(':');
lcd_putchar(48+munites/10);
lcd_putchar(48+munites%10);
lcd_putchar(':');
lcd_putchar(48+seconds/10);
lcd_putchar(48+seconds%10);
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void set_days()
{
if(k2==0)
{
delay_ms(200);
days++;
if(days>7) days=1;
}

if(k3==0)
{
delay_ms(200);
days--;
if(days<1||dates==255) days=7;
}

lcd_gotoxy(1,1);
lcd_putchar("Change Day:");
lcd_gotoxy(1,13);
switch(days)
{
case 1: Printf(LCD_putchar,"Sun"); break;
case 2: Printf(LCD_putchar,"Mon"); break;
case 3: Printf(LCD_putchar,"Tue"); break;
case 4: Printf(LCD_putchar,"Wen"); break;
case 5: Printf(LCD_putchar,"Thu"); break;
case 6: Printf(LCD_putchar,"Fri"); break;
case 7: Printf(LCD_putchar,"Sat"); break;
}
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void set_dates() // cai dat ngay
{
if(k2==0)
{
delay_ms(200);
dates++;
if(months==1||months==3||months==5||months==7||
months==8|| months==10||months==12)
{
if(dates>31) dates=1;
}
else if(months==2)
{
if(dates>28) dates=1;
}
else if(dates>30) dates=1;
}

if(k3==0)
{
delay_ms(200);
dates--;
if(dates<1||dates==255)
{
if(months==1||months==3||months==5||months==7||
months==8|| months==10||months==12)
dates=31;
else if(months==2) dates=28;
else dates=30;
}
}

lcd_gotoxy(1,1);
lcd_putchar("Change Date:");
lcd_gotoxy(1,14);
lcd_putchar(48+dates/10);
lcd_putchar(48+dates%10);
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void set_months()
{
if(k2==0)
{
delay_ms(200);
months++;
if(months>12) months=1;
}

if(k3==0)
{
delay_ms(200);
months--;
if(months<1||months==255) months=12;
}

lcd_gotoxy(1,1);
lcd_putchar("Change Month:");
lcd_gotoxy(1,15);
lcd_putchar(48+months/10);
lcd_putchar(48+months%10);
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void set_years()
{
if(k2==0)
{
delay_ms(200);
years++;
if(years>99) years=0;
}

if(k3==0)
{
delay_ms(200);
years--;
if(years==255) years=99;
}

lcd_gotoxy(1,1);
lcd_putchar("Change Year:");
lcd_gotoxy(1,13);
lcd_putchar("20");
lcd_putchar(48+years/10);
lcd_putchar(48+years%10);
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void set_hours()
{

if(k2==0)
{
delay_ms(200);
hours++;
if(hours>12) {hours=1;bit=!bit;}
}

if(k3==0)
{
delay_ms(200);
hours--;
if(hours<1||hours==255) {hours=12;bit=!bit;}
}

lcd_gotoxy(1,1);
lcd_putchar("Change Hour:");
lcd_gotoxy(1,13);
lcd_putchar(48+hours/10);
lcd_putchar(48+hours%10);
if(bit) lcd_putchar("PM");
else lcd_putchar("AM");
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void set_munites()
{
if(k2==0)
{
delay_ms(200);
munites++;
if(munites>59) munites=0;
}

if(k3==0)
{
delay_ms(200);
munites--;
if(munites==255) munites=59;
}

lcd_gotoxy(1,1);
lcd_putchar("Change minute:");
lcd_gotoxy(1,15);
lcd_putchar(48+munites/10);
lcd_putchar(48+munites%10);
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

void set_seconds()
{
seconds=0;
lcd_gotoxy(1,1);
lcd_putchar("Change Second:");
lcd_gotoxy(1,15);
lcd_putchar(48+seconds/10);
lcd_putchar(48+seconds%10);
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

/*void update_date()
{
trisb=0xff;
set_days();
set_dates();
set_months();
set_years();
set_hours();
set_munites();
set_seconds();
if(k1==0)
{
delay_ms(200);
lcd_clear();
ds1307_set_date_time();
}
}*/

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++


void update_date()
{
if(k1==0)
{
delay_ms(100);
while(k1==0);
goto loop;
while(true)
{
while(k1==1);

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
loop: lcd_clear();
while(k1==1)
{
lcd_gotoxy(1,1);
lcd_putchar(1);
clock_menu(1);

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
while(k4==1)
{
set_years();
}
}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(1,8);
lcd_putchar(1);
clock_menu(1);

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
while(k4==1)
{
set_months();
}
}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(2,1);
lcd_putchar(1);
clock_menu(1);

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
while(k4==1)
{
set_dates();
}
}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(2,8);
lcd_putchar(1);
clock_menu(1);

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
while(k4==1)
{
set_days();
}
}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(1,1);
lcd_putchar(1);
clock_menu(2);

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
bit=bit_test(hours_mode,5);
while(k4==1)
{
set_hours();
}
hours_mode=hours;
if(bit==1) bit_set(hours_mode,5);
//else bit_clear(hours_mode,5);

}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
lcd_clear();
while(k1==0);
while(k1==1)
{
lcd_gotoxy(1,8);
lcd_putchar(1);
clock_menu(2);

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
while(k4==1)
{
set_munites();
}
}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(2,1);
lcd_putchar(1);
clock_menu(2);

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
while(k4==1)
{
set_seconds();
}
}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(2,8);
lcd_putchar(1);
clock_menu(2);

if(k4==0)
{
delay_ms(100);
lcd_clear();
while(k4==0);
while(k4==1)
{
info();
}
}

if(k4==0)
{
delay_ms(100);
while(k4==0);
lcd_clear();
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(1,1);
lcd_putchar(1);
clock_menu(3);

if(k4==0)
{
goto exit1;
}

if(k4==0)
{
delay_ms(100);
lcd_clear();
while(k4==0);
//break;
}
}
}

if(k1==0)//////////////////////////////////////////////////////////////
{
delay_ms(100);
while(k1==0);
lcd_clear();
while(k1==1)
{
lcd_gotoxy(2,1);
lcd_putchar(1);
clock_menu(3);

if(k4==0)
{
goto exit;
}

if(k4==0)
{
delay_ms(100);
lcd_clear();
while(k4==0);
//break;
}
}
}
}


exit:
delay_ms(200);
ds1307_set_date_time();
exit1:
lcd_clear();
break;
}


}

void adc_init()
{
Setup_ADC(ADC_CLOCK_INTERNAL);
Setup_ADC_ports(AN0);
Set_ADC_channel(0);
}

void lm35_dislay()
{
//adc=(radc*5.00*100.00)/1023.00;
//lcd_gotoxy(2,3);
//lcd_putchar(48+adc/1000);
lcd_gotoxy(2,13);
lcd_putchar(48+(int8)adc/10);
lcd_putchar(48+adc%10);
lcd_putchar(0);
lcd_putchar('C');
}

void clock_menu(int8 chon)
{
if(chon==1)
{
lcd_gotoxy(1,2);
lcd_putchar("1.Year");

lcd_gotoxy(1,9);
lcd_putchar("2.Month");

lcd_gotoxy(2,2);
lcd_putchar("3.Date");

lcd_gotoxy(2,9);
lcd_putchar("4.Day");
}

else if(chon==2)
{
lcd_gotoxy(1,2);
lcd_putchar("5.Hour");

lcd_gotoxy(1,9);
lcd_putchar("6.Min");

lcd_gotoxy(2,2);
lcd_putchar("7.Sec");

lcd_gotoxy(2,9);
lcd_putchar("8.About");
}

else
{
lcd_gotoxy(1,2);
lcd_putchar("9.Just Exit");
lcd_gotoxy(2,2);
lcd_putchar("10.Set And Exit");
}


}

void main()
{
trisa = 0xFF;
trisb = 0xff;
//trisd = 0x00;
rd1=0;

adc_init();
LCD_init();
CreateCustomChar(0,do_letter);
CreateCustomChar(1,cusor);

info();
delay_ms(1000);
lcd_clear();

WHILE(TRUE)
{
adc=(radc*5.00*100.00)/1023.00;
for(k=0;k<20;k++)
{
update_date();
ds1307_read_date_time();
i2c_dislay();
lm35_dislay();
}
}
}

-lcd_lib_4bit.c
#include <stddef.h>

#define LCD_RS PIN_D0
#define LCD_RW PIN_D1
#define LCD_EN PIN_D2

#define LCD_D4 PIN_D3
#define LCD_D5 PIN_D4
#define LCD_D6 PIN_D5
#define LCD_D7 PIN_D6

// misc display defines-
#define Line_1 0x80
#define Line_2 0xC0
#define Clear_Scr 0x01

// prototype statements
#separate void LCD_Init ( void );// ham khoi tao LCD
#separate void LCD_SetPosition ( unsigned int cX );//Thiet lap vi tri con tro
#separate void LCD_PutChar ( unsigned int cX );// Ham viet1kitu/1chuoi len LCD
#separate void LCD_PutCmd ( unsigned int cX) ;// Ham gui lenh len LCD
#separate void LCD_PulseEnable ( void );// Xung kich hoat
#separate void LCD_SetData ( unsigned int cX );// Dat du lieu len chan Data
#separate void LCD_gotoxy(unsigned char row, unsigned char col);

// D/n Cong
#use standard_io (C)
#use standard_io (D)

//khoi tao LCD**********************************************
#separate void LCD_Init ( void )
{
LCD_SetData ( 0x00 );
delay_ms(200); /* wait enough time after Vdd rise >> 15ms */
output_low ( LCD_RS );// che do gui lenh
LCD_SetData ( 0x03 ); /* init with specific nibbles to start 4-bit mode */
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 ); /* set 4-bit interface */
LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */
LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */
LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */
LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */
LCD_PutCmd ( 0x01 ); /* clear display */
delay_ms(300);
}

#separate void LCD_SetPosition ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}

#separate void LCD_PutChar ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
output_high ( LCD_RS );
LCD_PutCmd( cX );
output_low ( LCD_RS );
}

#separate void LCD_PutCmd ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
}
#separate void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 3 ); // was 10
output_low ( LCD_EN );
delay_ms ( 3 ); // was 5
}

#separate void LCD_SetData ( unsigned int cX )
{
output_bit ( LCD_D4, cX & 0x01 );
output_bit ( LCD_D5, cX & 0x02 );
output_bit ( LCD_D6, cX & 0x04 );
output_bit ( LCD_D7, cX & 0x08 );
}
#separate void LCD_gotoxy(unsigned char hang, unsigned char cot)
{
if(hang==1) lcd_setposition(cot-1);
if(hang==2) lcd_setposition(63+cot);
}

#separate void LCD_clear()
{
LCD_PUTCMD(0X01);
}

#separate void CreateCustomChar(char charIndex,char *charBitmap)
{
char CGRAMptr;
char index;

if (charIndex > 7) /* check for index validity */
return;

CGRAMptr= 0x40 + charIndex * 8; /* calculate start address based on index */

for(index=0;index<8;index++)
{
lcd_putcmd(CGRAMptr++);
lcd_putchar(charBitmap[index]);
}
}

/* Example
char CHUAW[]={0x0A,0x04,0x0E,0x01,0x0F,0x11,0x0F,0x00},
CHUAWHOI[]={0x06,0x0E,0x04,0x0E,0x01,0x0F,0x11,0x0F},
CHUEE[]={0x00,0x04,0x0A,0x0E,0x11,0x1E,0x0E,0x00};

CreateCustomChar(0,CHUAW);
CreateCustomChar(1,CHUAWHOI);
CreateCustomChar(2,CHUEE);
lcd_gotoxy(1,1);
Printf(LCD_putchar," L");
LCD_putchar(2);
Printf(LCD_putchar," V");
LCD_putchar(0);
LCD_putchar("n");
Printf(LCD_putchar," Ch");
LCD_putchar(1);
Printf(LCD_putchar,"ng");*/

Cảm ơn!

vanchang1987 06-09-2011 12:06 AM

sao ko ai giúp em hết zj!

nhanh0112 06-09-2011 10:48 AM

Trích:

Nguyên văn bởi vanchang1987 (Post 49336)
sao ko ai giúp em hết zj!

Nhìn code la lá giống CCS. Nếu đúng là CCS thì:
- ghi :write_eeprom (address, value)
- đọc:value = read_eeprom (address)


Múi giờ GMT. Hiện tại là 03:55 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam