PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

namqn 08-01-2008 11:51 PM

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,

picthanh 09-01-2008 01:59 PM

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"
#include <KBD.C>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lcd.c>
char string1[10];
char i,t, keyscan;
char k,key[10];

void main()
{

  port_b_pullups(TRUE);
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(FALSE);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  kbd_init();
  lcd_init();
SET_TRIS_C( 0x00 );
output_bit(PIN_C4, 1);output_bit(PIN_C5, 1);
delay_ms(1000);
output_bit(PIN_C4, 0);output_bit(PIN_C5, 0);

i=0;
lcd_putc('\f');
while(1)
  {
      k = kbd_getc();
      if (k!=0)
        {
        strcpy(string1,k);
        strcat(key,string1);
      for(i=0;i<strlen(key);i++)
        lcd_putc(key[i]);
        }
    }
}

với chương trình này thì LCD hiện những ký tự lạ có cả tiếng Nhật nửa.nói chung là nó ko chạy đúng theo những gì mà em cần
có Bác nào đã làm cái này chưa chỉ em với.

namqn 09-01-2008 08:07 PM

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();
Đúng là tôi đã đề cập đến hàm strcat(). Cần biết là tôi không sử dụng CCS C, chỉ đọc tài liệu hướng dẫn của phần mềm để giúp bạn. Do đó, bạn sẽ là người thử nghiệm các giải pháp mà tôi cho là sẽ giúp ích cho bạn.

Thân,

nod32 10-01-2008 12:37 AM

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?

picthanh 10-01-2008 01:04 AM

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.

namqn 10-01-2008 01:21 AM

Trích:

Nguyên văn bởi picthanh (Post 13794)
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.

Vâng, tôi nhầm, bạn đã khai báo k là char. Nhưng khi đó hàm strcpy() lại có khả năng chạy sai, vì nó cần 2 đối số kiểu string.

Thân,

bean984 14-01-2008 11:47 AM

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.

bean984 14-01-2008 01:55 PM

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.

bean984 15-01-2008 02:02 PM

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!

namqn 15-01-2008 08:17 PM

Trích:

Nguyên văn bởi bean984 (Post 13905)
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!

Ngắt INT_RDA xảy ra khi PIC nhận được dữ liệu tại cổng USART của nó (ví dụ do máy tính truyền đến), còn ngắt INT_TBE xảy ra khi PIC truyền dữ liệu qua cổng USART của nó (ví dụ truyền đến máy tính). Câu hỏi của bạn thuộc loại 'râu ông nọ cắm cằm bà kia'.

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,

bean984 16-01-2008 08:56 AM

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
RECEIVER()
{
  char kt;
  int i;
  char s1[4];
  i=0;
  kt=fgetc(pc);

  while(kt!='@')
      {
        s1[i]=kt;
        i++;
        kt=fgetc(pc);
      }
       
        lcd_clear();
        delay_ms(1);
        lcd_display_str(0, 0, s1);
}


bean984 16-01-2008 03:17 PM

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?

bien_van_khat 16-01-2008 06:04 PM

Trích:

Nguyên văn bởi bean984 (Post 13921)
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?

Ngắt RDA xảy ra khi cờ RCIF trong thanh ghi PIR1 được set, bạn có thể coi giản đồ thời gian trong datasheet trang 120.

Trích:

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 xem lại mẫu hàm của hàm printf, muốn gửi 1 chuỗi bạn phải gọi như sau
Code:

printf("%s", s);

bean984 18-01-2008 02:22 PM

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ỉ?

nguyendinhtuan 18-01-2008 11:47 PM

1 Attachment(s)
các chương trình ví dụ


Múi giờ GMT. Hiện tại là 12:13 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