PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

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

Ðề tài đã khoá
 
Ðiều Chỉnh Xếp Bài
Old 01-09-2007, 05:02 PM   #1
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
Mình thật sự cảm ơn bạn thaithienthanh rất nhiều về vấn đề này.Mình đã làm lại và chạy ngon lành.Nhưng để thực tế hơn mình đã làm một cái keypadcalulate thay cho mấy cái button .Mạch như sau:

Code:#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define RS RD0
#define RW RD1
#define E RD2
#define LCD PORTC
/*Ham yeu cau goi lenh dieu khien LCD*/
void comnwrt(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
/*Ham yeu cau goi du lieu hien thi len LCD*/
void datawrt(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
#int_RB
void ngat_RB(void)
{
if(RBIE && RBIF)
{
//hang A
if ((RB0) && (RB4))
{
LCD = '7';
datawrt();


}
if (RB0 && RB5)
{

LCD = '8';
datawrt();


}
if (RB0 && RB6)
{

LCD = '9';
datawrt();


}
if (RB0 && RB7)
{

LCD = ':';
datawrt();


}
//Hang B
if ((RB1) && (RB4))
{
LCD = '4';
datawrt();


}
if (RB1 && RB5)
{

LCD = '5';
datawrt();


}
if (RB1 && RB6)
{

LCD = '6';
datawrt();


}
if (RB1 && RB7)
{

LCD = 'x';
datawrt();


}
//Hang C
if ((RB2) && (RB4))
{
LCD = '1';
datawrt();


}
if (RB2 && RB5)
{

LCD = '2';
datawrt();


}
if (RB2 && RB6)
{

LCD = '3';
datawrt();


}
if (RB2 && RB7)
{

LCD = '-';
datawrt();


}
//Hang D
if ((RB3) && (RB4))
{
LCD = 0x0C;
comnwrt();


}
if (RB3 && RB5)
{

LCD = '0';
datawrt();


}
if (RB3 && RB6)
{

LCD = '=';
datawrt();


}
if (RB3 && RB7)
{

LCD = '-';
datawrt();


}

}
}

void main(void)
{
set_tris_b(0b00001111);
set_tris_c(0);
set_tris_d(0);
portb=0;
portc=0;
portd=0;

enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_TO_L);
LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface
comnwrt();
LCD = 0x0C; // Bat hien thi, tat con tro
comnwrt();

while(true)
{
}
}
Khi compile thì chương trình dịc ok nhưng khi mô phỏng mình lại thấy LCD tiếp tục đứng im .Hee, mong các bạn tiếp tục giúp đỡ cho trọn vẹn nha.
Mình làm về project này là để làm một cái smallcal có dạng như trên hình vẽ, mình cùng đang tìm hiểu thuật toán của nó,đây là thuật toán trong sách Interfacing PIC về các phép tình đơn giản:
Calculate result
IF key = ‘+’, Add
IF key = ‘-‘, Subtract
IF key = ‘x’, Multiply
IF key = ‘/’, Divide
Add Add Num1 + Num2
Load result, CALL Two digits
Subtract Subtract Num1 – Num2
IF result negative, load minus sign, CALL Display character
Load result, CALL Display character
Multiply
REPEAT
Add Num1 to Result
Decrement Num2
UNTIL Num2= 0
Load result, CALL Two digits
Divide
REPEAT
Subtract Num2 from Num1
Increment Result
UNTIL Num1 negative
Add Num2 back onto Num1 for Remainder
Load Result, CALL Display character
Load Remainder, CALL Display character
Two digits
Divide result by 10, load MSD, CALL Display character
Load LSD, CALL Display character
Mình viết bằng ASM thì được chứ còn CCS thì non tay lắm .Mong các bạn giúp đỡ mình hoàn thành project này.Cảm ơn nhiều.Chúc vui.
File Kèm Theo
File Type: rar LCDKEYPAD.rar (14.5 KB, 347 lần tải)

thay đổi nội dung bởi: cuopbienquin, 01-09-2007 lúc 05:13 PM.
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 05-09-2007, 11:26 AM   #2
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
Đã lâu rồi mà không thấy các bác trả lời giùm nhỉ.mình sốt ruột quá
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 11-09-2007, 06:49 PM   #3
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Chả có gì là im re hết bạn ah ! nó vẫn chạy đấy nhưng bạn ko nhìn thấy thui ! Lý do : chân Vss của LCD bạn đã mắc luôn vào Mass , mình chưa thử kiểu mới này nhưng .. mình đoán nó sáng ngời hoặc túi thui luôn . Nhà sx đưa cho ta chân Vss là để chỉnh độ sáng của LCD . BẠn phải mắc 1 con trở tinh chỉnh cỡ 5k vào đó , sau đó chỉnh độ sáng yếu đi thì mới thấy kí tự hiển thị đc chứ ! ĐÚng ko ?
Mr.Bi vẫn chưa có mặt trong diễn đàn  
Old 11-09-2007, 10:11 PM   #4
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
thế ah,nhưng mình sữa lại như bạn nói mà không sáng.Vậy bạn có thể test giùm mình không?
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 12-09-2007, 12:31 AM   #5
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Đừng nôn nóng : Bạn đang đi đúng hướng đấy , Không phải xoay vài 3 vòng là thấy ngay đâu ? Tui xoay phải cỡ 7 vòng cơ đấy . Xoay kiểm tra theo 2 chiều . Cứ coppy nguyên code hiển thị LCD vào , sau đó chỉnh độ sáng của LCD chắc chắn bạn sẽ thấy Kí tự . Tui cũng điên đầu cho cái LCD này cả buổi tối đó .
Mr.Bi vẫn chưa có mặt trong diễn đàn  
Old 12-09-2007, 07:49 PM   #6
thaithienanh
Đệ tử 7 túi
 
thaithienanh's Avatar
 
Tham gia ngày: Jul 2006
Bài gửi: 189
:
Send a message via Yahoo to thaithienanh
Unhappy Hix hix

Hix hix nghe hai bạn trao đổi với nhau mà đâu óc mình lùng bùng quá giờ mình hết hiểu gì hết luôn rồi . VSS nối với nguồn âm thì quá đúng rùi đâu có gì sai đâu , còn chân VEE thì ở một số LCD ta thấy nó còn có tên khác là V0 : chân này có tác dụng là điều chỉnh độ tương phản trên LCD, vì vậy ở chân này nguời ta thường đấu vào đó một biến trở để điều chỉnh điện áp, dao động trong khoảng từ 0 --> 5V, trong lúc test có thể đấu trực tiếp xuống nguồn âm cũng đuợc .

Còn về phần lý do tại sao cái LCD của bạn không hiển thị là do cà hai lỗi thiết kế phần cứng và phần mềm luôn , cụ thể ở đây là về cách quét phím : Như mình nhận thấy ý đồ của bạn ở đây là set PortB từ chân RB0 --> RB3 là ngõ ra, còn lại là ngõ vào, khi ấn nút thì trình sẽ trôi vào hàm ngắt, ở đó bạn sẽ test xem mức áp ở các chân của matrix mà suy ra phím nào đã bấm đúng không => Ý đồ có những sai lầm như sau :

1. Set Port của bạn bị ngược, đây là cái sai cơ bản nhé
2. Giải thuật quét phím này về cơ bản sai hoàn toàn bởi lẽ : khi bạn đã set chân là ngõ ra thì làm sao mà bạn có thể đọc đuợc giá trị từ nó về

Ở đây vì để cho bạn tự học, tự phát huy khả năng của mình là chính cho nên mình chỉ đưa ra cho bạn giải thuật để giải quyết vấn đề thui, tuyệt không thể trực tiếp viết code giùm bạn đuợc :
- Cách quét phím : bạn thực hiện set Port có 4 ngõ ra và 4 ngõ vào : bây giờ ví dụ các chân ra là từ 1-->4, các chân vào là từ 5-->8 nhé, quy trình quét như sau :
Xuất áp ra chân 1 -> test áp ở chân 5 (gán giá trị cố định vào đó và kết hợp hiển thị LCD),6(...),7(...),8(...), đưa áp chân này về mức cũ ; Xuất áp ra chân 2 -> test áp ở 5(...),6(...),7(...),8(...) ; ..... như vậy bạn sẽ đuợc một ma trận phím quét và hiển thị ra LCD, => mấu chốt cách quét này là gì ?: đó là lợi dụng khả năng chủ động của mình khi cố ý xuất áp ra một chân và kiểm tra mức áp ở 4 chân còn lại => đây là cách quét phím cơ bản nhất .

Trong đó có một phím xoá cả màn hình bạn dùng lệnh : LCD=0x01;comnwrt() ;

Còn về phép tính bạn có thể viết cho nó một hàm tính toán riêng : khai báo 4 biến là a,b,pheptinh,ketqua --> sau mỗi lần đọc đuợc giá trị từ phím về thì gửi giá trị vào hàm này và lựa chọn nhét vào biến a hay b (nhét vào a khi chưa ấn các phím phép tính +,-,… Và vào b sau khi đã ấn), công việc là phải sắp xếp các giá trị nhét vào này thành hai con số a và b hẳn hòi (như vậy a và b cũng cần có hàm con để thực hiện sắp xếp, gợi ý như sau :bạn dùng biến count trong này sau mỗi lần value đuợc đưa vào thì biến này sẽ thay đổi do đó dữ liệu căn theo đó mà sắp xếp), xong lúc này chỉ việc chờ phím "=" là ta sẽ đem a (+,-... căn cứ vào biến pheptinh) cho b để ra c sau đó đem c hiển thị lên LCD là xong .

Thú thật mình chưa làm cái này bao giờ nên chỉ thực hiện sơsài để có thể hướng dẫn đuợc cho bạn thui, có gì thiếu sót thì bỏ quá cho vậy, dưới đây là hình ảnh về phần cứng để bạn hiểu hơn :

Bạn sẽ thành công nếu như bạn cố gắng hơn nữa, phát huy tối đa khả năng của mình , từ từ sẽ có kinh nghiệm, mong rằng sau này có dịp mình sẽ học hỏi lại

Thân.
Hình Kèm Theo
File Type: jpg pheptinh.JPG (130.1 KB, 45 lần tải)
File Type: jpg ketqua.JPG (121.0 KB, 36 lần tải)
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________
_ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
. . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .
thaithienanh vẫn chưa có mặt trong diễn đàn  
Old 13-09-2007, 12:13 PM   #7
thobnvn87
Nhập môn đệ tử
 
Tham gia ngày: Aug 2007
Bài gửi: 1
:
các bac ơi giup em voi đưoc khong ạ? em dang phai lam 1 bai tap: tim hieu ve net matrix xem no hoat dông the nào? ma chua biet lam ra sao day.bac nao biet giup em voi nha chieu nay em phai nop bai roi.thank cac bac nhieu
thobnvn87 vẫn chưa có mặt trong diễn đàn  
Old 14-09-2007, 01:20 PM   #8
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
Bạn đọc ơ luồng này ở page 2 hay 3 gì có nói đó.Chúc vui
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 21-09-2007, 03:36 PM   #9
nbchien
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 4
:
Ngắt Timer0
Đây là chương trình dùng ngắt Timer0 định thì 1s.
Đầu tiên led ở chân RB0 sáng, sau 1s sẽ dịch sang trái, nghĩa là led 1 trên chân RB1 sáng , lần lượt như vậy cho các led trên portB và lặp lại mãi mãi.
Code:

//************************************************** **
// Author : nhh
// Date : 02/04/06
// Hardware: PIC16F877A
//************************************************** **
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
{
count=0;
a=a<<1; // dich trai a 1bit
}
if(a==256)
{
a=1;
count=0;
}
}
//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a;
}
}


