Hiện tại em đang làm đồ án về xuất nhập mật khẩu , và em dự định dùng EEPROM nội trong ATmega16 để ghi và truy xuất mật khẩu .
Thuật toán của em là :
- Khai báo một mảng trống trong eeprom tên là a[] ( không định địa trỉ trong EEPROM )
- Kiểm tra :
+ (1) Nếu mảng a[] không có dữ liệu , tiến hành nhập dữ liệu ( mật khẩu 6 số ) , bằng cách quét ma trận phím và lưu ký tự của phím vào mảng a[]
+ (2) Nếu mảng a[] có dữ liệu , tiến hành quét phím , lưu giá trị vào một mảng b[] và so sánh với a[] , nếu đúng => mk đúng , còn không thì ngược lại .
*Khó khăn của em :
- Chưa hiểu rõ cách khai báo một mảng trong EEPROM , không biết đúng hay sai .
- Không biết giá trị của các phần tử của a[] trong EEROM khi chưa gán giá trị , mặc định bằng bao nhiêu .
- Mô Phỏng bằng Proteus , vi điều khiển luôn chuyển sang (2) tức là đã có dữ liệu sẵn trong EEPROM rồi .
- Không hiểu khi khởi động con chip nhiều lần , mảng a[] có chỉ đúng vào địa chỉ lần đầu tiên của nó hay không , hay lại chuyển sang một vùng địa chỉ khác trong eeprom
Rất mong các bác đọc CODE dưới đây em viết và giải thích cho em . Em mới lần mò học AVR nên nhiều cái không rõ lắm .
Sau đây là phần Code chính
Thuật toán của em là :
- Khai báo một mảng trống trong eeprom tên là a[] ( không định địa trỉ trong EEPROM )
- Kiểm tra :
+ (1) Nếu mảng a[] không có dữ liệu , tiến hành nhập dữ liệu ( mật khẩu 6 số ) , bằng cách quét ma trận phím và lưu ký tự của phím vào mảng a[]
+ (2) Nếu mảng a[] có dữ liệu , tiến hành quét phím , lưu giá trị vào một mảng b[] và so sánh với a[] , nếu đúng => mk đúng , còn không thì ngược lại .
*Khó khăn của em :
- Chưa hiểu rõ cách khai báo một mảng trong EEPROM , không biết đúng hay sai .
- Không biết giá trị của các phần tử của a[] trong EEROM khi chưa gán giá trị , mặc định bằng bao nhiêu .
- Mô Phỏng bằng Proteus , vi điều khiển luôn chuyển sang (2) tức là đã có dữ liệu sẵn trong EEPROM rồi .
- Không hiểu khi khởi động con chip nhiều lần , mảng a[] có chỉ đúng vào địa chỉ lần đầu tiên của nó hay không , hay lại chuyển sang một vùng địa chỉ khác trong eeprom
Rất mong các bác đọc CODE dưới đây em viết và giải thích cho em . Em mới lần mò học AVR nên nhiều cái không rõ lắm .
Sau đây là phần Code chính
Code:
#include <mega16.h> #include <stdio.h> #include <delay.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm #include <lcd.h> #define KEYPAD_DDR DDRB #define KEYPAD_PORT PORTB #define KEYPAD_PIN PINB unsigned char hang[4]={0x0E,0x0D,0x0B,0x07}; unsigned char matran[4][4]= {'7','8','9','/', '4','5','6','*', '1','2','3','-', 'N','0','=','+'}; unsigned char key=0; unsigned char checkpad(); int t=0; int x=0; eeprom unsigned char a[6] ; unsigned char b[6]; void main(void) { KEYPAD_PORT=0x0f;// Khoi tao cac Port cua chip cho viec quet led KEYPAD_DDR=0xf0; lcd_init(16); _lcd_ready(); /*********** Vong lap kiem tra cac gia tri cua mang a[] trong eeprom*******************/ for(t=0;t<6;t++) { if(a[t]==0) x++; } // Neu x=6 => mang a[]=0 voi moi (t)=> eeprom chua duoc nap du lieu // neu x!=0 => eeprom da duoc nap du lieu if(x==6) // Khi mang a[]=0 voi moi gia tri (t) , bat dau qua trinh nap du lieu vao eeprom { lcd_putsf("Chua co MK "); delay_ms(500); lcd_clear(); lcd_putsf(" Moi ban dat MK "); delay_ms(500); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("MK gom 6 so "); lcd_gotoxy(0,1); /********************** Vong lap nap du lieu cho eeprom**************************/ for(t=0;t<6;t++) { do { key=checkpad(); if(key)lcd_putchar(key); } while(!key); key=a[t]; _lcd_write_data(0x06); delay_ms(500); } if(t==6)delay_ms(500); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("ban da nhap xong mat khau"); /***********************Ket thuc viec nap du lieu*********************************/ } else { lcd_putsf("Moi ban dat mat khau"); delay_ms(2000); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Mk gom 6 so : "); lcd_gotoxy(0,1); for(t=0;t<6;t++) { do { key=checkpad(); if(key!=0)lcd_putchar(key); } while(!key); key=b[t]; _lcd_write_data(0x06); delay_ms(500); } if(t==6)delay_ms(500); lcd_clear(); lcd_gotoxy(0,0); t=0; while((a[t]==b[t])&&(t<6)) { t++; } if(t==5) lcd_putsf("ban da nhap dung mk "); else lcd_putsf("ban da nhap sai mk"); } } unsigned char checkpad() { int i,j,keyin; for(i=0;i<4;i++) { KEYPAD_PORT=0xff-(1<<(i+4)); delay_ms(10); keyin=KEYPAD_PIN&0x0f; if(keyin!=0x0f) { for(j=0;j<4;j++) if(keyin==hang[j]) return matran[j][i]; } } return 0; }
Comment