PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Hiển thị số '1234' trên LED 7 đoạn - PIC6F887 (http://www.picvietnam.com/forum/showthread.php?t=2817)

8051topic 19-09-2008 06:44 PM

Hiển thị số '1234' trên LED 7 đoạn - PIC6F887
 
Chào mọi người!
Mình viết một chương trình đơn giản hiển thị số '1234' trên 4 LED 7 đoạn (dùng 7447 để giải mã) với PIC16F887 mà nó hiển thị đúng với PORTC, D, còn PORTB thì hiển thị số '1288'.
Nhưng nếu lấy kết quả ở PORTD đem qua PORTB thì lại đúng.
Mình đã kiểm tra phần cứng rồi (mạch không hề bị chạm ở PORTB), đã thử với con PIC mới khác luôn.
Mô phỏng trên Proteus thấy tốt trên cả 3 PORT.
PORTB chạy các ứng dụng khác bình thường.
Vậy mọi người xem giúp mình xem lí do tại sao?
Thanks everybody!
Code:

;---------------------------------------------------------------------------
        List p=16f887
        #INCLUDE <P16F887.INC>
        __CONFIG        _CONFIG1, _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC &_LVP_OFF
;THACH ANH 4MHZ
;CHUONG TRINH HIEN THI SO '1234' LEN 4 LED 7SEG DUNG 7447
;OK VOI PORT C, D
;O PORT B NO HIEN THI SO 1288 --> KHONG HIEU
;TRINH DICH MPLAB 8.14
;---------------------------------------------------------------------------
COUNT1        EQU        0X20
COUNT2        EQU        0X21
COUNT3        EQU        0X22
;---------------------------------------------------------------------------
        ORG                0X0000
        GOTO        MAIN
MAIN
;KHOI TAO PORT
        BANKSEL        TRISB
        CLRF        TRISB
        CLRF        TRISC
        CLRF        TRISD
        BANKSEL        PORTB
;---------------------------------------------------------------------------
;BAT DAU CHUONG TRINH
START
        MOVLW        0xE0                ;DONVI
        MOVWF        PORTB
        MOVLW        0x04
        IORWF        PORTB,F
        CALL        DELAY1

        MOVLW        0D0H                ;CHUC
        MOVWF        PORTB
        MOVLW        03H
        IORWF        PORTB,F
        CALL        DELAY1

        MOVLW        0B0H                ;TRAM
        MOVWF        PORTB
        MOVLW        02H
        IORWF        PORTB,F
        CALL        DELAY1

        MOVLW        070H                ;NGAN
        MOVWF        PORTB
        MOVLW        01H
        IORWF        PORTB,F
        CALL        DELAY1

        GOTO        START
                   
DELAY1
        MOVLW        d'1'
        MOVWF        COUNT1
D1
        MOVLW        d'199'
        MOVWF        COUNT2
        MOVLW        d'1'
        MOVWF        COUNT3
DELAY0
        DECFSZ        COUNT2,1
        GOTO        $+2
        DECFSZ        COUNT3,1
        GOTO        DELAY0
        DECFSZ        COUNT1,1
        GOTO        D1
        RETURN

        END

Mình không biết cách pót code mong moi người thông cảm!

8051topic 22-09-2008 04:56 PM

Sao không ai có ý kiến gì vậy?
 
2 Attachment(s)
Mọi người xem giúp mình xem, mình thấy đoạn code rất đơn giản nhưng chỉ chạy được trên các PORT C, D mà không chạy được trên PORT B nên không hiểu.
Mình gửi kèm sơ đồ mạch led 7 đoạn nè, dùng dây bus nối vô pỏt của VĐK thôi. Với file .ám luôn.
Cảm ơn mọi người !

namqn 22-09-2008 06:00 PM

Bạn cần xóa các bit của thanh ghi ANSELH để dùng các chân của port B ở chế độ digital. Không nên dùng lệnh IORWF trên thanh ghi port mà nên dùng IORLW để thao tác trên thanh ghi W, sau đó ghi kết quả cuối cùng ra thanh ghi port.

Thân,

8051topic 24-09-2008 05:10 PM

Cảm ơn anh Namqn, em sẽ về làm lại. Như vậy là em hiểu thêm về cấu trúc của con PIC rồi. Do tự học nên không xem kĩ.

dungbk49 04-12-2008 12:34 PM

chào bạn 8051topic bạn có thể up file mô phỏng hiển thị số "1234" trên 4 led 7 thanh cho mình được không mình mô phỏng led bị nháy liên tục, cám ơn bạn nhiều

8051topic 13-12-2008 10:39 PM

Chào bạn dungbk49, cảm ơn bạn đã quan tâm.
Bây giờ mình không có đem theo file mô phỏng trên Protues, vậy hẹn bạn lần sau nhé.
mà mô phỏng nó chớp bạn cứ thử nạp vào vdk xem.

8051topic 17-12-2008 09:03 AM

1 Attachment(s)
Chuong trình đã được chỉnh sửa (tắt chức năng A/D, không thao tác trực tiếp trên PORT nữa).
Hiện tại PC của mình không có MPLAB IDE nên không dịch sang file Hex được, các bạn về dịch dùm mình nha.
Trong file mô phỏng không dùng Trans và hiển thị không đúng thứ tự các Led tuy vậy không bị chớp, quan trọng nhất là mình nạp vô mạch thật thì chạy dúng. Vì vậy các bạn cứ nạp thử vào IC di.
File dính kèm gồm ASM, file mô phỏng Proteus 6.9SP5.
Code:


;---------------------------------------------------------------------------
        List p=16f887
        #INCLUDE <P16F887.INC>
        __CONFIG        _CONFIG1, _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC &_LVP_OFF
;THACH ANH 4MHZ
;CHUONG TRINH HIEN THI SO '1234' LEN 4 LED 7SEG DUNG 7447
;DA CHINH SUA
;TRINH DICH MPLAB 8.14
;---------------------------------------------------------------------------
COUNT1        EQU        0X20
COUNT2        EQU        0X21
COUNT3        EQU        0X22
;---------------------------------------------------------------------------
        ORG                0X0000
        GOTO        MAIN
MAIN
;KHOI TAO PORT
        BANKSEL        TRISB                ;BSF        STATUS,RP0        BSF                STATUS,RP1
        CLRF        TRISB
        CLRF        TRISC
        CLRF        TRISD
        BANKSEL        ANSEL
        CLRF        ANSELH                ;TAT CHUC NANG A/D CUA VDK
        BANKSEL        PORTB
;---------------------------------------------------------------------------
;BAT DAU CHUONG TRINH
START
        MOVLW        0E0H                ;DONVI
        IORLW        04H       
        MOVWF        PORTB
        CALL        DELAY1

        MOVLW        0D0H                ;CHUC
        IORLW        03H
        MOVWF        PORTB
        CALL        DELAY1

        MOVLW        0B0H                ;TRAM
        IORLW        02H
        MOVWF        PORTB
        CALL        DELAY1

        MOVLW        070H                ;NGAN
        IORLW        01H
        MOVWF        PORTB
        CALL        DELAY1

        GOTO        START
                   
DELAY1:
        MOVLW        d'1'
        MOVWF        COUNT1
D1
        MOVLW        d'199'
        MOVWF        COUNT2
        MOVLW        d'1'
        MOVWF        COUNT3
DELAY0
        DECFSZ        COUNT2,1
        GOTO        $+2
        DECFSZ        COUNT3,1
        GOTO        DELAY0
        DECFSZ        COUNT1,1
        GOTO        D1
        RETURN

        END


lequocbao 18-12-2008 12:40 PM

Trích:

Nguyên văn bởi namqn (Post 19031)
Bạn cần xóa các bit của thanh ghi ANSELH để dùng các chân của port B ở chế độ digital. Không nên dùng lệnh IORWF trên thanh ghi port mà nên dùng IORLW để thao tác trên thanh ghi W, sau đó ghi kết quả cuối cùng ra thanh ghi port.

Thân,

Anh Namqn ơi !em cũng đang gặp rắc rối với portB(sử dụng Digital).cùng 01 dữ liệu nhưng xuất ra portC,D thì ok nhưng wa portB thì lại sai.Nên anh cho em hỏi là dùng css c thì "xóa các bit của thanh ghi ANSELH " thì làm như thế nào bây giờ anh?

8051topic 11-04-2009 03:13 PM

Chào mọi người, bây giờ mới có thời gian nghiên cứu PIC tiếp.
Mình vừa viết lại chương trình hiển thị trên led 7 đoạn (phần cứng như trên), lần này mình dùng CCS C và đếm từ 0000 --> 9999. Chương trình chạy tốt trên các Port, mình post lên để các bạn tham khảo.
Chương trình hiển thị cùng lúc lên Port B và D.
Code:

//*****************************************************************************
// Author  : Tran Van Duy
// Date    : 06/04/09
// Hardware: PIC16F887
//*****************************************************************************
#include <16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)

int16 a, dem;
int8 i, nghin, tram, chuc, dvi;

void hex_bcd()
{
  nghin=a/1000;
  a=a%1000;
  tram=a/100;
  a=a%100;
  chuc=a/10;
  dvi=a%10;
}
void hienthi()
{
  i=0;
  while(i<100)
  {
      output_b(dvi|0xE0);  //don vi so 4
      output_d(dvi|0xE0);  //don vi so 4
      delay_ms(2);
      output_b(chuc|0xD0);
      output_d(chuc|0xD0);
      delay_ms(2);
      output_b(tram|0xB0);
      output_d(tram|0xB0);
      delay_ms(2);
      output_b(nghin|0x70);
      output_d(nghin|0x70);
      delay_ms(2);
      i++;
  }
 
}
void main()
{
  set_tris_b(0x00);
  set_tris_d(0x00);
  dem=0;
  while(1)
  {
      dem=dem+1;
      if(dem==10000)
      {
        dem=0;
      }
      a=dem;
      hex_bcd();
      hienthi();
  }
}


namqn 24-04-2009 02:34 AM

Trích:

Nguyên văn bởi dung117 (Post 25168)
chào các bác:)e có chỗ chưa hiểu chưa biết sửa lỗi trong code của mạch làm đồng hồ như thế này(cái này e cũng tham khảo có chỉnh sửa thôi).mong các tiền bối chỉ giúp.xin đa tạ.hi.các bác giúp e nhé(e đang rất cần)
...
ah.e hỏi có cần thiết thêm phần chương trình con: hienthi(int8 so) như trong code ko ạ.néu cần thì ko cần thêm cần file led7seg.h đúng ko ạ