Ai hiểu chương trình trên giải thích hộ em với ạ:
Thứ nhất khi nào hàm con interrupt_timer0() được gọi
Thứ hai, việc tính toán định thì 1s được tính như thế nào.
Thứ ba, biến a được khai báo là số nguyên 8bit. Phạm vi từ 0->255,làm sao bằng 256 đc.
Em mới học nên kô biết, mong mọi người chỉ giúp. Thanks!

thay đổi nội dung bởi: nbchien, 21-09-2007 lúc 03:45 PM.
nbchien vẫn chưa có mặt trong diễn đàn  
Old 22-09-2007, 10:28 AM   #10
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Thứ nhất khi nào hàm con interrupt_timer0() được gọi
Thứ hai, việc tính toán định thì 1s được tính như thế nào.
Thứ ba, biến a được khai báo là số nguyên 8bit. Phạm vi từ 0->255,làm sao bằng 256 đc.
1. Ngắt Timer0 được gọi khi Timer 0 bị tràn từ 0xff sang 0x00 với điều kiện phải có 2 khai cho phép ngắt timer 0 và ngắt toàn cục:
Code:
enable_interrupts(int_timer0); 
enable_interrupts(global);
2. Việc tính toán thời gian tràn của Timer rất dễ, xem luồng "PIC6f877A từ dễ tới khó", hoặc tìm đâu đó trong diễn đàn này phần mềm "PIC Timer Calculator".

