Thông báo

Collapse
No announcement yet.

Các cao thủ PIC Bang - giúp đỡ một chút - Dấu chấm.

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Các cao thủ PIC Bang - giúp đỡ một chút - Dấu chấm.

    Đọc đi đọc lại bài của bạn PHamThai Hoa về chuyển đổi dữ liệu trong PIC mà không thấy ai có ý kiến sáng suốt nào cả thành thử vấn đề bị mai một đi.

    Nhờ các bác giúp đỡ cái này xem sao :
    Tôi đang làm cái bộ theo dõi , đếm giờ bằng PIC ( Theo dõi cái máy xem nó chạy được bao nhiêu thời gian thì chết ).

    - Xuất tối đa 10 kí tự lên trêm màn LCD .
    và sẽ thể hiện kiểu như sau :
    mỗi lần máy chạy một lần chân clock ngoài ( clock 0 ) nhận xung 1 hz và bắt đầu đếm lên để hiển thị lên LCD , bình thường LCD chỉ thị là 0s
    khi đếm quá 5000 giây thì sẽ hiển thị là 5,001 giây . Khi đếm quá 5 triệu giây thì thể hiện là 5,000001 giây .

    Việc chuyển đổi từ số nguyên sang kí tự đơn thuần tôi đã làm được . Nhưng cái dấu " , " tôi không biết làm sao để tự động chèn vào .
    Bác nào có cao kiến xin giúp đỡ .

    === Làm thế này có thủ công không ?
    if (giay>= 5000)
    { LCDwrite (1,16 , giatridemduoc); // hiển thị giá trị
    LCDwrite (1,12, " ," ); // chèn dấu phẩy vào vị trí số hàng nghìn
    giatridemduoc = giatridemduoc/1000 ; // để lấy giá trị hàng nghìn
    LCDwrite (1,11, giatridemduoc );
    - Tuy nhiên đã không hiện được dấu phảy vào dúng vị trí .
    Chảng hạn : đếm được 5123 giây thì phải được 5,123 đẳng này nó hiện ra 55123
    làm sao dịch chuyển nó một cách linh hoạt nhất mà không thủ công.
    ============================================
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

  • #2
    Tôi không phải cao thủ, nhưng sẽ cố giúp.

    Cách làm cụ thể còn tùy thuộc vào trình dịch được dùng. Bác đang dùng trình dịch nào?

    Thân,
    Biển học mênh mông, sức người có hạn

    Comment


    • #3
      Tôi tưởng trên 5 triệu thì phải hiển thị 5,000,001 chứ bác? Mà sao lại 5 ngàn với 5 triệu mới thêm 'phẩy' nhỉ?? Mỗi 3 chữ số là phải hiển thị rồi chứ?


      Tôi không biết bác dùng ngôn ngữ của trình dịch nào? Nó hỗ trợ các hàm gì về chuỗi? Tôi đã là việc này trên VB ngon rồi, hy vọng bác đọc để lấy thuật toán rồi chuyển đổi ngôn ngữ là được. Bác cho hỏi LCDwrite() là lẹnh bác viết hay lệnh nội trú vậy??

      PT.
      Núi cao bởi có đất bồi
      Núi chê đất thấp, núi ngồi ở đâu?
      Muôn dòng sông đổ biển sâu
      Biển chê sông nhỏ, biển đâu nước còn?

      Comment


      • #4
        Xin lỗi nhé. Trong VB thì có hàm format. Cái mà tôi viết là ở ngôn ngữ khác. Nhưng bây giờ lại chưa tìm được source. Sang tuần nếu bác chưa xử lý được thì tôi sẽ cố tìm cho bác vậy.

        PT.
        Núi cao bởi có đất bồi
        Núi chê đất thấp, núi ngồi ở đâu?
        Muôn dòng sông đổ biển sâu
        Biển chê sông nhỏ, biển đâu nước còn?

        Comment


        • #5
          Nguyên văn bởi namqn
          Tôi không phải cao thủ.
          Không phải là cao thủ, mà là đại cao thủ, hehe..

          Vấn đề của anh Dương, em giải quyết thế này:

          \\Code ví dụ, chưa chạy thực tế

          dodai=strlen(chuoigiatricanhieuthi);
          for(i=dodai;i>=0;i--)
          {
          LCD_Write(chuoi[i]); \\LCD_write hàm ghi một giá trị
          if (i!=0 & (dodai-i)%3==0) LCD_Write(ghi dấu ,);
          }

          Quan trọng là lúc khởi tạo cho LCD thay vì dịch trái như bình thường anh khởi tạo cho nó dịch phải và cho con trỏ nhảy đến cột 16 để cho nó hiển thị từ cuối về đầu.
          Ví dụ, nếu số cần hiển thị là 1234567 thì nó sẽ hiển thị là 1,234,567

          Comment


          • #6
            lọ mọ cả đêm hôm qua , đọc nát cả sách C gần làm được rồi , có điều chưa được ưng lắm .
            giải thuật diễn giải kiểu sau có được không :
            1) Chuyển đổi từ số nguyên sang kí tự
            2) kiểm tra độ dài chuỗi
            3) Đảo chiều của chuỗi
            4) ghi chuỗi vào 1 mảng tương ứng
            5) xuất dời rạc từng kí tự ( nhưng kiểu này có vẻ không văn minh ).

            ---- Chẳng hạn :
            unsigned long buffer[12] ; // 12 phần tử để lưu giá trị
            if (giay>=5000)
            { LCD_writes(1,12," sec"); // viet tên đơn vị la giây
            LCD_writes(1,8, buffer[3]); // viết từ phần tử thứ 3 trở về 0
            LCD_write_char (1,7,","); // viet dau , vao vi tri thu 9
            LCD_writes( 1,7, buffer[4]);
            LCD_writes( 1,8, buffer[5]);
            LCD_writes( 1,9, buffer[6]);
            ............................
            }

            if(giay>= 5000000)
            {LCD_writes(1,12, " Msec");
            làm tương tự với các vị trí }

            -------------
            Về cơ bản đã giải quyết được nhưng sử lý chậm chạp và tốn kém quá .
            ( bài toán là trên 5000000 sẽ hiển thị là 5,000000 Msec chứ không phải là 5,000,000 .

            --- bài của bạn Hòa đã giải quyết được vấn đề 2 dấu phẩy rồi . ( ở đây chỉ có 1 dấu phẩy động và tên đơn vị thay đổi ).

            ------ Tôi đang dùng Hitech PIC C
            ( chắc cái này phải đau đầu ngâm cứu mấy hôm nữa đây - Chuyển đổi dữ liệu cũng rắc rối ghê ...)
            ;;;;;;;;;;;;;; Cám ơn các bạn đã tận tình giúp ;;;;;;;;;
            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

            Comment


            • #7
              Bạn Dương à, giải thuật cần chỉnh một chút.

              Code:
              if (giay >= 5000000) {
              //giải quyết phần việc tương ứng ở đây
              ...
              }
              else if (giay >= 5000) {
              //giải quyết phần việc tương ứng ở đây
              ...
              }
              else {
              //đây là phần code khi không cần in dấu phẩy
              ...
              }
              Viết theo kiểu cũ thì khi giay >= 5000000 nó cũng thỏa >= 5000, nên phần code trước đó cũng được thực thi.

              Tôi xem lại thư viện của HT PIC C rồi mới góp ý thêm được (vì tôi không dùng nó nhiều).

              Thân,
              Biển học mênh mông, sức người có hạn

              Comment


              • #8
                Nguyên văn bởi namqn
                Bạn Dương à, giải thuật cần chỉnh một chút.

                Code:
                if (giay >= 5000000) {
                //giải quyết phần việc tương ứng ở đây
                ...
                }
                else if (giay >= 5000) {
                //giải quyết phần việc tương ứng ở đây
                ...
                }
                else {
                //đây là phần code khi không cần in dấu phẩy
                ...
                }
                Viết theo kiểu cũ thì khi giay >= 5000000 nó cũng thỏa >= 5000, nên phần code trước đó cũng được thực thi.

                Tôi xem lại thư viện của HT PIC C rồi mới góp ý thêm được (vì tôi không dùng nó nhiều).

                Thân,
                Cám ơn tất cả các bạn đã trợ giúp , tôi đã giải quyết được vấn đề trên bằng phương pháp thủ công .
                Có điều về câu lệnh if ( câu lệnh để kiểm tra ) , viết như bạn NAMQN là hoàn toàn chặt chẽ , rất cảm ơn thành ý của bạn .
                Mặc dù chưa tối ưu hóa được code xong khách hàng đã chấp nhận và mạch đã hoạt động tốt .
                Một lần nữa xin trân trọng cám ơn.
                Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                Comment


                • #9
                  Không phải là cao thủ, nhưng cố gắng giúp (!)
                  Cái này viết bằng Keil, nhưng là C nên như nhau cả thôi, bác queduong thử xem, vì không có HTPIC.
                  Có gì thì bác feedback nhé !
                  Hàm toascii trong thư viện ctype.h, không biết bên HTPIC là hàm gì, bác cứ thay vô là chạy - hàm chuyển một số sang kí tự , vd số 0 thì thành '0'


                  Code:
                  //convert long to string, radix 10 (ltoa : long to alphabetic)
                  //input : v : number as long
                  //output: s : string
                  //return value : string length
                  unsigned char ltoa(long v,unsigned char *s)
                  {
                  	unsigned char c,i,j;
                  	if(v == 0)
                  	{
                  		s[0] = '0';
                  		s[1] = '\0'; //null value, end of string
                  		return 1;
                  	}
                  	i = 0;
                  	while(v > 0)
                  	{
                  		c = (v % 10);
                  		v = (v - c) / 10;
                  		s[i] = toascii(c);
                  		i++;
                  	}
                  	//string reverse
                  	for(j = 0; j < ((i - (i%2)) / 2); j++)
                  	{
                  		c = s[j];
                  		s[j] = s[i - 1 - j];
                  		s[i - 1 - j] = c;
                  	}
                  	s[i] = '\0';//null value, end of string
                  	return i;
                  }
                  
                  //format string : format src string to des string with ',' seperator
                  //input : src : string, len : len of src
                  //output : des : string
                  //return value:  len of des
                  unsigned char format(unsigned char *src,unsigned char *des,unsigned char len)
                  {
                  	unsigned char i,j,ret,tmp;
                  	ret = len;
                  	if (len > 3)
                  		ret = len + (len - 1 - ((len - 1) % 3)) / 3;
                  	j = len - 1;
                  	for(i = ret - 1; i > 0; i--)
                  	{
                  		tmp = i%3;
                  		if(tmp == 0)
                  			des[i] = ',';
                  		else
                  		{
                  			des[i] = src[j];
                  			j--;
                  		}
                  	}
                  	des[0] = src[0];
                  	des[ret] = '\0'; //null value
                  	return ret;
                  }
                  
                  //format number to string with ',' seperator
                  //input : v : number
                  //output : des : string
                  //return : len of des
                  unsigned char forDisplay(long v,unsigned char *des)
                  {
                  	unsigned char ret;
                  	unsigned char s[20]; // 
                  	ret = ltoa(v,tmp);
                  	ret = format(tmp,des,ret);
                  	return ret;
                  }
                  Chúc may mắn trong cuộc sống ! (LVS)

                  Comment


                  • #10
                    Các anh viết đều không sai nhưng có chỗ chưa thật hợp lý. Khi truy cập đến các phần tử của mảng, đặc biệt khi truy cập liên tiếp: ví dụ: a[n],a[n+1]... thì nên dùng con trỏ để tăng tốc độ.
                    Nếu có thể thì các lệnh for(...i++...) nên thay bằng while(i--) cũng sẽ tăng đáng kể tốc độ

                    Comment


                    • #11
                      Do đâu mà while(i--) nhanh hơn for(...i++...) thế, 3T??
                      Núi cao bởi có đất bồi
                      Núi chê đất thấp, núi ngồi ở đâu?
                      Muôn dòng sông đổ biển sâu
                      Biển chê sông nhỏ, biển đâu nước còn?

                      Comment


                      • #12
                        Mấy chú trình dịch này nó có tối ưu mã ASM giúp ta mấy đâu mà nhanh với chậm nhỉ, cốt chỉ giải quyết được vấn đề thui!
                        Cách bạn PTH là hay nhất, in ngược! Thanks!

                        Comment


                        • #13
                          Cách đảo chiều có vẻ là hữu hiệu nhất. Còn nếu muốn in thì lưu vào mảng hoặc truy suất " thủ công " cũng được .
                          ( mình đã thử gộp nó vào nhưng ở đây dấu phảy không theo quy luật nên không làm được ) .
                          Có 2 dấu phảy dùng như của bạn Hòa rất tốt.
                          - Mình đã làm được rồi - Rất cám ơn.
                          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                          Comment

                          Về tác giả

                          Collapse

                          queduong Tìm hiểu thêm về queduong

                          Bài viết mới nhất

                          Collapse

                          Đang tải...
                          X