Thứ Bảy, 21 tháng 11, 2015

BÀI 16 : GIAO TIẾP VỚI LCD 16X02 PIC16F877A XC8 (P2)

Chào các bạn trong bài hôm nay chúng ta sẽ tiếp tục giao tiếp với LCD cụ thể là sẽ làm 1 ví dụ nho nhỏ là đồng hồ số đếm giây, phút, giờ bây giờ chúng ta sẽ bắt đâu đi vào từng giải thuật để làm nên project này nha !
Như chúng ta biết 1 giờ có 60 phút, 1 phút có 60 giây như vậy khi đếm đến giây thứ 60 thì số phút sẽ tăng lên 1 và số giờ không thay đổi như vậy quá trình này sẽ thực hiện lại cho đến khi số phút bằng 60 thì số gì sẽ tăng lên 1 ở đây mình cho số giờ là 12 nên khi số giờ bằng 12 thì sẽ quay lại từ đầu vậy nên chúng ta có giải thuật như sau :
second++;
if(second==61)

minute++;
second=0;
}
if(minute==61)
{
hour++;
minute=0;
}
if(hour==13)
{
hour=0;
}
Ok giải thuật đơn giản vậy thôi không có gì khó hiểu hết cả nên mình sẽ không giải thích gì thêm !
Và đây là phần quan trọng trong chương trình của chúng ta và chúng ta có đoạn code như sau :
// tách số hàng chục và đơn vị cho hour
sprintf(s,"%u",(hour/10));
Lcd_Set_Cursor(2,5);
Lcd_Write_String(s);
sprintf(s,"%u",(hour%10));
Lcd_Set_Cursor(2,6);
Lcd_Write_String(s);
Lcd_Write_String(":");
// tách số hàng chục và đơn vị cho minute
sprintf(s,"%u",(minute/10));
Lcd_Set_Cursor(2,8);
Lcd_Write_String(s);
sprintf(s,"%u",(minute%10));
Lcd_Set_Cursor(2,9);
Lcd_Write_String(s);
Lcd_Write_String(":");
// tách số hàng chục và đơn vị cho second
sprintf(s,"%u",(second/10));
Lcd_Set_Cursor(2,11);
Lcd_Write_String(s);
sprintf(s,"%u",(second%10));
Lcd_Set_Cursor(2,12);
Lcd_Write_String(s);
Để mình giải thích về đoạn code trên 1 tý. Tại sao chúng ta lại phải tách số hàng chục và đơn vi cho hour, minute và second vì nếu không tách khi đếm lên tới 10 thì nó sẽ không hiểu số nào là hàng chục và số nào là hàng đơn vị nên nó sẽ bị tràn và nhảy số lung tung nha ! Còn "%u" thì các bài đăng sau mình sẽ giải thích nha !
- Đây là ảnh mô phỏng protues.
digital clock pic16f877a xc8
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 20000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "lcd.h"
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG
unsigned int minute,second,hour;
void main(void)
{
    char s[10];
    TRISD = 0X00;
Lcd_Init();
    Lcd_Clear();
    while(1)

        Lcd_Set_Cursor(1,1);
        Lcd_Write_String("  DIGITAL CLOCK");
        sprintf(s,"%u",(hour/10));
        Lcd_Set_Cursor(2,5);
        Lcd_Write_String(s);
        sprintf(s,"%u",(hour%10));
        Lcd_Set_Cursor(2,6);
        Lcd_Write_String(s);
        Lcd_Write_String(":");
        sprintf(s,"%u",(minute/10));
        Lcd_Set_Cursor(2,8);
        Lcd_Write_String(s);
        sprintf(s,"%u",(minute%10));
        Lcd_Set_Cursor(2,9);
        Lcd_Write_String(s);
        Lcd_Write_String(":");
        sprintf(s,"%u",(second/10));
        Lcd_Set_Cursor(2,11);
        Lcd_Write_String(s);
        sprintf(s,"%u",(second%10));
        Lcd_Set_Cursor(2,12);
        Lcd_Write_String(s);

            second++;
            if(second==61)
            { 
            minute++;
            second=0;
            }
            if(minute==61)
            {
                hour++;
                minute=0;
            }
            if(hour==13)
            {
                hour=0;
            }
    }
}
- Link download project Click here


EmoticonEmoticon