3. Biến a 8bit int, ko thể có giá trị 256 -> đúng vậy.
Code:
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
   set_timer0(6);
   ++count;
   if(count == 2000)   // 2000*500us = 500000us = 1s
      {
         count=0;
         rotate_left(&a,1);
      }
}
//Chuong trinh chinh
void main(void)
{
   set_tris_b(0);
   enable_interrupts(int_timer0);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); 
   enable_interrupts(global);
   set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
   a = 0x01;
   
   while(true)
   {
      PORTB = a;
   }
}
P/S: Khi post chương trình, bạn nên sử dụng thẻ CODE #.
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Old 22-09-2007, 12:13 PM   #11
nguyenvo
Nhập môn đệ tử
 
Tham gia ngày: Aug 2007
Bài gửi: 4
:
hi!các ban có chương trình hướng dẫn từ a-z của trình biên dịch asm không?thank
nguyenvo vẫn chưa có mặt trong diễn đàn  
Old 24-09-2007, 04:01 PM   #12
nbchien
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 4
:
Cảm ơn bác nhh đã trả lời câu hỏi của em. Bác có thể viết tiếp 1 chương trình đếm số xung đưa vào PIC trong 1 thời gian nhất định (1s chẳng hạn) để em và mọi người cùng tham khảo được không ạ?
nbchien vẫn chưa có mặt trong diễn đàn  
Old 25-09-2007, 03:03 PM   #13
nbchien
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 4
:
Exclamation

