Write-Read internal EEPROM PIC16F877A

Write-Read internal EEPROM PIC16F877A, sử dụng EEPROM nội của vi điều khiển pic16f877A để ghi-đọc dữ liệu.

 EEPROM viết tắt của từ Electrically Erasable Programmable Read-Only Memory là loại chip nhớ không mất dữ liệu khi bị mất điện (non-volatile storage), dùng để lưu trữ một lượng dữ liệu nhỏ và thay đổi nội dung được. EEPROM là công nghệ mới nhất của ROM ( Read-Only Memory) mà điều khác biệt cơ bản là chúng có khả năng xóa được bằng phương pháp lập trình mà không cần đến các thiết bị chuyên dụng như các thế hệ trước của nó. Bằng cách sử dụng EEPROM (hoặc flash ROM) người ta có thể dễ dàng xóa các chương trình được nạp trên nó mà không cần thêm một thao tác cơ học nào khác. EEPROM còn giúp các thiết bị khác như card mạng, card đồ họa, bộ định tuyến, điện thoại, thiết bị giải trí số cá nhân… có thể nâng cấp firmware mà không cần thay đổi chip nhớ, việc mà trước kia người ta thường thực hiện bằng cách gắn chip nhớ  trên các đế để có thể thay thế sau này bằng cách gỡ bỏ chúng và thay bằng chip khác. Đối với vi điều khiển PIC 16F877A có EEPROM lên đến 256 x 8 bytes, có thể xóa/ghi (erase/write) lên đến 1000.000 lần và nội dung bên trong nó có thể được lưu trữ trên 40 năm. Trong phạm vi project Write-Read internal EEPROM PIC16F877A này ta thực hiện việc ghi một nội dung vào một địa chỉ của eeprom trên vi điều khiển 16f877a và sau đó đọc và hiển thị nội dung đó lên màn hình LCD.

   Mô tả project: Ta sử dụng một button (+) để tăng giá trị biến i, ghi giá trị này vào bộ nhớ nội của vi điều khiển (internal eeprom) và sau đó sử dụng một button (READ) để ra lệnh đọc giá trị của biến i đó và hiển thị ra LCD. Như vậy, ở đây ta sử dụng các thư viện hàm Button, LCD, Read/Write EEPROM, bạn có thể xem lại các project sau để hiểu rõ hơn về các thư viện này:

Hàm Read/Write EEPROM trong compiler mikroC như sau:

  • EEPROM_Write(unsigned short address, unsigned short data)
  • EEPROM_Read(unsigned short address)

Code hoàn chỉnh của project Write-Read internal EEPROM PIC16F877A:

/*
 *Project name: Write/read internal EEPROM
 *CopyRight:
            (c) giaoan.link, 2019
 *Description:
            Chung ta lam quen voi giao thuc i2c, ghi va doc du lieu tu internal EEPROM,
            moi lam nhan button "+"(ket noi den RB1) gia tri i tang 1 don vi, gia tri nay
            se duoc ghi vao eeprom dia chi 0x01 va hien thi len LCD, khi ta nhan button "READ"
            (ket noi den RB2)se doc gia tri tu dia chi eeproom tren va hien thi ra lcd.
 *Configuration:
            Mivrocontroller: PIC 16F877A
            Oscillator: HS, 08.000 MHz
            Device: proteus diagram
            Compiler: mikroC Pro for Pic ver 6.6.2
 *Website: http://giaoan.link
*/
// LCD module connections
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;
sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections

unsigned char *text, *text1, *ghi[3], *kq[3];
unsigned short i,j;
void main() {
INTCON = 0X88; //Enable GIE, RBIE
TRISB = 0XFF;  //PORTB as input
PORTB = 0X00;  //clear portb
TRISD = 0x00; //Trisd as output
PORTD = 0x00; //Clear portd
text="Project name:";
text1="W/R EEPROM";
i=0;
Lcd_Init(); //Khoi tao LCD
Lcd_Cmd(_LCD_BLINK_CURSOR_ON); //Con tro nhap nhay
Lcd_Out(1,1,text);     //Xuat du lieu tu bien text ra vi tri dong 1, cot 1
Lcd_Out(2,2,text1);     //Xuat du lieu tu bien text ra vi tri dong 2, cot 2
Delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Press + to INC i"); //Xuat chuoi du lieu ra dong 2, cot 2
Lcd_out(2,1,"& Write->EEPROM");
Delay_ms(5000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Press READ to"); //Xuat chuoi du lieu ra dong 2, cot 2
Lcd_out(2,1,"read value EEPROM");
Delay_ms(5000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Value i:"); //Xuat chuoi du lieu ra dong 2, cot 2
Lcd_out(2,1,"Value EEPROM:");
Lcd_cmd(_LCD_FIRST_ROW);
Lcd_cmd(_LCD_UNDERLINE_ON);
while(1){
if(button(&portb,1,1,0)){
                     i=i++;
                     delay_ms(10);
                     EEPROM_Write(0x01,i);
                     ghi[2]=(i/100)+48;
                     ghi[1]=((i%100)/10)+48;
                     ghi[0]=((i%100)%10)+48;
                     Lcd_chr(1,14,ghi[2]);
                     Lcd_chr(1,15,ghi[1]);
                     Lcd_chr(1,16,ghi[0]);
                     delay_ms(200);
                     }

if(button(&portb,2,1,0)){
                     j= EEPROM_Read(0x01);
                     delay_ms(20);
                     kq[2]=(j/100)+48;
                     kq[1]=((j%100)/10)+48;
                     kq[0]=((j%100)%10)+48;
                     Lcd_chr(2,14,kq[2]);
                     Lcd_chr(2,15,kq[1]);
                     Lcd_chr(2,16,kq[0]);
                     }
}
}