![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ tử 4 túi
Tham gia ngày: Apr 2006
Bài gửi: 71
: |
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 thay đổi nội dung bởi: 8051topic, 22-09-2008 lúc 04:48 PM. |
![]() |
![]() |
![]() |
#2 |
Đệ tử 4 túi
Tham gia ngày: Apr 2006
Bài gửi: 71
: |
Sao không ai có ý kiến gì vậy?
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 ! |
![]() |
![]() |
![]() |
#3 |
Trưởng lão PIC bang
|
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
![]() |
![]() |
![]() |
#4 |
Đệ tử 6 túi
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
: |
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?
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 4 túi
Tham gia ngày: Apr 2006
Bài gửi: 71
: |
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ĩ.
|
![]() |
![]() |
![]() |
#6 |
Đệ tử 1 túi
Tham gia ngày: Nov 2007
Bài gửi: 20
: |
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
|
![]() |
![]() |
![]() |
#7 |
Đệ tử 4 túi
Tham gia ngày: Apr 2006
Bài gửi: 71
: |
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. |
![]() |
![]() |
![]() |
#8 |
Đệ tử 4 túi
Tham gia ngày: Apr 2006
Bài gửi: 71
: |
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 |
![]() |
![]() |
![]() |
#9 |
Đệ tử 4 túi
Tham gia ngày: Apr 2006
Bài gửi: 71
: |
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(); } } |
![]() |
![]() |
![]() |
#10 |
Nhập môn đệ tử
Tham gia ngày: Mar 2009
Bài gửi: 2
: |
thanks bác nhìu.để e kiểm tra từng phần.hi
|
![]() |
![]() |
![]() |
#11 |
Đệ tử 1 túi
Tham gia ngày: Apr 2010
Bài gửi: 24
: |
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(); } } |
![]() |
![]() |
![]() |
#12 |
Nhập môn đệ tử
Tham gia ngày: Aug 2009
Bài gửi: 6
: |
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. |
![]() |
![]() |
![]() |
#13 |
Đệ tử 1 túi
Tham gia ngày: Apr 2010
Bài gửi: 24
: |
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. |
![]() |
![]() |
![]() |
#14 |
Đệ tử 4 túi
Tham gia ngày: Apr 2006
Bài gửi: 71
: |
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. |
![]() |
![]() |
![]() |
#15 |
Đệ tử 1 túi
Tham gia ngày: Apr 2010
Bài gửi: 24
: |
// 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(); } } |
![]() |
![]() |
![]() |
|
|