Bạn đưa toàn bộ chương trình dài mấy trang mà lại không có sơ đồ mạch phần cứng tương ứng, do đó sẽ rất khó để người khác kiểm tra giúp bạn.

Bạn nên thử nghiệm từng phần đơn giản trước, để đảm bảo mỗi chức năng đều hoạt động tốt. Đừng hy vọng viết một lần là chạy luôn.

Thân,

dung117 24-04-2009 12:30 PM

thanks bác nhìu.để e kiểm tra từng phần.hi

chimcon 28-10-2010 07:22 PM

EM VIET CHUONG TRINH DEM SAN PHAM DUNG CCS KHONG BIET SAO MA
BAO LOI QUA TROI. MONG CAC BAN GIUP DO\
// Author : Tran Van Duy
// Date : 06/04/09
// Hardware: PIC16F887
//************************************************** ***************************
#include <16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)

int16 a, dem;
int8 i, nghin, tram, chuc, dvi;

void hex_bcd()
{
nghin=a/1000;
a=a%1000;
tram=a/100;
a=a%100;
chuc=a/10;
dvi=a%10;
}
void hienthi()
{
i=0;
while(i<100)
{
output_b(dvi|0xE0); //don vi so 4
output_d(dvi|0xE0); //don vi so 4
delay_ms(2);
output_b(chuc|0xD0);
output_d(chuc|0xD0);
delay_ms(2);
output_b(tram|0xB0);
output_d(tram|0xB0);
delay_ms(2);
output_b(nghin|0x70);
output_d(nghin|0x70);
delay_ms(2);
i++;
}

}
void main()
{
set_tris_b(0x00);
set_tris_d(0x00);
dem=0;
while(1)
{
dem=dem+1;
if(dem==10000)
{
dem=0;
}
a=dem;
hex_bcd();
hienthi();
}
}

chimcon 28-10-2010 07:35 PM

ChÀo bẠn 8051 bẠn cỎ thỂ up code mÔ phỎng mẠch ĐẾm tỪ 0000 ĐẾn 9999 lÊn dÙm mÌnh ĐƯỢc khÔng?

MÌnh Đang lÀ ĐỒ Ạn mẠch ĐẾm sẢn phẪm tỪ 000 ĐẾn 999 nhẬn xung tỪ 2249 lẤy vÀo vi ĐiỀu khiỂn .bẠn giups mÌnh nhÉ.

CÃm Ơn bẠn rẤt nhiỀu.

8051topic 28-10-2010 07:52 PM

1 Attachment(s)
Chào bạn chimcon, code ở post 9 là đoạn code đếm từ 0000 đến 9999 đó bạn. Phần cứng bạn dùng mạch quét 4 led 7 đoạn, 4 chân quét và 4 chân dữ liệu vừa đủ 1 pỏt trên VĐK, dùng 7447 để giải mã led 7 đoạn. Phần cứng như hình.
File mô phỏng mình bị mất rồi bạn àh, chịu khó ráp mạch thật chạy đi bạn, có gì lại hỏi tiếp.

chimcon 30-10-2010 08:13 PM

// Author : Tran Van Duy
// Date : 06/04/09
// Hardware: PIC16F887
//************************************************** ***************************
#include <16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)

