Tùy chỉnh char LCD Displa sử dụng PIC16F877

F

flystehu

Guest
Hullo,
Tôi cố gắng để hiển thị các ký tự tùy chỉnh trên LCD sử dụng PIC 16F877.
Trình biên dịch tôi đang sử dụng là IAR.
Khi tôi biên dịch, nó là ok.Hewever, khi thực hiện chương trình và sản xuất các hex..
Một lỗi đi ra, nói:

Làm tiêu chí ...
Liên kết ...
Lỗi [e104]: Không để phù hợp với tất cả các phân đoạn trong phạm vi chỉ định.Sự phát hiện tại OVERLAY0 phân đoạn.Không thể đặt 3 khối (s) (0x95 byte (s) tổng số) trong 0x5a byte (s) của bộ nhớ.Vấn đề xảy ra khi xử lý các lệnh theo vị trí phân đoạn "-P (DATA) OVERLAY0, WRKSEG, BANK0_I, BANK0_Z, BANK0_N = 20-07F", nơi ở thời điểm của vị trí trong phạm vi bộ nhớ có sẵn là "20-79"

Tổng số lỗi: 1
Tổng số cảnh báo: 0

Bất cứ ai cũng có thể giúp tôi chỉ ra cách sửa chữa các lỗi?
là nó vì bộ nhớ trong của PIC là chạy ra?

//------------------------------------------------ -----
void load_CGRAM_1 (int * p)
(
int i;
LCD_RS = 0;
lcd_write (0x40);
LCD_RS = 1;
for (i = 0; i <32; i )
lcd_write (p );
)
//------------------------------------------------ -----
void load_CGRAM_2 (int * p)
(
int i;
LCD_RS = 0;
lcd_write (0x60);
LCD_RS = 1;
for (i = 0; i <32; i )
lcd_write (p );
)
//------------------------------------------------ ----------------
void display_CGRAM (int code1, int code2, int code3, int code4)
(
LCD_RS = 0;
lcd_write (0x80);
lcd_putch (code1);
lcd_putch (code2);

lcd_putch (0x20); / / không gian
lcd_putch (0x20); / / không gian
lcd_putch (code3);
lcd_putch (code4);
)

//------------------------------------------------ ----------------
void main ()
(
int chinese_character_matrix_1 [32] =
(
0x02, 0x02, 0x04, 0x0c, 0x14, 0x04, 0x04, 0x04,
0x04, 0x04, 0x1f, 0x04, 0x0e, 0x15, 0x1f, 0x15,
0x01, 0x00, 0x07, 0x01, 0x01, 0x03, 0x00, 0x07,
0x18, 0x10, 0x1e, 0x08, 0x18, 0x1c, 0x10, 0x1e,
);
int chinese_character_matrix_2 [32] =
(
0x02, 0x02, 0x04, 0x0c, 0x14, 0x04, 0x04, 0x04,
0x04, 0x04, 0x1f, 0x04, 0x0e, 0x15, 0x1f, 0x15,
0x04, 0x04, 0x10, 0x08, 0x00, 0x05, 0x09, 0x13,
0x0e, 0x0a, 0x0e, 0x0a, 0x0e, 0x1f, 0x15, 0x15,
);

int chinese_character_matrix_3 [32] =
(
0x00, 0x01, 0x04, 0x02, 0x0a, 0x0a, 0x09, 0x08,
0x00, 0x00, 0x08, 0x00, 0x02, 0x02, 0x02, 0x1e,
0x0f, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x0b, 0x11,
0x04, 0x0f, 0x0a, 0x0a, 0x0f, 0x0a, 0x0a, 0x17,
);
int chinese_character_matrix_4 [32] =
(
0x04, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x0c, 0x07,
0x0e, 0x00, 0x1f, 0x08, 0x0a, 0x0f, 0x00, 0x1f,
0x0e, 0x00, 0x1f, 0x08, 0x08, 0x0a, 0x0a, 0x0f,
0x04, 0x04, 0x1f, 0x05, 0x05, 0x05, 0x05, 0x0b,
);iniPort ();
lcd_init ();

load_CGRAM_1 (chinese_character_matrix_1);
load_CGRAM_2 (chinese_character_matrix_2);
display_CGRAM (0x04, 0x05, 0x06, 0x07);

DelayUs (40);
trong khi (1) ()
)

 
instead of int
.

Bạn đã bao giờ xem xét để khai báo mảng của bạn như unsigned char
thay vì int.Điều này sẽ giảm một nửa mức tiêu thụ ROM và tôi nghĩ rằng không cần thiết cho các số nguyên., so that they are used from ROM and don't get copied to the RAM.

Hơn nữa, bạn nên khai báo các mảng như là const,
do đó chúng được sử dụng từ ROM và không được sao chép vào RAM.
Ví dụ:
const unsigned char chinese_character_matrix_1 [32] =
(
...
)

(Không bao giờ được sử dụng IAR, do đó, không chắc là đúng cú pháp cho IAR -> RTFM)

 
Cảm ơn bạn.Tôi tuyên bố mảng như là char unsigned const và đặt nó bên ngoài chức năng chính.Nó hoạt động hoàn hảo!

M! K đã viết:

instead of int
.
Bạn đã bao giờ xem xét để khai báo mảng của bạn như unsigned char
thay vì int.

Điều này sẽ giảm một nửa mức tiêu thụ ROM và tôi nghĩ rằng không cần thiết cho các số nguyên.

, so that they are used from ROM and don't get copied to the RAM.
Hơn nữa, bạn nên khai báo các mảng như là const,
do đó chúng được sử dụng từ ROM và không được sao chép vào RAM.

Ví dụ:

const unsigned char chinese_character_matrix_1 [32] =

(

...

)(Không bao giờ được sử dụng IAR, do đó, không chắc là đúng cú pháp cho IAR -> RTFM)
 

Welcome to EDABoard.com

Sponsor

Back
Top