Điểm đầu tiên là cách định trang chương trình. Ở 8051, khi cần gọi (CALL) Subroutine hay nhảy đến một nhãn nào đó, ta có thể dùng các lệnh như LCALL hay LJMP là có thể chuyển đến bất kỳ vị trí nào trong bộ nhớ chương trình. Còn P16F877A thì có khác, bộ nhớ chương trình chia làm 4 pages, mỗi trang 2K bộ nhớ chương trình, trong mã lệnh của các lệnh GOTO hay CALL thì địa chỉ chỉ có 11 bit tương ứng với 2^11=2048 địa chỉ nhảy. Như thế PC không thể trỏ đến đủ 8K địa chỉ của bộ nhớ chương trình được. Lúc mới tập viết chương trình PIC, tôi rất sợ chương trình vượt quá ... 2K
theo datasheet của PIC6F877A, ta có thể chọn trang chương trình bởi các bit PCLATH<4:3>, lý thuyết rõ ràng là như thế nhưng khi viết chương trình thì mới thấy sao lắm nhiêu khê vì cứ mỗi lần CALL hay GOTO thì lại phải pagesel Label một lần, hoặc là phải mở file .lst lên xem chương trình nó thuộc trang nào? và thế là mỗi khi thêm chương trình ta lại phải kiểm tra ...
Các bạn có phương án gì hay hơn không, để việc viết chương trình nhẹ nhàng hơn như lúc ta viết cho 8051 ý ?