Bạn tự nêu cách giải quyết rồi đó. Dùng một biến chuỗi để lưu chuỗi kết quả, mỗi lần thêm vào chuỗi thì dùng hàm nối chuỗi để nối chuỗi đã có và ký tự cần thêm. Bạn xem tài liệu hướng dẫn của CCS C về các hàm này.
Thân, |
cộng ký tự thành chuỗi
với cách viết mà em post ở bài trước thì nó chỉ hiện được phím đầu tiên mà mình nhấn thôi,còn các phím sau đó thì LCD chỉ hiện lên các ký tự lạ thôi.
Còn hàm nối chuỗi mà Bác nói là hàm nào ,có phải là hàm "srcat(key,string1);"này ko? em cũng thử rồi nhưng ko được nên phải cầu cứu các Bác nè. Code:
#include "D:\PIC PROGRAM\dk.h" có Bác nào đã làm cái này chưa chỉ em với. |
Tôi không rõ CCS C sẽ xử lý thế nào khi bạn dùng lệnh k = kbd_getc();. Vì bạn đã khai báo k là một mảng ký tự (tối đa 10 ký tự), trong khi prototype của kbd_getc() lại cho thấy giá trị trả về là 1 ký tự. Bạn thử lại với lệnh sau xem sao:
Code:
k[0] = kbd_getc(); Thân, |
Tôi đang học CCS chưa biết sử dụng nhiều Huynh có thể post thêm bai hướng dẫn hay tài liệu được không?
|
Bác "nampn" oi!em khai báo "k" là biến kiểu char bình thường mà, còn biến "key" mới là biến kiểu mảng "char k,key[10]". em sẽ thử cách này của Bác thử xem sao. Cảm ơn Bác rất nhiều.
|
Trích:
Thân, |
giúp mình với!!!!!!
mình cũng đang gặp phải lỗi này. chương trình của mình sử dụng ngắt RB và timer0. hàm phục vụ ngắt RB của mình có gọi đến khá nhiều hàm con. khi mình bỏ hẳn hàm phục vụ ngắt RB ra khỏi ct thì hoạt động của timer0 là đúng. còn khi mình thêm vào hàm phục vụ ngắt RB,mặc dù ngắt RB không hề sảy ra nhưng timer0 của mình vẫn chạy không chính xác. cho mình hỏi bạn khangcodt đã khắc phục được lỗi timer chạy sai khi trong hàm phục vụ ngắt gọi đến các hàm con khác chưa vậy? mình cảm ơn nha. |
cho mình hỏi thêm câu nữa nhé.
mình dùng hàm printf(); để truyền dl qua máy tính. 1) làm thế nào để biết pic đã truyền xong mảng ký tự 2) để truyền một số nguyên mình đã thực hiện như sau: itoa(trunggian2,10,s);//chuyển số nguyên thành mảng ký tự printf(s); trong đó biến trunggian2 là int16, s là mảng char. nhưng khi mình thử test với hyper terminal thì kết quả nhận được lại không đúng. cụ thể là sau những số nhận được lại có thêm các ký tự lạ. bạn nào đã làm về vấn đề này rồi xin chỉ giúp mình với mình cảm ơn nhiều. |
cho mình hỏi :
khi truyền một mảng char từ pic lên máy tính thì ngắt RDA sảy ra sau khi truyền xong cả mảng hay cứ mỗi lần truyền xong một phần tử thì xảy ra ngắt RDA? mình cảm ơn! |
Trích:
Ngắt INT_RDA xảy ra mỗi khi PIC16F877A nhận được 1 ký tự ở bộ đệm nhận, người dùng nên nhanh chóng đọc dữ liệu từ bộ đệm để PIC có thể ghi ký tự kế tiếp ngay khi thanh ghi dịch đã có đủ dữ liệu. Thân, |
em cảm ơn anh namqn nhiều.
cho em hỏi thêm câu này nữa nhé em dùng con 16f877a để nhận mảng ký tự truyền từ môt con 16f877a khác. mảng ký tự kết thúc bằng ký tự @. bên phát: itoa(x,10,s);// s khai báo là char s[5] s[4]='@';// vì e k biết s kết thúc bằng ký tự gì printf(s); bên thu em thực hiện truyền vài lần(thay đổi giá trị của x bằng cách ấn nút) thì e chỉ nhận được lần đầu tiên. truyền các lần tiếp theo thì nó bị đơ luôn, không chạy nữa. e chạy mô phỏng bằng proteus. đây là code bên phía nhận Code:
#INT_RDA |
cho mình hỏi một câu nữa
khi ngắt RDA xảy ra thì cờ nào được set lên 1, và khi kết thúc ngăt nó có tự động xóa bít đó không? |
Trích:
Trích:
Code:
printf("%s", s); |
cho mình hỏi cái này nhé
nếu dùng lệnh printf("%s", s); thì ký tự kết thúc của chuỗi s là gì? mình định dùng ký tự này để xử lý việc nhận chuỗi s. có phải ký null không nhỉ? |
1 Attachment(s)
các chương trình ví dụ
|
Trích:
|
giúp mình cái hàm nhận xâu ký tự
bên phát mình thực hiện như sau: Code:
itoa(x,10,s);//chuyển số nguyên x thành xâu ký tự Code:
#INT_RDA mình cảm ơn. |
Theo như đoạn code trên, hàm lcd_display_str nhận đối số là một chuỗi do đó chắc chắn nó yêu cầu chuỗi của bạn phải kết thúc = ký tự NULL, chuỗi s1 như trên chưa có ký tự kết thúc.
Bạn nên post cả code của phần phát |
bên phát mình chỉ có hai dòng lệnh vậy thôi vì mình ghép nó vào một chương trình con khác.
Code:
void tonghop_so() hàm lcd_display_str(); là hàm hiển thị một mảng ký tự. Code:
void lcd_display_str(int line, int8 posc, char str[]) |
Trích:
#include <16F877A.h> #byte portb = 0x06 #byte portc = 0x07 #use delay (clock = 20000000) int count=1; #INT_EXT void EXT_LED() { portc=count; count=count+1; delay_us(100); bit_clear(portb,0); } void main() { ext_int_edge(L_TO_H); enable_interrupts(INT_EXT); enable_interrupts(global); set_tris_b(0xff); set_tris_c(0x00); portc=0; bit_set(portb,0); while(1) { } } |
Bác F co CCS 4.038 không post lên cho mọi người nữa. Không biết nó có gì mới+tốt hơn không?
|
cám ơn các bạn rất nhiều
|
giúp mình về cái timer với!!
trong chương trình của mình có sử dụng cả timer và ngắt. Đây là hàm phục vụ ngắt của mình: Code:
#int_RB mình đã thử độc lập riêng timer thì hoàn toàn đúng. mong được mọi người giúp đỡ. mình cảm ơn nhiều. |
CCS C không hỗ trợ reentrant, do đó khi 1 chuơng trình con được gọi đồng thời trong chương trình chính và trong trình phục vụ ngắt thì CCS sẽ sinh mã để tự động che ngắt khi vào chương trình con đó để tránh reentrant.
Với trường hợp của bạn có 2 hiệu ứng làm trễ ngắt timer: Thứ 1: khi vào chương trình con được gọi chung, CCS sẽ che ngắt global, do đó ngắt timer ko đc xảy ra, làm ngắt timer đến trễ so với thực tế. Thứ 2: Trình phục vụ ngắt thay đổi mức trên PORTB của bạn quá dài, vì trong thời gian đang thực thi trình này thì ngắt nói chung và ngắt timer nói riêng ko thể xảy ra, nên làm trễ ngắt timer. Về khái niệm reentrant (vào lại). Bạn có thể tưởng tượng một chương trình con A đang được chạy trong chương trình chính, ngắt xảy ra và A lại đc gọi bởi trình phục vụ ngắt. Lúc này sẽ có một số vấn đề phát sinh: 1 - Không gian bộ nhớ cấp cho các biến của A: nếu linker cấp phát tĩnh các biến này thì coi như tiêu. Với pic16F, cấp phát động bộ nhớ (dùng stack) là điều phức tạp vì hardware ko hỗ trợ nhiều cho truy xuất bộ nhớ gián tiếp, mình ko có thời gian disassembly nhưng tin chắc là CCS ko làm điều này (CCS ko hỗ trợ đệ quy). 2 - Các tác vụ về IO hoặc về biến tốn nhiều chu kỳ máy khi bị ngắt giữa chừng cũng coi như tiêu. |
thanks!!! rat bo ich!
|
thanks anh nhiều!!
nhưng em vẫn chưa hiểu lắm về reentrant. anh có tài liệu j nói về vấn đề này không? vấn đề nữa là trình phục vụ ngắt trên port B của em có lẽ là không rút ngắn được bao nhiêu.vậy có cách nào để tính thời gian ngắt của timer không? |
cho em hỏi một vấn đề nữa nhé.
hiện tại chương trình của em cần thêm một số modul nữa, nhưng khi thêm vào và dịch thì nó thông báo là hết RAM mặc dù trước đó ctrinh mới dùng hết khoảng hơn 60% RAM. có ai biết về vấn đề này xin giúp em với, làm sao để có thể dịch được nhiều hơn? |
Trích:
Về timer, mình nghĩ bạn nên đưa phần quét phím ra chương trình chính, khi có ngắt INT_RB, bạn set cờ báo cho chuơng trình chính kiểm tra phím bấm, lúc này ngắt timer vẫn xảy ra được Trích:
|
mời tìm hiểu về pic cho mình hỏi có cách tạo ra cấu trúc truy nhập kiểu bảng (db ....)như đối với 8051 không .và tổ chức như thế nào/Mong trả lời của các bạn và các tiền bối
|
Trích:
Câu hỏi của bạn nên được post ở luồng cơ bản về PIC và vi điều khiển, và sử dụng hợp ngữ. Bạn có thể đọc tài liệu hướng dẫn của MPASM để thấy có thể dùng DT, DB, và DW để định nghĩa các bảng dữ liệu. Thân, |
làm phiền trưởng lão lần nữa.nếu dùng CCs thì việc xử lý kiểu bảng này ra sao,chẳng hạn đệ muốn cho led7 hiển thị đếm ,thì khi dùng truy nhập bảng có vẻ nhanh hơn(thiển ý)
thanks! |
Trích:
http://www.ccsinfo.com/downloads/CReferenceManual.pdf Ở trang 268 có ví dụ về bảng hằng số trong flash (ROM) của PIC, bạn có thể dựa vào đó để làm bảng giải mã hiển thị cho LED 7 đoạn chẳng hạn. Thân, |
cho em hoi câu này
ý nghĩa của khai báo #fuses PUT là gì ? nó ảnh hưởng đến timer như thế nào?(kết quả timer hoạt động thay đổi như thế nào khi có và không có khai báo trên) em cảm ơn nhìu! |
Trích:
Nói đơn giản là khi PIC đc cấp nguồn, Power Up Timer sẽ chờ 1 khoảng thời gian mới cho PIC chạy (thực thi code), khoảng thời gian chờ này nhằm đảm bảo nguồn cấp cho PIC ổn định. Power Up Timer ko liên quan gì đến các timer của PIC. |
Trích:
Em cần nạp một mảng giá trị vào eeprom trước.cũng khoản 210 byte . Và sau này chường trình chính chỉ việc sử dụng các giá trị trong các ô nhớ của eeprom để xử lý mà thôi .... Mong các huynh giúp đỡ !! Thanks for all ! |
Trích:
Thân, |
các bác ơi! cho em hỏi một tý...
em đang lập trình giao tiếp giữa pc và pic 16f877a, em muon truyen một chuổi từ máy tính bằng vb6 đến pic thi nên viết code trên VB như thế nào và viết hàm nhận trong ccs như thế nào........ |
Trích:
Vì một yêu cầu đặt ra là kô thay đổi chương trình chính mà chỉ việc thay đổi giá trị trong các ô nhớ của eeprom . Chương trình chính làm việc khác nhau ứng với các giá trị khác nhau trong vùng nhớ eeprom.... Mong các huynh giúp đỡ . Thanks for all ! |
Trích:
Một số phần mềm thì có lệnh ghi vào từng vùng nhớ riêng, và 1 lệnh để ghi tất cả các vùng nhớ. Nói chung, bạn tìm hiểu kỹ phần mềm đang dùng để nạp chip thì sẽ làm được điều bạn muốn. Thân, |
Trích:
Em đã nạp được rồi .rất cảm ơn anh . Nhưng em vẫn còn một vướng mắc ,hiện giờ mình chỉ nạp data vào riêng vùng eeprom . Giả sử em muốn nạp giá tri 1-->255, tương ứng với ô nhớ từ 1-->255, vậy giá trị nạp này mình phải viết làm sao để có được file hex nạp riêng vào vùng nhớ eeprom đây?( chương trình chính là mình ko đụng đến rồi ... Mong các anh chỉ giúp .. Thanks for all !! |
Múi giờ GMT. Hiện tại là 06:23 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam