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 01-09-2009, 11:16 AM   #1
socola
Đệ tử 1 túi
 
Tham gia ngày: Jun 2009
Bài gửi: 18
:
Bài tập nút nhấn cẩn giúp đỡ

Mình có viết 1 CT điều khiển có 2 nút nhấn. Khi nhấn phím 1 thì led đơn 1 sáng và led 7 hiện số 1. Tương tự khi bấm số 2
Vấn đề mình cần giúp là khi mình tắt nguồn và bật lại thì led 7 đoạn, led đơn vẫn hiện 1 số.
Ý mình là khi bật nguồn tất cả sẽ tắt hết để mình chọn lại số mình muốn

Thanks

code: (Nhờ mọi người chỉ mình cách bỏ vào thẻ code)
#include <16F877A.h>
#include <DEF_877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)

#define led0 rd0
#define led1 rd1

#define bt0 rc0
#define bt1 rc1

#define loa ra2

#define led7vcc ra0

#define data_led portb

#define led_singer portd


char dig[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void display_int(int x)
{
int i;
i = x%10;
led7vcc = 0;
data_led = dig[i];
delay_ms(2);
led7vcc = 1;
}

void led_don(int i)
{
switch(i)
{
case 1: led_singer = 0x01; break;
case 2: led_singer = 0x02; break;

default:led_singer = 0x00; break;
}
}

int detect_sw()
{ int i ;

if(bt0 == 0)
{
i=1;
loa = 1;
delay_ms(50);
loa = 0;
delay_ms(200);

}
if(bt1== 0)
{
i=2;
loa = 1;
delay_ms(50);
loa = 0;
delay_ms(200);

}

return i;
}

void main()
{
int i ;

trisa = 0x00;
trisb = 0x00;
trisc = 0xff;
trisd = 0x00;


porta = 0x00;
portb = 0x00;
portc = 0x00;
portd = 0x00;

while(true)
{

i = detect_sw();
display_int(i);
led_don(i);
}
}
socola vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-09-2009, 10:40 PM   #2
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi socola View Post
Mình có viết 1 CT điều khiển có 2 nút nhấn. Khi nhấn phím 1 thì led đơn 1 sáng và led 7 hiện số 1. Tương tự khi bấm số 2
Vấn đề mình cần giúp là khi mình tắt nguồn và bật lại thì led 7 đoạn, led đơn vẫn hiện 1 số.
Ý mình là khi bật nguồn tất cả sẽ tắt hết để mình chọn lại số mình muốn

Thanks
Góp í đầu tiên ,đừng bao giờ dùng biến toàn cục và cục bộ trùng nhau thế

Code:
#include <16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use     delay(clock=20000000)

#define led0   rd0
#define led1   rd1

#define bt0    rc0
#define bt1    rc1

#define loa    ra2

#define led7vcc      ra0

#define data_led     portb

#define led_singer   portd


const unsigned char dig[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void display_int(int dta)
{ led7vcc = 0;
   if(dta==0) data_led = dig[0xFF];
   else data_led = dig[dta%10];
   delay_ms(2);
   led7vcc = 1;
}

void led_don(int dta)
{
   switch(dta)
   {  case 0: led_singer = 0x00;break;
      case 1: led_singer = 0x01; break;
      case 2: led_singer = 0x02; break;
   
      default:led_singer = 0x00; break;
   }
}

int detect_sw()
{  int dta ;
  
   if(bt0 == 0)
   {  
      dta=1;
      loa = 1;
      delay_ms(50);
      loa = 0;
      delay_ms(200);
      
   };   
   if(bt1== 0)
   {  
      dta=2;
      loa = 1;
      delay_ms(50);
      loa = 0;
      delay_ms(200);
    } ; 
   
   return dta;
}

void main()
{
   int i =0;
  
   trisa = 0x00;
   trisb = 0x00;
   trisc = 0xff;
   trisd = 0x00;
   
   porta = portb = portc = portd = 0x00;
    
   while(1)
   { i=detect_sw();
      display_int(i);
      led_don(i);
   }
}
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2009, 12:35 AM   #3
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
khi tắt nguồn các giá trị biến vẫn được lưu. nên bạn lúc đặt biến bạn gán kèm theo giá trị ban đầu cho nó.
anh Mr Bi hình như đã giải quyết dùm bạn!!
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2009, 10:46 AM   #4
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Code:
int detect_sw()
{ 
    int i=0 ;
    ...
}
Biến cục bộ hoặc toàn cục sau khi reset(đôi khi cả tắt nguồn một thời gian) vẫn giữ giá trị cũ không phải vì nó "được lưu" mà là vì nó có thể được cấp phát lại đúng vào địa chỉ cũ. Vậy nên nếu biến không kèm giá trị khởi đầu sẽ có giá trị bằng lần sau cùng thực thi trước đó.

Regards
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-09-2009, 09:21 AM   #5
tatsuu
Nhập môn đệ tử
 
Tham gia ngày: Aug 2009
Bài gửi: 1
:
chu cung dang co 1 bai tap lam mach nhay 8 led don.bac nao biet mach va chuong trinh nao don gian giup cho chu voi.chu gio moi hoc pic nen con rat mo ho lam.chua hieu gi lam.mong cac bac giup do.cam on cac bac truoc!
tatsuu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Tags
#include <16f877a.h>


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à 06:24 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