Trích:
Nguyên văn bởi nbchien View Post
Cảm ơn bác nhh đã trả lời câu hỏi của em. Bác có thể viết tiếp 1 chương trình đếm số xung đưa vào PIC trong 1 thời gian nhất định (1s chẳng hạn) để em và mọi người cùng tham khảo được không ạ?
Sao chẳng thấy ai có ý kiến j nhỉ? Các cao thủ đâu hết rồi!

thay đổi nội dung bởi: nbchien, 26-09-2007 lúc 02:23 PM.
nbchien vẫn chưa có mặt trong diễn đàn  
Old 03-10-2007, 01:06 AM   #14
thaithienanh
Đệ tử 7 túi
 
thaithienanh's Avatar
 
Tham gia ngày: Jul 2006
Bài gửi: 189
:
Send a message via Yahoo to thaithienanh
Trích:
Nguyên văn bởi nbchien View Post
Cảm ơn bác nhh đã trả lời câu hỏi của em. Bác có thể viết tiếp 1 chương trình đếm số xung đưa vào PIC trong 1 thời gian nhất định (1s chẳng hạn) để em và mọi người cùng tham khảo được không ạ?
Ừhm với câu hỏi này bạn có thể tham khảo qua ví dụ của anh Linh
File Kèm Theo
File Type: rar Do tan so 50MHz.rar (181.8 KB, 622 lần tải)
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________
_ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
. . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .
thaithienanh vẫn chưa có mặt trong diễn đàn  
Old 24-09-2007, 10:16 PM   #15
funnyCat
Nhập môn đệ tử
 
Tham gia ngày: May 2007
Bài gửi: 3
:
Các bác cho em hỏi là trong CCS làm sao có thể sử dụng được mảng nhiều phần tử cho PIC16F877a(em muốn dùng mảng khoảng 128 phần tử, nhưng chỉ khai báo được khoảng 93-94 phần tử thì nó báo là ko đủ RAM)
funnyCat vẫn chưa có mặt trong diễn đàn  
Ðề tài đã khoá

Ðiều Chỉnh
Xếp Bà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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
TUT về USART trong PIC16F877A mafd_47a MPASM 16 19-02-2025 05:32 AM
TUT ve I2C ( pic16f877a ) mafd_47a MPASM 28 28-01-2025 10:45 PM
Lập nhóm PIC16F877A nhh Cơ bản về vi điều khiển và PIC 285 08-03-2017 11:08 PM
Bộ so sánh và PWM cho PIC16F877A anhquangngai Cơ bản về vi điều khiển và PIC 24 08-09-2012 09:00 AM
Pic16f877a TỪ DỄ TỚi KhÓ ntc Cơ bản về vi điều khiển và PIC 373 23-05-2009 10:24 PM


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


Đượ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