PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 19-09-2008, 06:44 PM   #1
8051topic
Đệ 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
Mình không biết cách pót code mong moi người thông cảm!

thay đổi nội dung bởi: 8051topic, 22-09-2008 lúc 04:48 PM.
8051topic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-09-2008, 04:56 PM   #2
8051topic
Đệ 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 !
Hình Kèm Theo
File Type: jpg Led7SegSch.JPG (47.1 KB, 95 lần tải)
File Kèm Theo
File Type: rar test_7_seg.rar (574 Bytes, 291 lần tải)
8051topic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-09-2008, 06:00 PM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-09-2008, 05:10 PM   #4
8051topic
Đệ 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ĩ.
8051topic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-12-2008, 12:34 PM   #5
dungbk49
Đệ 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
dungbk49 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2008, 10:39 PM   #6
8051topic
Đệ 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.
8051topic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2008, 09:03 AM   #7
8051topic
Đệ 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
File Kèm Theo
File Type: rar Mo_phong.rar (17.2 KB, 201 lần tải)
8051topic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-12-2008, 12:40 PM   #8
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Trích:
Nguyên văn bởi namqn View Post
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?
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-04-2009, 03:13 PM   #9
8051topic
Đệ 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();
   }
}
8051topic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-04-2009, 02:34 AM   #10
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi dung117 View Post
chào các báce 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,
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-04-2009, 12:30 PM   #11
dung117
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
dung117 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2010, 07:22 PM   #12
chimcon
Đệ 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();
}
}
chimcon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2010, 07:35 PM   #13
chimcon
Đệ 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.
chimcon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2010, 07:52 PM   #14
8051topic
Đệ 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.
Hình Kèm Theo
File Type: jpg Led7SegSch.JPG (47.1 KB, 19 lần tải)
8051topic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-10-2010, 08:13 PM   #15
chimcon
Đệ 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();
}
}
chimcon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam