Thông báo

Collapse
No announcement yet.

XIN CODE HIỆN SỐ LẦN BẤM NÚT LÊN LCD- ai giúp e với ak

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • XIN CODE HIỆN SỐ LẦN BẤM NÚT LÊN LCD- ai giúp e với ak

    đã thử viết nhưng k thành công,ai có thể cho e xin đoạn code hiện số lần bấm nút lên LCD dùng keilc đc không ak
    đọc cmt nên e up bài của e lên để mọi ng nghiên cứu,thảo luận sửa giúp e với
    - đề tài là mạch đo nhiệt độ co nút set mức nhiệt độ báo động
    e đã hoàn thành xong phần đo nhiệt độ và hiển thị
    - phần mức cảnh báo :nếu e gán giá trị trực tiếp là 1 hằng số thì hoạt động tốt
    nhưng nếu gán thành biến x và dùng 2 chân p2.5 và p2.6 làm 2 nút tăng giảm giá trị x để so sánh đưa ra cảnh báo thì lại không hoạt động,và e không hiển thị được giá trị x lên lcd
    code đây ak,file mach bên dưới đấy ạ
    #include<stdio.h>
    #include<reg51.h>
    sbit DQ = P2^0;
    sbit hot = P3^1;
    sbit good = P3^0;
    sbit tang = P2^5;
    char readdata[2];
    unsigned int t1,nhietdo,x;
    // Khai bao cho LCD --
    sbit RS = P2^3;
    sbit RW = P2^2;
    sbit EN = P2^1;
    #define lcd_PORT P1
    //===========================
    void delay_ms1(int n)
    {
    int k,j;
    for(k=0;k<n;k++)
    {
    for(j=0;j<500;j++);
    }
    }
    //==========================
    void delay_5ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<4;j++){}
    }
    //===========================
    void delay_15ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<100;j++){}
    }
    //CT con ghi du lieu len LCD
    void lcd_command(unsigned char c)
    {
    RS=0;
    RW=0;
    lcd_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }
    //CT con doc du lieu tu LCD
    void lcd_data(unsigned char c)
    {
    RS=1;
    lcd_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }

    //===============================
    void lcd_init() // Khoi tao LCD
    {
    delay_15ms();
    lcd_command(0x38);
    lcd_command(0x0C);
    lcd_command(0x01); // Xoa man hinh LCD
    }
    //=============================
    void lcd_putsf(unsigned char *s)
    {
    while (*s)
    {
    lcd_data(*s);
    s++;
    }
    }

    //------------------DS18b20---------------------------------------------------------------------
    void DelayUs(int us)
    {
    int i;
    for (i=0; i<us; i++);
    }
    // Reset DS1820
    bit ResetDS1820(void)
    {
    bit presence;
    DQ = 0; //pull DQ line low
    DelayUs(29); // leave it low for about 490us
    DQ = 1; // allow line to return high
    DelayUs(3); // wait for presence 55 uS
    presence = DQ; // get presence signal
    DelayUs(25); // wait for end of timeslot 316 uS
    return(presence); // presence signal returned
    } // 0=presence, 1 = no part
    // Doc 1 bit tu DS18s20
    unsigned char ReadBit(void)
    {
    unsigned char i;
    DQ = 0; // pull DQ low to start timeslot
    DQ=1;
    for (i=0; i<3; i++); // delay 17 us from start of timeslot
    return(DQ); // return value of DQ line
    }
    // viet 1 bit vao DS1820
    void WriteBit(char bitval)
    {
    DQ=0;
    if(bitval==1)
    DQ = 1;
    DelayUs(5); // delay about 39 uS
    DQ = 1;
    }

    //-----------------------------------------
    // Doc 1 byte tu DS1820
    //-----------------------------------------
    unsigned char ReadByte(void)
    {
    unsigned char i;
    unsigned char value = 0;
    for (i=0;i<8;i++)
    {
    if(ReadBit()) value|=0x01<<i;
    DelayUs(6);
    }
    return(value);
    }
    // viet 1 byte tu ds1820
    void WriteByte(char val)
    {
    unsigned char i;
    unsigned char temp;

    for (i=0; i<8; i++) // writes byte, one bit at a time
    {
    temp = val>> i;
    temp &=0x01;
    WriteBit(temp);
    }
    DelayUs(5);
    }
    // Doc nhiet do thuc
    void ReadTemp(void)
    {
    int k;
    int thap, cao=0;
    ResetDS1820();
    WriteByte(0xcc); // skip ROM
    WriteByte(0x44); // perform temperatur conversion
    while (ReadByte()==0xff); // wait for conversion complete
    ResetDS1820();
    WriteByte(0xcc); // skip ROM
    WriteByte(0xbe); // read the result
    for (k=0; k<9; k++) // read 9 bytes but, use only one byte
    {
    readdata[k]=ReadByte(); // read DS1820
    }
    thap = readdata[0];
    cao = readdata[1];
    readdata[1]=readdata[1]<<4;
    readdata[1]=readdata[1] & 0x70;
    thap=readdata[0];
    thap=thap>>4;
    thap=thap & 0x0f;
    readdata[1]=readdata[1] | thap;
    thap=2;
    t1=readdata[1];
    } // 0=presence, 1 = no part
    // Ham hien thi nhiet do
    void HienThi_ADC(unsigned char so)
    {
    if ( so<100)
    {
    //lcd_data(t/100+48);
    lcd_data(((so/10)%10)+48);
    lcd_data(so%10+48);
    }
    else
    {
    lcd_data(so/100+48);
    lcd_data(((so/10)%10)+48);
    lcd_data(so%10+48);
    }
    }
    //=============================================
    //-------------------------------------------- }
    //--------------------------------------------
    void canhbao (void)
    { if (t1 >= 20)
    { hot = 1;
    delay_ms1(40);
    hot = 0;
    delay_ms1(40);
    lcd_init();
    IE=0XAF;
    IT0=1;
    lcd_command(0x01);
    lcd_command(0x83);
    lcd_putsf ("* CANH BAO *");
    delay_ms1(110);

    }
    else {good = 1;
    delay_ms1(200);
    good = 0;
    delay_ms1(200);
    }
    }
    void main (void)
    {
    lcd_init();

    IE=0XAF;
    IT0=1;
    lcd_command(0x01);
    lcd_command(0x80);
    lcd_putsf ("HANOI");
    lcd_command(0xC0);
    lcd_putsf ("2/12/2012");
    lcd_command(0x01);
    while(1)
    {
    canhbao();
    lcd_command(0x80);
    lcd_putsf("DHDL PHUONG DONG");
    lcd_command(0xC0);
    lcd_putsf("Nhiet do: ");
    ReadTemp();
    nhietdo = t1;
    HienThi_ADC(nhietdo);
    lcd_command(0xc0+13);
    lcd_putsf("oC ");
    delay_ms1(20);
    }
    }

    mach code.zip
    Last edited by soccon_yeu; 17-12-2012, 21:07.

  • #2
    Theo mình nghĩ thì với yêu cầu của bạn thì sẽ chẳng ai ngồi viết code cho bạn đâu.
    Mình nghĩ là bạn nên đưa đoạn code đó lên thì mọi người sẽ cùng phân tích để chỉ ra chỗ sai cho bạn,cũng như là sẽ xây dựng giải thuật cho bạn.
    |

    Comment


    • #3
      up...............

      Comment


      • #4
        up.............

        Comment


        • #5
          có gì khó đâu nhỉ, lúc khởi động thì gáng giá trị mặc định. nếu có chỉnh (bấm nút tăng hoặc giảm) thì tăng giảm giá trị x theo yêu cầu thôi. rồi lại hiển thị lên LCD giống như hiển thị LCD cái nhiệt độ bạn đo được thôi.

          Comment


          • #6
            vâng nge thì có vẻ dễ nhưng màv vbawts tay vào làm thì lại báo mấy lỗi lận
            cvhar biết phải thêm bớt ntn nữa ak

            Comment


            • #7
              up huhu.....

              Comment


              • #8
                Bạn nên đưa ra thuật toán rồi code sai chỗ nào thì đưa ra.Mà code bạn tự viết đây hả?nghi lắm đó..theo mình nên set nhiệt đọ là 1 hằng số rồi dùng ngắt ngoài là ô kê con đê.
                unsigned int set_temp;
                void main ()
                {
                IE=....;
                IP=...'
                IT=...;
                }
                void ngat () onterrupt 0
                {
                set_temp++;
                }
                tương tự với ngắt kia
                chúc may mắn

                Comment


                • #9
                  Dùng ngắt đi bạn, mình dùng 2 ngắt tăng giảm đó, OK luôn. thử nhé. Nói thật chứ nhìn code của bạn kồng kềnh quá, chẳng chịu lập trình cấu trúc gì cả. Cái hàm LCD thì có đầy đó mà không sử dụng, mỗi lần làm viết lại hoài rất mất thời gian.

                  #include<stdio.h>
                  #include<reg51.h>
                  sbit DQ = P2^0;
                  sbit hot = P3^1;
                  sbit good = P3^0;
                  sbit tang = P2^5;
                  char readdata[2];
                  unsigned int t1,nhietdo,x, temp = 20;
                  // Khai bao cho LCD --
                  sbit RS = P2^3;
                  sbit RW = P2^2;
                  sbit EN = P2^1;
                  #define lcd_PORT P1
                  //===========================
                  void delay_ms1(int n)
                  {
                  int k,j;
                  for(k=0;k<n;k++)
                  {
                  for(j=0;j<500;j++);
                  }
                  }
                  //==========================
                  void delay_5ms(){
                  int i,j;
                  for(i=0;i<250;i++)
                  for(j=0;j<4;j++){}
                  }
                  //===========================
                  void delay_15ms(){
                  int i,j;
                  for(i=0;i<250;i++)
                  for(j=0;j<100;j++){}
                  }
                  void delay_1s()
                  {
                  int i;
                  for(i=0;i<70;i++)
                  {delay_15ms();}
                  }
                  //CT con ghi du lieu len LCD
                  void lcd_command(unsigned char c)
                  {
                  RS=0;
                  RW=0;
                  lcd_PORT=c;
                  EN=1;
                  EN=0;
                  delay_5ms();
                  }
                  //CT con doc du lieu tu LCD
                  void lcd_data(unsigned char c)
                  {
                  RS=1;
                  lcd_PORT=c;
                  EN=1;
                  EN=0;
                  delay_5ms();
                  }

                  //===============================
                  void lcd_init() // Khoi tao LCD
                  {
                  delay_15ms();
                  lcd_command(0x38);
                  lcd_command(0x0C);
                  lcd_command(0x01); // Xoa man hinh LCD
                  }
                  //=============================
                  void lcd_putsf(unsigned char *s)
                  {
                  while (*s)
                  {
                  lcd_data(*s);
                  s++;
                  }
                  }

                  //------------------DS18b20---------------------------------------------------------------------
                  void DelayUs(int us)
                  {
                  int i;
                  for (i=0; i<us; i++);
                  }
                  // Reset DS1820
                  bit ResetDS1820(void)
                  {
                  bit presence;
                  DQ = 0; //pull DQ line low
                  DelayUs(29); // leave it low for about 490us
                  DQ = 1; // allow line to return high
                  DelayUs(3); // wait for presence 55 uS
                  presence = DQ; // get presence signal
                  DelayUs(25); // wait for end of timeslot 316 uS
                  return(presence); // presence signal returned
                  } // 0=presence, 1 = no part
                  // Doc 1 bit tu DS18s20
                  unsigned char ReadBit(void)
                  {
                  unsigned char i;
                  DQ = 0; // pull DQ low to start timeslot
                  DQ=1;
                  for (i=0; i<3; i++); // delay 17 us from start of timeslot
                  return(DQ); // return value of DQ line
                  }
                  // viet 1 bit vao DS1820
                  void WriteBit(char bitval)
                  {
                  DQ=0;
                  if(bitval==1)
                  DQ = 1;
                  DelayUs(5); // delay about 39 uS
                  DQ = 1;
                  }

                  //-----------------------------------------
                  // Doc 1 byte tu DS1820
                  //-----------------------------------------
                  unsigned char ReadByte(void)
                  {
                  unsigned char i;
                  unsigned char value = 0;
                  for (i=0;i<8;i++)
                  {
                  if(ReadBit()) value|=0x01<<i;
                  DelayUs(6);
                  }
                  return(value);
                  }
                  // viet 1 byte tu ds1820
                  void WriteByte(char val)
                  {
                  unsigned char i;
                  unsigned char temp;

                  for (i=0; i<8; i++) // writes byte, one bit at a time
                  {
                  temp = val>> i;
                  temp &=0x01;
                  WriteBit(temp);
                  }
                  DelayUs(5);
                  }
                  // Doc nhiet do thuc
                  void ReadTemp(void)
                  {
                  int k;
                  int thap, cao=0;
                  ResetDS1820();
                  WriteByte(0xcc); // skip ROM
                  WriteByte(0x44); // perform temperatur conversion
                  while (ReadByte()==0xff); // wait for conversion complete
                  ResetDS1820();
                  WriteByte(0xcc); // skip ROM
                  WriteByte(0xbe); // read the result
                  for (k=0; k<9; k++) // read 9 bytes but, use only one byte
                  {
                  readdata[k]=ReadByte(); // read DS1820
                  }
                  thap = readdata[0];
                  cao = readdata[1];
                  readdata[1]=readdata[1]<<4;
                  readdata[1]=readdata[1] & 0x70;
                  thap=readdata[0];
                  thap=thap>>4;
                  thap=thap & 0x0f;
                  readdata[1]=readdata[1] | thap;
                  thap=2;
                  t1=readdata[1];
                  } // 0=presence, 1 = no part
                  // Ham hien thi nhiet do
                  void HienThi_ADC(unsigned char so)
                  {
                  if ( so<100)
                  {
                  //lcd_data(t/100+48);
                  lcd_data(((so/10)%10)+48);
                  lcd_data(so%10+48);
                  }
                  else
                  {
                  lcd_data(so/100+48);
                  lcd_data(((so/10)%10)+48);
                  lcd_data(so%10+48);
                  }
                  }
                  //=============================================
                  //-------------------------------------------- }
                  //--------------------------------------------
                  void canhbao (void)
                  {
                  if (t1 >= temp)
                  {
                  hot = 1;
                  delay_ms1(40);
                  hot = 0;
                  delay_ms1(40);
                  lcd_init();
                  IE=0XAF;
                  IT0=1;
                  lcd_command(0x01);
                  lcd_command(0x83);
                  lcd_putsf ("* CANH BAO *");
                  delay_ms1(110);

                  }
                  else
                  {
                  good = 1;
                  delay_ms1(200);
                  good = 0;
                  delay_ms1(200);
                  }
                  }

                  void f1(void) interrupt 0
                  {
                  temp++;
                  lcd_command(0x01);
                  lcd_command(0x80);
                  lcd_putsf ("T DAT:");
                  lcd_command(0x86);
                  HienThi_ADC(temp);
                  delay_ms1(40);
                  }

                  void f2(void) interrupt 2
                  {
                  temp--;
                  lcd_command(0x01);
                  lcd_command(0x80);
                  lcd_putsf ("T DAT:");
                  lcd_command(0x86);
                  HienThi_ADC(temp);
                  delay_ms1(40);
                  }

                  void main (void)
                  {
                  EA = 1, EX1 = 1, EX0 = 1;
                  IT1 = 1, IT0 = 1;

                  lcd_init();

                  IE=0XAF;
                  IT0=1;
                  lcd_command(0x01);
                  lcd_command(0x80);
                  lcd_putsf ("HANOI");
                  lcd_command(0xC0);
                  lcd_putsf ("2/12/2012");
                  lcd_command(0x01);
                  while(1)
                  {
                  canhbao();
                  lcd_command(0x80);
                  lcd_putsf("DHDL PHUONG DONG");
                  lcd_command(0xC0);
                  lcd_putsf("Nhiet do: ");
                  ReadTemp();
                  nhietdo = t1;
                  HienThi_ADC(nhietdo);
                  lcd_command(0xc0+13);
                  lcd_putsf("oC ");
                  delay_ms1(20);
                  }
                  }

                  Comment


                  • #10
                    m mới chuyển sang hc 89 nên hơi ngu tý,vsai sót nhiều nên mới nhờ mọi ng giúp đỡ mà
                    thaks

                    Comment


                    • #11
                      ok rồi.thank ban [MENTION=152938]vothienso01[/MENTION] nhiều hn đi cafe nhá
                      Last edited by soccon_yeu; 24-12-2012, 13:18.

                      Comment

                      Về tác giả

                      Collapse

                      soccon_yeu Tìm hiểu thêm về soccon_yeu

                      Bài viết mới nhất

                      Collapse

                      • bqviet
                        Trả lời cho Đấu tắt điện cho máy tính bảng
                        bởi bqviet
                        Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                        06-12-2025, 17:17
                      • nguyendinhvan
                        Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
                        bởi nguyendinhvan
                        Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
                        05-12-2025, 19:59
                      • afrendly
                        Trả lời cho Đấu tắt điện cho máy tính bảng
                        bởi afrendly
                        Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
                        04-12-2025, 01:27
                      • nick22
                        Trả lời cho Máy điện châm ?
                        bởi nick22
                        Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
                        01-12-2025, 13:23
                      Đang tải...
                      X