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)
-   -   giúp em với:Lập trình nút bấm cho pic 16f877a voi??? (http://www.picvietnam.com/forum/showthread.php?t=9112)

thanhchung89 03-05-2011 11:13 PM

giúp em với:Lập trình nút bấm cho pic 16f877a voi???
 
1 Attachment(s)
em đang làm đồ án phần đo nhiệt độ thi em làm được rùi,còn phần nút ấn để tăng giảm nhiệt độ đặt thì chưa làm đươc. Mong các anh, chị giúp em với:
thầy em bắt làm thêm 3 nút bấm:
+ 1 nút để ấn định thay đổi nhiệt độ
+ 1 nút để tăng nhiệt độ
+ 1 nút để giảm nhiệt độ
giả sử có 3 nút: A B C: khi ấn nút A thi màn hình LCD hiển thị dòng chữ '' nhập nhiệt độ''
khi ấn nút B thì tăng nhiệt độ
khi ấn nút c thì giảm nhiệt độ
sau đó khi ấn tiếp nút A thì kết thúc quá trình thay đổi nhiệt độ
e mong mọi người giúp đỡ e với !!!!!!!! e thank nhiều

tanbka 04-05-2011 12:11 AM

Bài tập của bạn đã rất rõ ràng, nhưng vấn đề của bạn là thế nào nhỉ, bạn cứ viết đi, vướng phần nào thì hỏi phần ấy, đoạn nào chạy ko đúng, hay không chạy thì post lên để mọi người giúp.

thanhchung89 04-05-2011 09:06 AM

uhm, em đã post cả chương trình rùi mà!!! nhưng chương trình đó chưa có phần nút bấm! em đã làm nhưng phần chương trình đó của e ko chạy.em post lại chương trình này:
#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD
int8 low,high,min,max,i;
int1 do_F;
void convert_bcd(int8 x);
#INT_EXT
#define nut1 PIN_C2
#define nut2 PIN_C3
#define nut3 PIN_C4
void test()
{
if (do_F == 1) do_F=0;
else do_F=1;
}
void banphim()
{ max =40;
if (nut1 == 0)
LCD_putcmd(0x01);
LCD_putchar("nhap nhiet do:");
{if (nut2==0)
max = max + 1;
if (nut3 == 0)
max = max - 1;}

}
//-----------------------------------------------------------------
void main()
{
float value;
min =0; //nhiet do mim
// max =40; //nhiet do max
do_F =0 ;
i = 10 ;
trisa = 0xFF;
trisb = 0x01;
output_low(pin_C0);
output_low(pin_C1);
LCD_init();
LCD_putcmd(0x01);
LCD_putchar("do_nhiet_do:");
LCD_putcmd(0xC0);
LCD_putchar("cho ty nhe ...");
//==== Khoi tao cho ngat ngoai============================================= ==
enable_interrupts (INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
//=========== Khoi tao che do cho bo ADC=====================================
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);

delay_us(10);// Lay mau nhiet do lan dau tien
value=(float)read_adc();
value = (value - 558.5)/2.048; // For 5V supply
// value = (value - 754.8)/2.048; // For 3.7V Supply
// value = (value - 698.2)/2.048; // For 4V supply
convert_bcd((int8)value); // Tach so tram, chuc, donvi de hien thi len LED 7
delay_ms(100);
LCD_putcmd(0xC0);
LCD_putchar("Ok ");
delay_ms(100);

while(1)
{
if (i==10)
{
value = read_adc();
value=(value-558.5)/2.048;

if (do_F==1)
value=1.8*value+32;
convert_bcd((int8)value);

LCD_putcmd(0xC0);
printf(LCD_putchar,"Nhiet do la:");
LCD_putchar(high); LCD_putchar(low);

if (do_F==0)
printf(LCD_putchar," C");
else
printf(LCD_putchar," F");
i=0;
}
if ( (int8)value <= max & min <=(int8)value)
output_high(pin_C1);
else output_low(pin_C1);
if( ( (int8)value > max )|| ( (int8)value < min))
output_high(pin_C0);
else output_low(pin_C0);
i++;
}
}
//The End=============================================== ========================
void convert_bcd(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang tram va hang chuc
low = low + 0x30;
high = high + 0x30;
}

phần chương trình con void ban_phim() ấy nó ko chạy
mong mọi người giúp đỡ

tanbka 04-05-2011 10:18 AM

Bạn phải đưa hàm banphim() vào trong vòng lặp while thì nó mới chạy được chứ
Với lại việc khai báo hàm void convert_bcd(int8 x) phải đặt trước hàm main() chứ bạn

hcmut.khoamaisi 04-05-2011 10:44 AM

Trích:

void banphim()
{ max =40;
if (nut1 == 0)
LCD_putcmd(0x01);
LCD_putchar("nhap nhiet do:");
{if (nut2==0)
max = max + 1;
if (nut3 == 0)
max = max - 1;}
chỗ hàm if nên sửa lại điều kiện bằng cách dùng input_state() cjo các chân nối đến các nút nhấn;
trong hàm main() nên dùng set_tris_x() cấu hình cho các chân có nối nút nhấn là input!
Hàm banphim() phải để lặp trong while(true)

thanhchung89 04-05-2011 11:32 AM

anh ơi xem hộ em với: chương trình em đã sửa như a nói nhưng mà vẫn ko chạy được a ơi
chương trình e sửa đây này a xem hộ em với nhé:
#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD
int8 low,high,min,max,i;
int1 do_F;
void convert_bcd(int8 x);
#INT_EXT
//#define nut1 PIN_C2
//#define nut2 PIN_C3
//#define nut3 PIN_C4
void test()
{
if (do_F == 1) do_F=0;
else do_F=1;
}
void convert_bcd(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang tram va hang chuc
low = low + 0x30;
high = high + 0x30;
}

void banphim()
{ max =40;
set_tris_C(3);
set_tris_C(4);
set_tris_C(5);
while(1)
{if (pin_C2 == 0)
LCD_putcmd(0x01);
LCD_putchar("nhap nhiet do:");
{if (pin_C3==0)
max = max + 1;
if (pin_C4 == 0)
max = max - 1;}

}}
//-----------------------------------------------------------------
void main()
{
float value;
min =0; //nhiet do mim
// max =40; //nhiet do max
do_F =0 ;
i = 10 ;
trisa = 0xFF;
trisb = 0x01;
output_low(pin_C0);
output_low(pin_C1);
LCD_init();
LCD_putcmd(0x01);
LCD_putchar("do_nhiet_do:");
LCD_putcmd(0xC0);
LCD_putchar("cho ty nhe ...");
//==== Khoi tao cho ngat ngoai============================================= ==
enable_interrupts (INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
//=========== Khoi tao che do cho bo ADC=====================================
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);

delay_us(10);// Lay mau nhiet do lan dau tien
value=(float)read_adc();
value = (value - 558.5)/2.048; // For 5V supply
// value = (value - 754.8)/2.048; // For 3.7V Supply
// value = (value - 698.2)/2.048; // For 4V supply
convert_bcd((int8)value); // Tach so tram, chuc, donvi de hien thi len LED 7
delay_ms(100);
LCD_putcmd(0xC0);
LCD_putchar("Ok ");
delay_ms(100);

while(1)
{
if (i==10)
{
value = read_adc();
value=(value-558.5)/2.048;

if (do_F==1)
value=1.8*value+32;
convert_bcd((int8)value);

LCD_putcmd(0xC0);
printf(LCD_putchar,"Nhiet do la:");
LCD_putchar(high); LCD_putchar(low);

if (do_F==0)
printf(LCD_putchar," C");
else
printf(LCD_putchar," F");
i=0;
}
if ( (int8)value <= max & min <=(int8)value)
output_high(pin_C1);
else output_low(pin_C1);
if( ( (int8)value > max )|| ( (int8)value < min))
output_high(pin_C0);
else output_low(pin_C0);
i++;
}
}
//The End=============================================== ========================

tanbka 04-05-2011 04:03 PM

Trong hàm bàn phím bàn khởi tạo 3 lần
set_tris_C(3);
set_tris_C(4);
set_tris_C(5);
như thế 3 PIN C2,C3,C4 đâu có đồng thời là đầu vào
Bạn chỉ cần 1 lệnh thôi set_tris_C(24); là cấu hình C2,3,4 là đầu vào, còn lại đầu ra.
Với lại cấu hình cổng vào ra bạn chỉ cần thực hiện 1 lần trước vòng lặp while, không cần để trong hàm quét phím, như thế PIC sẽ phải cấu hình cổng liên tục ở mỗi vòng quét.

thanhchung89 04-05-2011 06:37 PM

thank các a nhieu!!! nhung e sủa rùi mà chẳng thay đổi được gì ca!!!
hay là cái hàm đó của em có vấn đề gì nhi??
chỉ giáo cho e với??

thanhchung89 04-05-2011 11:22 PM

ko có ai giúp vậy?

tdm 05-05-2011 11:40 AM

Trích:

Nguyên văn bởi thanhchung89 (Post 44691)
ko có ai giúp vậy?

thôi thì để tôi chèn giúp bạn vài dòng lệnh để code hoàn chỉnh vậy.
Code:


#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD

int8 low,high,min,max,i,sida=0xaa;
int1 do_F;
float value;
#define nut1 RC2
#define nut2 RC3
#define nut3 RC4
#INT_EXT
void test()
  {
  if (do_F == 1) do_F=0;
  else do_F=1;
  }
  void banphim(void);
  void convert_bcd(int8 x);
 
//-----------------------------------------------------------------
void main()
  {
  min =0;      //nhiet do mim
  max =40;    //nhiet do max
  do_F =0 ;
  i = 10 ;
  trisa = 0xFF;
  trisb = 0x01;
  trisc = 0b00011100;
  output_low(pin_C0);
  output_low(pin_C1);
    //==== Khoi tao cho ngat ngoai===============================================
  enable_interrupts (INT_EXT);
  ext_int_edge(H_TO_L);
  enable_interrupts (GLOBAL);
  //=========== Khoi tao che do cho bo ADC=====================================
  setup_adc_ports(AN0);
  setup_adc(ADC_CLOCK_INTERNAL);
  LCD_init();
  LCD_putcmd(0x01);
  LCD_putchar("do_nhiet_do:");
  LCD_putcmd(0xC0);
  LCD_putchar("cho ty nhe ...");
  delay_us(10);// Lay mau nhiet do lan dau tien
  value=(float)read_adc();
  value = (value - 558.5)/2.048; // For 5V supply
  // value = (value - 754.8)/2.048; // For 3.7V Supply
  // value = (value - 698.2)/2.048; // For 4V supply
  convert_bcd(value); // Tach so tram, chuc, donvi de hien thi len LED 7
  delay_ms(100);
  LCD_putcmd(0xC0);
  LCD_putchar("Ok              ");
  delay_ms(100);
  while(1)
      {
      banphim();
      if (i==10)
        {
          if(sida==0xaa)
          {
        value = read_adc();
        value=(value-558.5)/2.048;
       
        if (do_F==1)
            value=1.8*value+32;
        convert_bcd(value);

        LCD_putcmd(0xC0);
        printf(LCD_putchar,"Nhiet do la:");
        LCD_putchar(high); LCD_putchar(low);
       
        if (do_F==0)
            printf(LCD_putchar," C");
        else
            printf(LCD_putchar," F");
        i=0;
          }
          else
          {
          }
        }//
       
  if (value <= max & min <=value)
      {
          output_high(pin_C1);
      }
        else output_low(pin_C1);
  if(value > max ||value < min)
          output_high(pin_C0);
      else output_low(pin_C0);
      i++;
      }
  }
//The End=======================================================================
void convert_bcd(int8 x)
  {
  low=x%10;      //chia lay phan du, so hang don vi
  high=x/10;    //tach hang tram va hang chuc
  low = low + 0x30;
  high = high + 0x30;
  }
void banphim()
{
if (nut1 == 0)
{
sida=~sida;
if(sida!=0xaa)
{
LCD_putcmd(0x01);
LCD_putchar("nhap nhiet do:");
LCD_putcmd(0xC0);
printf(LCD_putchar,"gia tri MAX:%d",max);
}
 else
 {
 LCD_putcmd(0x01);
 LCD_putchar("do_nhiet_do:");
 value = read_adc();
        value=(value-558.5)/2.048;
       
        if (do_F==1)
            value=1.8*value+32;
        convert_bcd(value);

        LCD_putcmd(0xC0);
        printf(LCD_putchar,"Nhiet do la:");
        LCD_putchar(high); LCD_putchar(low);
       
        if (do_F==0)
            printf(LCD_putchar," C");
        else
            printf(LCD_putchar," F");
 }
while(nut1 == 0)
{
}
}
else if (nut3 == 0)
{
  if(sida!=0xaa)
  {
  max = max - 1;
  LCD_putcmd(0xC0);
  printf(LCD_putchar,"gia tri MAX:%d",max);
  }
else
  {
  }
  while(nut3 == 0)//cho nha phim
  {
    }
  delay_ms(10);//chong nay phim
}
else if (nut2 == 0)
{
  if(sida!=0xaa)
  {
  max = max +1;
  LCD_putcmd(0xC0);
  printf(LCD_putchar,"gia tri MAX:%d",max);
  }
  else
  {
  }
  while(nut2 == 0)//cho nha phim
  {
    }
  delay_ms(10);//chong nay phim
}
else
{
}
}

http://www.youtube.com/watch?v=nvtwwuzRkZI

thanhchung89 05-05-2011 12:38 PM

anh TDM ơi : Em cảm ơn anh nhiều lắm! mạch của em chạy được rồi anh ạ!
em vui lắm! em mới học nên kiến thức còn ít lắm may mà có anh giúp đỡ ko thì em ko biết làm thế nào hết
a có thể cho em số điện thoại hoặc nick chát ko ạ?
em muốn cảm ơn anh!!
em chúc anh và gia đình luôn vui vẻ và hạnh phúc!!

thanhchung89 05-05-2011 12:45 PM

em biết tên anh rồi : chúc anh MINH và gia đình hạnh phúc
cho em số điện thoại của anh nhé?cảm ơn a MINH

thanhchung89 06-05-2011 12:05 AM

a ơi cho e biết là tại sao phải khai báo ''sida=0xaa'' trong dòng khai báo: int8 low,high,min,max,i,sida=0xaa; ?
no có tác dụng gì vậy a??

hoangcuibap 06-05-2011 12:54 AM

Chao bac TMD, em muon cam on bac ve doan chuong trinh o tren qua do em co the hoc dc nhieu.
Em thay bac khai bao float value nhung sao bac lai truyen tham so khai bao kieu int, nhu vay se co sai so.
Bac chuyen doi gia tri adc voi so thuc, con cach nao khac nua ko bac? Vi nhan chia voi so thuc se ton tai nguyen vdk

tdm 06-05-2011 12:17 PM

Trích:

Nguyên văn bởi thanhchung89 (Post 44730)
a ơi cho e biết là tại sao phải khai báo ''sida=0xaa'' trong dòng khai báo: int8 low,high,min,max,i,sida=0xaa; ?
no có tác dụng gì vậy a??

khi sida=0xaa//ct sẽ hiểu là đọc giá trị cảm biến
khi sida !=0xaa ct sẽ hiểu là đang cài đặt nhiệt độ.
em coi lại phần nut1 sẽ rõ.
@hoangcuibap:
bạn có thể sửa lại cho phù hợp với ứng dụng của bạn.


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam