1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Các chuyên gia Keil C51 cho tui hỏi chút.

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi eHard, 18/06/2004.

  1. 0 người đang xem box này (Thành viên: 0, Khách: 0)
  1. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi,
    Được rồi các bác ạ, tui không hiểu tại sao cái máy của tui nó có vấn đề. Bây giờ thì kích thước file nó nhỏ hơn và các lệnh MOVX cũng không còn nữa mặc dù không thay đổi gì cả. Cám ơn các bác đã quan tâm, chỉ giáo trong thời gian qua.
  2. TuLa

    TuLa Thành viên quen thuộc

    Tham gia ngày:
    24/10/2002
    Bài viết:
    413
    Đã được thích:
    0
    Sao lại đơn giản thế ! Bác bỏ thêm chút ít thời gian quay lại xem vấn đề tại sao mà lại như vậy, để anh em thoả cái công quan tâm đến vấn đề của bác.... hi hiiii
  3. TuLa

    TuLa Thành viên quen thuộc

    Tham gia ngày:
    24/10/2002
    Bài viết:
    413
    Đã được thích:
    0
    Theo tớ thì bạn đã thay đổi Option cấu hình cho Target từ chế độ bộ nhớ là COMPACT hoặc LARGE sang SMALL.
    Khi cấu hình là SMALL thì kết quả biên dịch sẽ cho ta kích thước nhỏ nhất và sẽ không có các lệnh MOVX; khi cấu hình là COMPACT sẽ cho kích thước lớn hơn (thấy khá rõ) và có khá nhiều lệnh MOVX được tạo ra, có phần XDATA xuất hiện; và đặc biệt khi cấu hình là LARGE thì kích thước sẽ là lớn nhất (thấy rất rõ so với SMALL) và có rất nhiều lệnh MOVX được tạo ra, đồng thời phần XDATA cũng lớn hơn so với kiểu COMPACT.
    Thí dụ ở project CSample:
    - Chế độ SMALL cho ta Program Size: data = 100.3 xdata = 0.0 code = 1553
    - Chế độ COMPACT cho ta Program Size: data = 15.3 xdata = 85 code = 1621 (có thể không có báo lỗi cú pháp nhưng Target tạo ra bị lỗi)
    - Chế độ LARGE cho ta Program Size: data = 15.3 xdata = 110 code = 1704 (có thể không có báo lỗi cú pháp nhưng Target tạo ra bị lỗi)
    Phiền bác eHard thử suy nghĩ thêm nhá
    Em chưa có dịp vào Sài Gòn chơi, chắc là Sài Gòn vui lắm bác nhể
  4. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi,
    Thực ra thì có thay đổi mà không thay đổi. Có nghĩa là xoá các file mà trình biên dịch tạo ra, giảm đi một số lệnh, chọn Option target là large sau đó biên dịch. Rồi chọn target là small và bỏ các lệnh các hàm củ vào biên dịch lại thế là được. Các biến thì lúc đầu bỏ trong data sau đó sửa lại idata cho biên dịch rồi lại quay về data lại biên dịch lại, lệnh MOVX hết trơn. Tui cũng không hiểu các quá trình đó nó làm thay đổi cái gì nữa. Một lần nữa xin cảm ơn các bác.
    À mà lúc nó dịch ra có lệnh MOVX thì nó thông báo là xdata --- có nghĩa là không dùng ram ngoài. Mà lúc dịch không còn lệnh MOVX thì xdata vẫn là --- Nhưng không hiểu vì sao hai lần nó khác nhau lúc có MOVX lúc lại không.
  5. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi,
    Các bác cho tui hỏi thêm chút, thông thường trong ASM tui khai báo:
    LED BIT P1.0
    Và khi truy cập nó có thể là:
    SETB LED hoặc
    CLR LED
    Như vậy, muốn làm như thế trong Keil C thì làm như thế nào? (khai báo thế nào)
  6. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    sbit P1^0 LED ;
    rồi:
    LED=1;
    or
    LED=0;
  7. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0

    Tui đã thử rồi nhưng tại sao nó báo lỗi cú pháp (syntax error) tại dòng: sbit P1^0 LED; hả bác, hay phải làm thêm thao tác gì trước khi khai báo cái dòng này. Tui đã include REG51.H rồi.
  8. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    syntax error bao gồm lỗi của nhiều lệnh xung quanh cái khai báo kia, lỗi này là lỗi đơn giản nhất, bác cứ đưa ch-trình lên đây, hỏi kiểu này khác gì đánh đố nhau, mà lại vụn vặt nữa.
    Tui đã thử rồi nhưng tại sao nó báo lỗi cú pháp (syntax error) tại dòng: sbit P1^0 LED; hả bác, hay phải làm thêm thao tác gì trước khi khai báo cái dòng này. Tui đã include REG51.H rồi.
    [/QUOTE]
  9. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi,
    Tui vô một số diễn đàn khác họ khai báo như sau:
    sbit led=p1^0;
    Tui về thử cũng không được. Nhưng..
    Nếu bác nói kỹ hơn một chút thì được từ lâu rồi. Bác biết sao không?
    Bởi vì tui khai báo cái này trong hàm main() nên nó cứ báo lỗi, khi tui đưa ra ngoài thì nó mới OK: 0 errors, 0 warnings. Tui thử khai báo lại kiểu giống như bác và đặt ở ngoài hàm main() nhưng nó cũng báo lỗi cú pháp. Có nghĩa là cách khai báo của bác bị sai rồi, phải khai báo như trên thì mới được. Tức là cái biến led này phải là biến toàn cục. Dù sao cũng cảm ơn bác nghe. Hy vọng còn trao đổi nhiều với bác.
    Thân ái.
    Được eHard sửa chữa / chuyển vào 10:17 ngày 23/06/2004
  10. TuLa

    TuLa Thành viên quen thuộc

    Tham gia ngày:
    24/10/2002
    Bài viết:
    413
    Đã được thích:
    0
    Hi hiiiii, có Error là phải rồi !
    Bác Open muốn bác eHard có thêm thời gian để tự tìm hiểu đó mà
    Đảo lại cái hướng dẫn của bác Open là đúng ngay thôi:
    sbit P1^0 LED ---> sbit LED = P1^0
    (thao tác, truy xuất trên biến tĩnh LED kiểu bit sẽ tương ứng với thao tác, truy xuất trên Pin 0 / bit 0 của Port 1)
    Theo tớ thì eHard nên đọc kỹ lại file C51.PDF của Keil (file này trong thư mục C:/Keil/C51/HLP) và nếu rảnh thì qua www.8052.com để tham khảo các Hỏi / Đáp trong Forum của họ.
    Chúc thành công !

Chia sẻ trang này