PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   Quang Bao (http://www.picvietnam.com/forum/showthread.php?t=1084)

HSIC 27-04-2007 12:44 PM

Quang Bao
 
Các Bạn cho mình hỏi một tý nhé. về câu lệnh Shift_right(). và shift_left().
mình có một chuổi như thế này. gồm có 16 cột và 8 hàng

Code:

int8 buffer[16]=
{
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,

bây giờ để dịch từ cột thứ nhất đến cột thứ 16, và lặp lại liên tục mình làm thế này có đúng không. mình viết một hàm để làm công việc đó. chẳng hạn

Code:

void dich_phai()
{
int8 i;
    for(i=0;i<8;i++)
      {
      shift_right(buffer[i*2],1,0);// i nhân 2 byte ơ vị trí đầu tiên
      shift_right(buffer[i*2+1],1,0);
        }
    delay_ms(100);
}
....................................................
void main()
{
    ......................................
    while()
      {
          dich_phai();
          delay_ms(100);
        }
}

nhờ các bạn xem có đúng không mình chạy nó không đúng . Nếu sai nhờ các bạn sử lại giúp mình với.
Cảm ơn nhiều.

namqn 27-04-2007 07:25 PM

Có vẻ như bạn đang dùng C để viết chương trình, nhưng bạn chưa cho biết bạn đang dùng trình biên dịch C nào. Với vi điều khiển thì không phải trình biên dịch C nào cũng giống nhau. Nếu bạn cho biết chip đang được dùng thì càng tốt.

Thân,

HSIC 08-05-2007 02:03 PM

Quang Bao
 
Toi dang dung trinh dich CCS C
va co pic toi dang dung la 16F876A



Trích:

Nguyên văn bởi HSIC (Post 8425)
Các Bạn cho mình hỏi một tý nhé. về câu lệnh Shift_right(). và shift_left().
mình có một chuổi như thế này. gồm có 16 cột và 8 hàng

Code:

int8 buffer[16]=
{
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,
  0b01111111,0b11111111,

bây giờ để dịch từ cột thứ nhất đến cột thứ 16, và lặp lại liên tục mình làm thế này có đúng không. mình viết một hàm để làm công việc đó. chẳng hạn

Code:

void dich_phai()
{
int8 i;
    for(i=0;i<8;i++)
      {
      shift_right(buffer[i*2],1,0);// i nhân 2 byte ơ vị trí đầu tiên
      shift_right(buffer[i*2+1],1,0);
        }
    delay_ms(100);
}
....................................................
void main()
{
    ......................................
    while()
      {
          dich_phai();
          delay_ms(100);
        }
}

nhờ các bạn xem có đúng không mình chạy nó không đúng . Nếu sai nhờ các bạn sử lại giúp mình với.
Cảm ơn nhiều.


bien_van_khat 08-05-2007 06:14 PM

Trích:

Nguyên văn bởi HSIC (Post 8425)

[code]
void dich_phai()
{
int8 i;
for(i=0;i<8;i++)
{
shift_right(buffer[i*2],1,0);// i nhân 2 byte ơ vị trí đầu tiên
shift_right(buffer[i*2+1],1,0);
}
}

Về cú pháp code này chắc chắn chạy sai vì tham số đầu tiên truyền cho hàm shift_right() phải là một con trỏ

shift_right(&buffer[i*2],1,0);

Về giải thuật theo như tôi hiều, bạn muốn dịch các bit từ mảng ra IO chẳng hạn, nếu đúng như vậy thì như trên là sai vì hàm shift_right() dịch bit vào trong biến.
VD:
char a=255;
shift_right(&a, 1, 0); //a = 254
shift_right(&a, 1, 0); //a = 252
shift_right(&a, 1, 0); //a = 248

Bạn nên coi lại help

HSIC 09-05-2007 11:09 AM

Quang bao
 
Cảm ơn các bạn đã đóng gốp ý kiến. nhưng H sẽ gởi nguyên đoạn chương trình của H nhờ các bạn xem và sửa lại giúp H.
Ở đây H muốn cho nó chạy từ cột thứ nhất đến cột thứ 16 và lặp lại.
hoặc là cho nó chạy một chử nào đó.
H chua làm được .

H dùng xuất dữ liệu ra cột và quét hàng.
về phần cứng H dùng 1 con 74hc595 quét hàng.
2 con 74hc595 xuất dữ liệu ra cột.
mong được sự giúp đở của các bạn.
Cảm ơn nhiều.

//#################################################
#include <C:\Program Files\PICC\Devices\16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_C6,rcv=PIN_C7) //chan17, 18

#use fast_io(A)
#use fast_io(B)

#define col_stb PIN_A1 //chan 2
#define col_clk PIN_A0 // chan 3
#define col_data PIN_A2 // chan 4
#define row_data PIN_B2 //chan 23
#define row_clk PIN_B4 //chan 25
#define row_stb PIN_B3 //chan 24
#define row_en PIN_B1 // chan22

int8 row=0;
int8 cot_dich=0;
int16 begin_of_read=0;
int8 buffer[16]=
{
0b01111111,0b11111111, // 0 là led sang, 1 led tắt.
0b01111111,0b11111111,// vị trí 0 là cột thứ nhất
0b01111111,0b11111111,
0b01111111,0b11111111,
0b01111111,0b11111111,
0b01111111,0b11111111,
0b01111111,0b11111111,
0b01111111,0b11111111,
};

void display_mot_byte(int8 d)
{
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
output_low(col_clk);
output_bit(col_data,shift_right(&d,1,0));
output_high(col_clk);
}

//##################################################
#INT_TIMER0
void timer0_isr()
{
output_low(Pin_A2);
set_timer0(250);
output_low(col_stb);
display_mot_byte(buffer[begin_of_read+row+0]);
display_mot_byte(buffer[begin_of_read+row+1]);
output_high(row_en);
if(row==0)
{
output_low(row_stb);
output_low(row_clk);
output_low(row_data);
output_high(row_clk);
output_high(row_stb);
}
else
{
output_low(row_stb);
output_low(row_clk);
output_high(row_data);
output_high(row_clk);
output_high(row_stb);
}
output_high(col_stb);
output_low(row_en);
row++;
begin_of_read=begin_of_read+1;
if(row==8)
{
row=0;
begin_of_read=cot_dich*1;
}

output_high(Pin_A2);
}

//#################################################
void reset_row()
{
int8 i;
output_high(row_data);
output_low(row_stb);
for(i=0;i<8;i++)
{
output_low(row_clk);
output_high(row_clk);
}
output_high(row_stb);

row=0;
}
//##################################################
void thay_doi()
{
int8 i;
for(i=0;i<8;i++)
{
shift_right(buffer[i*2],1,0);
shift_right(buffer[i*2+1],1,0);
}
delay_ms(100);
}
//shift_rignt(address,byte,value)

//##################################################
void main()
{
set_tris_A(0);
set_tris_b(0);
reset_row();
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(int_timer0);
// set_timer0(250);
enable_interrupts(global); // cho phep ngat toan cuc
while(1)
{
thay_doi();
delay_ms(100);
}
}[/QUOTE]


Múi giờ GMT. Hiện tại là 12:39 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam