Thông báo

Collapse
No announcement yet.

Thuật toán nhập số liệu tử ma trận phím 3*4

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

  • Thuật toán nhập số liệu tử ma trận phím 3*4

    Em đang có 1 ma trận phím 3*4. Quét được từng phím rồi. Khi nhấn 1 trong 12 phím thí nó cho 1 giá trị phím là giatriphim từ 0 đến 11 khi nhấn trong 12 nút nhấn đó.
    Bây giờ em muốn nhập từ ma trận phím số 235 chả hạn tức là sau 3 lần nhấn phím thì được số này. Em không bit thuật toán của nó thế nào? viết hoài mà không được!
    Code:
    unsigned char quethang[3]={0xff7f,0xffbf,0xdf};
    unsigned int x,y;
    unsigned char a[100],phim,n;
    unsigned int alarm;
    void Scanmatrix()
    	{
    		for(x=0;x<3;x++)
    			{
    				Delay_ms(1);
    				LATB=quethang[x];
    				for(y=0;y<50;y++)
    					{
    						if(!cot1) 
    							{ 
    								phim=4*x;
    								//while(!cot1)								
    								a[n++]=phim;
    							}
    						if(!cot2) 
    							{	
    							   phim=1+4*x;	
    							//	while(!cot2)								
    								a[n++]=phim;
    							}
    						if(!cot3)
    							{ 
    								phim=2+4*x;
    							//	while(!cot3)															
    								a[n++]=phim;
    							}
    
    						if(!cot4)
    							{
    							   	phim=3+4*x;
    								//while(!cot4)	
    								a[n++]=phim;
    							}
    					}
    				}
    		}
    void inport_matrix()
    	{
    	  if(n==1) alarm=a[1];
    	  else if(n==2) alarm = a[1]*10+a[2];
    	   	else if(n==3) n=0;		
     					
    		LCD_Position(2,10);
    		LCD_WriteNumber(alarm);
    			LCD_Position(2,13);
    		LCD_WriteNumber(phim);
    			LCD_Position(2,15);
    		LCD_WriteNumber(n);
    
    	}
    ở đây alarm là giá trị 253 em cần nhập hay 3 số khác.

  • #2
    cái này nghe các pác chưa làm về nó!

    Comment


    • #3
      Chào bạn !

      Mình cũng đang gặp rắc rối với cái bài nhập phím nay đây.

      Bài toán của mình là quét phím, rồi hiển thị lên LCD mình đã nhập phím nào. Sau khi người dùng nhấn phím '#' (kết thúc) thì chương trình dừng lại, còn nếu ấn phím '*' thì màn hình sẽ được xóa để người dùng nhập số khác.

      Mình gặp rắc rối ở chỗ, khi ấn phím '#', chương trình dừng lại thật, nhưng giá trị hiển thị lên LCD lại ko bằng giá trị đã nhập, ví dụ như người dùng nhập là "1234", thì nó lại hiển thị là "1233".

      Cái đó là mình mô phỏng trên proteus, tìm mãi mà ko biết sai chỗ nào, ko biết có phải là mo phỏng ko chính xác không nữa !

      Bạn nào đã từng làm về vấn đề này có thể cho mình xin code được không ? Hoặc nếu có cao kiến gì, xin chỉ bảo cho mình. Xin cám ơn các bạn nhiều !

      Comment


      • #4
        Tôi đã làm đựoc đâu! TÔi ko làm trên mô phỏng mà tôi test mạch thật luôn! Pác có thể gửi chương trình đó cho tôi xem nào? chúng ta cùng bàn !

        Comment


        • #5
          Cái này đơn giản mà. Các bạn chia chương trình thành 3 khối
          1> Khối quét phím: để nhận phím nhấn: khi có phím nhấn vào thì sẽ cho biết giá trị của phím (phím nào được nhấn) và bật 1 cờ lên để khối khác có thể nhận biết được là có phím vừa được nhấn
          2> Khối xử lý dữ liệu: khi có cờ bật lên ở khối quét phím thì bạn cập nhật dữ liệu của chương trình. Ví dụ bạn cần lưu tối đa 10 số thì bạn chứa trong mảng DATA[10], lúc chương trình mới chạy hoặc khi dữ liệu bị xóa thì bạn có index là 1. Khi có phím nhấn thì bạn cập nhật dữ liệu vào DATA[index] và tăng index lên 1 và bật 1 cờ để cập nhật dữ liệu cho khối hiển thị
          3> Khối hiển thị: khi có cờ cập nhật ở khối xử lý dữ liệu thi bạn cập nhật lên lcd thôi, để chương trình hiển thị đúng thì bạn dựa vào biến index của khối 2. Ví dụ index = 4 có nghĩa là chỉ có 3 giá trị dữ liệu được đưa vào, bạn chỉ việc hiển thị DATA[3], DATA[2] và DATA[1]

          Đối với trường hợp phím '*' thì bạn chỉ việc reset biến index về 1 và xóa cờ không cho phép cập nhật dữ liệu
          Đối với trường hợp phím '#' thì bạn bật cờ không cho phép cập nhật dữ liệu

          Hy vọng sẽ giúp ích ít nhiều cho các bạn.

          Comment


          • #6
            Pác không lấy 1 code làm ví dụ mình họa cho dễ hiểu? Tôi cũng biêt thuận toán kiểu này! Nhưng khổ nỗi là vẫn không đựoc!

            Comment


            • #7
              theo ý của GLTD thì là thế này

              void hiển thị()
              {
              + hiển thị mảng[ ] ; với số phần tử hiển thị = index ;
              }
              while()
              {
              + nếu bấm phím số { SO=quetphim(); mang[index] = SO ; }
              + nếu bấm * { index = 1;}
              + nếu bấm # {index++; }
              hiển thị () ;
              }

              Comment


              • #8
                Mình điều chỉnh thêm 1 chút vào đoạn mã giả của ssgabeo:
                void hiển thị()
                {
                + hiển thị mảng[ ] ; với số phần tử hiển thị = index ;
                }
                while()
                {
                + nếu bấm phím số { SO=quetphim(); mang[index] = SO ; index++ }
                + nếu bấm * { index = 1; camnhapdulieu = 0}
                + nếu bấm # { camnhapdulieu = 1}
                hiển thị () ;
                }

                Comment


                • #9
                  Nguyên văn bởi gltd Xem bài viết
                  Mình điều chỉnh thêm 1 chút vào đoạn mã giả của ssgabeo:
                  void hiển thị()
                  {
                  + hiển thị mảng[ ] ; với số phần tử hiển thị = index ;
                  }
                  while()
                  {
                  + nếu bấm phím số { SO=quetphim(); mang[index] = SO ; index++ }
                  + nếu bấm * { index = 1; camnhapdulieu = 0}
                  + nếu bấm # { camnhapdulieu = 1}
                  hiển thị () ;
                  }
                  cái biến index++ nó có được ghim lại ko? Khi nhấn nó sẽ tăng lên 1 và lên 2 khi ta giữ nút nhấn. Nó sẽ ko tăng lên 1 và giá trị này tăng theo lệnh máy. Nên các pác xem nào ghim nó chỉ tăng lên 1 khi ta nhấn 1 phím!

                  Comment


                  • #10
                    1> Khối quét phím: để nhận phím nhấn: khi có phím nhấn vào thì sẽ cho biết giá trị của phím (phím nào được nhấn) và bật 1 cờ lên để khối khác có thể nhận biết được là có phím vừa được nhấn

                    Bạn chỉ việc tắt cờ đã bật ở khối 1 (có nghĩa là phím nhấn đã được xử lý) thì sẽ giải quyết được vấn đề thôi

                    Comment


                    • #11
                      Làm 1 cách thủ công thế này :

                      unsigned short dulieu[10] ; // Có thể nhập đến 10 số
                      short number_index ; //
                      bit ketthuc;
                      unsigned double long ketquaday;

                      // quy định dùng 1 phím nào đó để nhập số ( thay phím enter , # ..v.v )

                      dulieu[0] =0;
                      .......
                      dulieu[9]=0;
                      index =-1;
                      ketthuc=0;
                      /// Vòng lặp ở đây :
                      do
                      {
                      1) quét phím
                      2) kiểm tra
                      if(index<10)
                      {
                      if (phím bấm) {index++; dulieu[index] = giá trị của phím ( VD 3) ; }
                      if(bấm_#)
                      {
                      ketquaday = (dulieu[0]* 1(10 số 0) + dulieu[1]* ..... + dulieu[9] );
                      ketthuc=1;
                      }

                      }

                      }

                      while(!ketthuc);

                      Comment


                      • #12
                        Lưu ý , tùy thuộc vào số index mà ta nhân dulieu[0] với 1000 , 100 hay 10 ....v.v

                        Nên làm 1 phép kiểm tra : If( index= 3 ) ===> dulieu[0] *100 + dulieu[1]*10 +dulieu[2]*1 ....v.v.

                        Comment


                        • #13
                          Mình góp tí ý kiến chỗ quét phím..
                          Bạn nên đặt nó vào timer hoặc là quản lí bằng một biến toàn cục (nếu như sợ timer quét phím làm gián đoạn ctr chính), và giám sát nó để nhận biết là nhấn phím đơn, nhấn giữ hay là xung nhiễu..
                          ở đây, nó vừa có tác dụng chống rung phím, bắt nhiều phím,bắt phím liên tục... và cái nữa là nó tốn ít thời gian nhất cho việc quét phím và vẫn có khả năng chống rung phím...

                          Comment


                          • #14
                            Bác nào có bài code hoàn chỉnh không có thể gửi cho em qua mail congvi1507@gmail.com .nếu mà cho avr thì càng tốt.thanhk! e đang cần mà
                            mame:Lê Công Vĩ
                            Profession: student
                            Address:Đông Ngạc, Từ Liêm, Hà Nội, Việt Nam
                            phone number: +84977912056
                            mail:

                            Comment


                            • #15
                              sao mà hồ quá hihix bài này viết lấu thế có ai trả lời mình ko......

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X