int16 a, dem;
int8 i, nghin, tram, chuc, dvi;

void hex_bcd()
{
nghin=a/1000;
a=a%1000;
tram=a/100;
a=a%100;
chuc=a/10;
dvi=a%10;
}
BAN GIAI THICH DUM MINH PHAN DOI SAN MA BCD NHE

void hienthi()
{
i=0;
while(i<100)
{
output_b(dvi|0xE0); BAN GHI CHU THICH DUM MINH PHAN NAY NHE.
output_d(dvi|0xE0);
delay_ms(2);
output_b(chuc|0xD0);
output_d(chuc|0xD0);
delay_ms(2);
output_b(tram|0xB0);
output_d(tram|0xB0);
delay_ms(2);
output_b(nghin|0x70);
output_d(nghin|0x70);
delay_ms(2);
i++;
}

}
void main()
{
set_tris_b(0x00);
set_tris_d(0x00);
dem=0;
while(TRUE)
{
dem=dem+1;
if(dem==10000)
{
dem=0;
}
a=dem;
hex_bcd();
hienthi();
}
}

chimcon 30-10-2010 08:35 PM

output_b(dvi|0xE0);
output_d(dvi|0xE0);
BAN DUNG MOT PORT MA SAO LAI OUTPUT_B MA LAI OUTPUT_D
MINH DOC TRONG CCS CHI THAY OUTPUT_HIGH() VA OUTPUT_LOW() THOI MÀ
CÃM ƠN BẠN.
BẠN GIẢI THÍCH DÙM MÌNH NHÉ

chimcon 30-10-2010 08:37 PM

NẾu mÌnh nhỚ khÔng lẰm chỈ dÙng cho bit thÔi thÌ phẢi.

8051topic 30-10-2010 10:01 PM

Trước tiên bạn đã compile thử đoạn code của mình chưa?
Bạn thấy có output_b và output_d là do mình muốn xuất đồng thời trên 2 port này, bạn cần xuất ra port nào thì output_ pỏt đó thôi.
Về đoạn OR hai giá trị với nhau (dvi|0xE0):
- dvi, chuc, tram, nghin là dữ liệu,
- E0, D0, B0, 70 là điều khiển led nào sáng, khi bạn dùng E0 (1110 0000) tức là led ở bit 4 sáng, theo như phần cứng nó là hàng đơn vị, suy luận từ từ vậy với D0, B0, 70 nha.
Nếu bạn mới bắt đầu với VĐK mình khuyên bạn nên làm 1 mạch led 7 đoạn như vầy, có socket nối dây ra luôn đẻ sau này còn thử nghiệm với nhiều thứ khác nữa, lúc đó chỉ cần nối dây tới board VĐK thôi.

chimcon 03-11-2010 06:30 PM

// Author : Tran Van Duy
// Date : 06/04/09
// Hardware: PIC16F887
//************************************************** ***************************
#include <16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
//khai bao cac bien hang
//pin va portd
#define sw rc0
// bao cac bien toan cuc

int16 a, dem;
int8 i, nghin, tram, chuc, dvi;
// cac ham su dung trong chuong trinh

void hex_bcd()
{
nghin=a/1000;
a=a%1000;
tram=a/100;
a=a%100;
chuc=a/10;
dvi=a%10;
}
//BAN GIAI THICH DUM MINH PHAN DOI SAN MA BCD NHE

void hienthi()
{
i=0;
while(i<100)
{
output_b(dvi|0xE0); //BAN GHI CHU THICH DUM MINH PHAN NAY NHE.
output_d(dvi|0xE0);
delay_ms(1);
output_b(chuc|0xD0);
output_d(chuc|0xD0);
delay_ms(1);
output_b(tram|0xB0);
output_d(tram|0xB0);
delay_ms(1);
output_b(nghin|0x70);
output_d(nghin|0x70);
delay_ms(1);
i++;
}

}
void main()
{
set_tris_b(0x00);
set_tris_d(0x00);
set_tris_c(0xFF);

dem=0;
while(TRUE)

{


IF(rc0 == 0 )
DELAY_MS(10);


dem=dem+1;
if(dem==10000)
{
dem=0;
}
a=dem;
hex_bcd();
hienthi();



}
}
MINH BỊ LỔI:
UNDEFINED IDENTIFIER.

chimcon 03-11-2010 06:33 PM

Minh bi loi undifened identifier khi co ham if vao.
Mong cẬcn giÚp ĐỠ.

8051topic 03-11-2010 07:12 PM

Bạn mở file 16F887.h trong thu vien của CCS ra xem nhé, như vậy bạn đổi
#define sw rc0 thành
#define sw PIN_C0
và thay đổi chỗ này nữa
IF(rc0 == 0 )
DELAY_MS(10);

đổi rc0 thành PIN_C0 hay sw là được

taitokho 09-11-2010 10:20 AM

hix
pác nampn ơi giúp với.chỉ dùm cai' mạch nguyên lý cua doan led 7 thanh hien thi đếm từ 0000>9999
dùng ic89c51
giúp với
Đang dung orcad 15.7
Thank
SOS

tachangconai412 09-08-2012 12:17 PM

Bạn kiểm tra lại giúp mình chỗ này hen:
1. Phần khai báo: a la int16, nghin, tram, chuc,.. là int8. Hai kieu khai bao này ko tương thích voi nhau, 8bit thi là 8bit cả còn 16bit thì là 16bit cả chứ như vậy khi chia số ra dễ bị sai lắm. Phần giải thích thì bạn chỉ cần làm như thế này là hiểu thui ah, Cho a = 1234, ruj áp dung công thức như trên đổi sem đúng chưa, dấu "/" là chia lấy phần nguyên, dấu"%" là chia lấy phần dư
2: 0xE0 -> 1 - 1 - 1 - 0
0xD0 -> 1 - 1 - 0 - 1
0xB0 -> 1 - 0 - 1 - 1
0x70 -> 0 - 1 - 1 - 1
đây là 4 bit cao of portb và portd, sau khi đưa dữ liệu ra portb thì đưa tiếp xung quét (dưới dạng là 0xE0, 0xD0,.....) ra luôn để quét dữ liệu đó luôn, xung quét bằng 0 thì sáng and 1 thì tắt, portd cũng tương tự như vậy.


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