Hệ Thống đếm sản phẩm hiện thị LCD sử dụng PIC 16F877A
Hệ Thống đếm sản phẩm hiện thị LCD sử dụng PIC 16F877A hiển thị TT:DD:SSSS
TT: số lượng thùng
DD : Giá trị mặc định số sản phẩn trong một thùng
SSSS: Số lượng sản phẩm
sử dụng nút nhấn giả lập để đếm xung
sử dụng timer để đếm sản phẩm
Tự chọn số sản phẩm mặc định trong một thùng (>=12)
code chương trình :
#include <pic.h>
#include <htc.h>
#include <math.h>
#include "lcd4x20.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Cau hinh su dung.
__CONFIG(HS & WDTDIS & PWRTEN & UNPROTECT & BORDIS & LVPDIS);
#define _XTAL_FREQ 4000000
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const unsigned char A[] = "DEM SLSP T.THUNG";
char B[16] = {' ',' ',' ',' ',0x00,0x00,':','1','5',':',0x00,0x00,' ',' ',' ',' '};
char so[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char count = 1; // Khai bao va dat gia tri ban dau cho bien dem.
int s1,s2,s3,s4;
int p1,p2;
int h1,h2;
d1=0;
d2=0;
s1=0;
s2=0;
s3=0;
s4=0;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_PORTD(void)
{
PORTD = 0X00; // Khoi tao Port D.
TRISD = 0X00; // PORTD la ngo ra.
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_PORTC(void)
{
PORTC = 0X00; // Khoi tao Port C.
TRISC = 0X00; // PORTC la ngo ra.
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_PORTB(void)
{
PORTB = 0x00;
TRISB = 0Xff;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void thoigian(void)
{
s2++;
if(s2==10)
{
s1++;
s2=0;
if(s1==10)
{
s2=0;
s1=0;
s3++;
}
}
if(s3==10)
{
s4++;
s3=0;
if(s4==10)
{
s1=0;
s2=0;
s3=0;
s4=0;
}
}
if(count==15)
{
d1++;
if(d1==10)
{
d2++;
d1=0;
}
if(d2==10)
{
d1=0;
d2=0;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//HAM CHONG DOI BAN PHIM
void debounce(void)
{
int db_cntrl1 , db_cntrl2; // Bien su dung cho vong lap chong doi.
for (db_cntrl1=0;db_cntrl1<=0x0f;db_cntrl1++)
{
for(db_cntrl2=0;db_cntrl2<=0x0f;db_cntrl2++)
{}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//HAM NGAT
void interrupt isr(void)
{
debounce();
if(T0IF && T0IE) // Kiem tra cho phep ngat va co ngat duoc kich hoat (bang HIGH)
{
TMR0 =255;
T0IF = 0; // Xoa co ngat ngoai.
thoigian(); // timer la sao de cho duoc 1s
count++;
if(count==16)
count=1;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_Timer1(void) //HAM KHOI TAO CHO TIMER0
{
TMR0 =254; // CHO TIMER 0 HOAT DONG TU 0;
T0CS=1; // Chon xung clock la TOCKI
T0SE=0; // Tang tu timer0 den tran
PSA = 1; // KHONG SU DUNG BO CHI TI LE LA TIMER0
PS0 = 0;
PS1 = 0;
PS2 = 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
init_PORTD();
init_PORTC();
init_PORTB();
lcd_init();
debounce();
init_Timer1(); // Khoi tao Timer1.
ADCON1 = 1;
PCFG0 = 0;
PCFG1 = 0;
PCFG2 = 1;
PCFG3 = 0;
// ANSEL = 0; // Cau hinh tat ca chan Analog la chan Digital I/O.
// ANSELH = 0;
TRISA = 0X00; // Cau hinh PortE, ket noi LED tai RE1 va RE2
PORTA = 0xFF; //Tat cac LED RE1 va RE2.
T0IE = 1; // CHO PHEP NGAT TIMER0.
T0IF = 0; // XOA CO NGAT TIMER0.
GIE = 1; // Cho phep ngat toan cuc.
while(1)
{
//Xuat cac ky tu co dinh tren LCD
lcd_gotoxy(0,0);
for(int i=0;i<=15;i++)
lcd_putc(A[i]);
lcd_gotoxy(5,1);
lcd_putc(B[6]);
lcd_gotoxy(8,1);
lcd_putc(B[9]);
//Xuat thoi gian la Giay
lcd_gotoxy(9,1);
lcd_putc(so[s4]);
lcd_gotoxy(10,1);
lcd_putc(so[s3]);
lcd_gotoxy(12,1);
lcd_putc(so[s2]);
lcd_gotoxy(11,1);
lcd_putc(so[s1]);
//Xuat gia tri cua tung thung hang
lcd_gotoxy(7,1);
lcd_putc(B[8]);
lcd_gotoxy(6,1);
lcd_putc(B[7]);
//Xuat thoi gian la Gio
lcd_gotoxy(4,1);
lcd_putc(so[d1]);
lcd_gotoxy(3,1);
lcd_putc(so[d2]);
}
}
LCD4x20:
// ***************************************************
// Cong dung:
// Chuong trinh su dung cac lenh de thuc hien viec dieu khien va hien thi cac
// thong tin len man hinh LCD 4x20 duoc ket noi voi PIC theo kieu 4 bit
// du lieu va 3 bit dieu khien.
//
// Cot 0 20
// [--------------------]
// Hang 0 [ ]
// Hang 1 [ ]
// Hang 2 [ ]
// Hang 3 [ ]
// [--------------------]
//
// Lenh lcd_init(): Khoi dong LCD.
// Lenh lcd_busy(): Thong bao LCD ban xu ly thong tin.
// Lenh lcd_get_byte(rs): Doc mot byte du lieu tu LCD.
// Lenh lcd_put_byte(rs, b): Ghi mot byte du lieu/lenh den LCD.
// Lenh lcd_putc(c): Ghi mot ky tu den LCD.
// Lenh lcd_gotoxy(col, row): Dinh toa do tren LCD.
// Lenh lcd_puts(*s): Ghi mot chuoi den LCD.
// Lenh lcd_cgram(): Luu cac ma ky tu dac biet vao vung nho CGRAM cua LCD.
//
// Ket noi LCD: RD<1> -> LCD_RS RD<4> -> LCD_DATA4.
// RD<2> -> LCD_RW RD<5> -> LCD_DATA5.
// RD<3> -> LCD_EN RD<6> -> LCD_DATA6.
// RD<7> -> LCD_DATA7.
//
// Luu y: Cach ket noi va cac lenh dung cho LCD xem them trong file lcd.h
//
// Hieu chinh va bo sung: PHAM QUANG TRI - Ho Chi Minh University of Industry.
//
// ***************************************************
#include <stdlib.h>
#include <ctype.h>
#include "lcd4x20.h" // Cau hinh ket noi va khai bao lenh dung cho LCD.
// ***************************************************
// Ten CTC: lcd_init().
// Thong so dau vao: Xem cach ket noi phan cung LCD nhu tren.
// Thong so dau ra:
// Cong dung: Khoi dong LCD theo cau hinh 4 bit du lieu.
// ***************************************************
void lcd_init()
{
// Khai bao bien.
unsigned char i;
// Dinh nghia ham.
LCD_EN_TRIS = 0; // Cau hinh ngo ra cac duong dieu khien.
LCD_RS_TRIS = 0;
LCD_RW_TRIS = 0;
LCD_DATA4_TRIS = 0; // Cau hinh ngo ra cho cac duong du lieu.
LCD_DATA5_TRIS = 0;
LCD_DATA6_TRIS = 0;
LCD_DATA7_TRIS = 0;
LCD_EN = 0; // EN = 0 - Disable.
LCD_RS = 0; // RS = 0 - Command.
LCD_RW = 0; // RW = 0 - Write.
__delay_ms(100); // Tao thoi gian tre khi bat nguon cho LCD.
// Reset LCD.
lcd_put_byte(0,0x30);
__delay_ms(50);
lcd_put_byte(0,0x30);
__delay_ms(50);
lcd_put_byte(0,0x32);
__delay_ms(100); // Tao tre de reset LCD.
__delay_ms(100); //
__delay_ms(100); //
while(lcd_busy());
lcd_put_byte(0,FOUR_BIT & LINES_5X7); // Thiet lap loai LCD.
while(lcd_busy());
lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF); // Tat hien thi.
while(lcd_busy());
lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF); // Bat hien thi.
while(lcd_busy());
lcd_put_byte(0,0x01); // Xoa hien thi va di chuyen con tro ve dau dong.
while(lcd_busy());
lcd_put_byte(0,SHIFT_CUR_LEFT); // Che do dich chuyen con tro.
while(lcd_busy());
lcd_put_byte(0,0x01); // Xoa hien thi va di chuyen con tro ve dau dong.
while(lcd_busy());
}
// ***************************************************
// Ten CTC: lcd_busy().
// Thong so dau vao:
// Thong so dau ra: Tra ve gia tri: <0> Khong ban - <1> Bao ban.
// Cong dung: Thong bao LCD dang ban xu ly thong tin.
// ***************************************************
unsigned char lcd_busy()
{
// Khai bao bien.
unsigned char busy;
// Dinh nghia ham.
LCD_DATA4_TRIS = 1; // Cau hinh ngo vao cho cac duong du lieu.
LCD_DATA5_TRIS = 1;
LCD_DATA6_TRIS = 1;
LCD_DATA7_TRIS = 1;
LCD_RW = 1; // RW = 1 - Read.
LCD_RS = 0; // RS = 0 - Command.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable.
__delay_us(20);
busy = LCD_DATA7; // Doc gia tri co bao ban tu LCD.
LCD_EN = 0; // EN = 0 - Disable.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Tao xung truyen thong tin.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
return busy; // Tra ve gia tri bao LCD ban hay khong (1: Busy).
}
// ***************************************************
// Ten CTC: lcd_get_byte(rs).
// Thong so dau vao: rs: Chon lua doc lenh (Command) hay du lieu (Data) tu LCD.
// rs = 0: Command - rs = 1: Data.
// Can xac dinh toa do du lieu can doc tu LCD truoc ham nay.
// Thong so dau ra: Gia tri byte doc duoc tu LCD.
// Cong dung: Doc 1 byte tu LCD tai toa do xac dinh tu truoc.
// ***************************************************
unsigned char lcd_get_byte(unsigned char rs)
{
// Khai bao bien.
BYTE_VAL b; // Bien chua gia tri doc ve tu LCD.
// Dinh nghia ham.
LCD_DATA4_TRIS = 1; // Cau hinh ngo vao cho cac duong du lieu.
LCD_DATA5_TRIS = 1;
LCD_DATA6_TRIS = 1;
LCD_DATA7_TRIS = 1;
LCD_RW = 1; // RW = 1 - Read.
LCD_RS = 0; // RS = 0 - Command. Mac dinh la doc Command.
if (rs) LCD_RS = 1; // Kiem tra yeu cau doc Data (rs = 1) hay doc Command (rs = 0).
// RS = 1 - Data. Neu chon lua doc Data.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Doc 4 bit cao cua thong tin can doc tu LCD.
__delay_us(20);
b.bits.b7 = LCD_DATA7; // Doc 4 bit cao.
b.bits.b6 = LCD_DATA6;
b.bits.b5 = LCD_DATA5;
b.bits.b4 = LCD_DATA4;
LCD_EN = 0; // EN = 0 - Disable.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Doc 4 bit thap cua thong tin can doc tu LCD.
__delay_us(20);
b.bits.b3 = LCD_DATA7; // Doc 4 bit thap.
b.bits.b2 = LCD_DATA6;
b.bits.b1 = LCD_DATA5;
b.bits.b0 = LCD_DATA4;
LCD_EN = 0; // EN = 0 - Disable.
return b.Val; // Tra ve gia tri doc duoc tu LCD (8 bit).
}
// ***************************************************
// Ten CTC: lcd_put_byte(rs, b).
// Thong so dau vao: rs: Chon lua doc lenh (Command) hay du lieu (Data) tu LCD.
// rs = 0: Command - rs = 1: Data.
// b: Gia tri 8 bit cua thong tin can ghi vao LCD.
// Can xac dinh toa do du lieu can doc tu LCD truoc ham nay.
// Thong so dau ra:
// Cong dung: Ghi 1 byte vao LCD tai toa do xac dinh tu truoc.
// ***************************************************
void lcd_put_byte(unsigned char rs, unsigned char b)
{
// Khai bao bien.
BYTE_VAL temp; // Bien luu tam thong tin.
// Dinh nghia ham.
LCD_DATA4_TRIS = 0; // Cau hinh ngo ra cho cac duong du lieu.
LCD_DATA5_TRIS = 0;
LCD_DATA6_TRIS = 0;
LCD_DATA7_TRIS = 0;
LCD_RS = 0; // RS = 0 - Command. Mac dinh la ghi Command.
if(rs) LCD_RS = 1; // Kiem tra yeu cau ghi Data (rs = 1) hay ghi Command (rs = 0).
// RS = 1 - Data. Neu chon lua ghi Data.
__delay_us(20);
LCD_RW = 0; // RW = 0 - Write.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
temp.Val = b; // Lay gia tri thong tin can ghi vao LCD.
LCD_DATA4 = temp.bits.b4; // Gui 4 bit cao len bus.
LCD_DATA5 = temp.bits.b5;
LCD_DATA6 = temp.bits.b6;
LCD_DATA7 = temp.bits.b7;
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Ghi 4 bit cao cua thong tin vao LCD.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
LCD_DATA4 = temp.bits.b0; // Gui 4 bit thap len bus.
LCD_DATA5 = temp.bits.b1;
LCD_DATA6 = temp.bits.b2;
LCD_DATA7 = temp.bits.b3;
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Ghi 4 bit thap cua thong tin vao LCD.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
}
// ***************************************************
// Ten CTC: lcd_putc(c).
// Thong so dau vao: c: Lenh dieu khien va thong tin hien thi.
// /f: Xoa hien thi.
// /n: Bat dau dong moi.
// /b: Lui ve 1 vi tri.
// Mac dinh la hien thi cac ky tu co kha nang hien thi duoc.
// Thong so dau ra:
// Cong dung: Hien thi ky tu va dieu khien cac chuc nang hoat dong cua LCD.
// ***************************************************
void lcd_putc(char c)
{
// Khai bao bien.
// Dinh nghia ham.
switch(c)
{
case '\f': // Chuc nang xoa hien thi.
lcd_put_byte(0,0x01); // Goi ham truyen thong tin (lenh) sang C.LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
break; // Lenh: Xoa hien thi tren man hinh C.LCD (0x01).
case '\r': // Chuc nang dua con tro ve dau dong hien thi.
lcd_put_byte(0,0x02); // Goi ham truyen thong tin (lenh) sang C.LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
break; // Lenh: Dau con tro ve dau dong hien thi tren man hinh C.LCD (0x02).
case '\n': // Chuc nang bat dau hang thu 2.
lcd_gotoxy(0,1); // Goi ham truyen thong tin (du lieu) sang C.LCD.
break;
case '\b': // Chuc nang lui ve 1 vi tri.
lcd_put_byte(0,0x10); // Goi ham truyen thong tin (lenh) sang C.LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
break; // Lenh: Doi con tro sang trai (0x10).
default: // Hien thi tat ca ky tu mac dinh trong LCD (c: dia chi HEX cua ky tu)
// if(isprint(c)) // Dong lenh dung khi chi muon hien thi nhung ky tu tren ban phim PC?
// {
lcd_put_byte(1,c); // Gui thong tin sang LCD de hien thi tai toa do da xac dinh.
while(lcd_busy()); // Kiem tra LCD bao ban.
// }
break;
}
}
// ***************************************************
// Ham duoi day duoc su dung de cho phep xuat thong tin ra LCD bang
// lenh printf().
// ***************************************************
void putch(char c)
{
lcd_putc(c);
}
// ***************************************************
// Ten CTC: lcd_gotoxy(col, row).
// Thong so dau vao: col: Toa do cot hien thi (0 - 15).
// row: Toa do hang hien thi (0 - 1).
// Thong so dau ra:
// Cong dung: Xac dinh toa do hien thi thong tin tren LCD.
// ***************************************************
void lcd_gotoxy(unsigned char col, unsigned char row)
{
// Khai bao bien.
unsigned char address;
// Dinh nghia ham.
switch(row)
{
case 0:
address=0x00; // Nap dia chi RAM cua hang 1.
break;
case 1:
address=0x40; // Nap dia chi RAM cua hang 2.
break;
case 2:
address=0x14; // Nap dia chi RAM cua hang 3.
break;
case 3:
address=0x54; // Nap dia chi RAM cua hang 4.
break;
}
address += col; // Ket hop gia tri hang va cot de tao ra dia chi hien thi.
lcd_put_byte(0,0x80|address); // Gui lenh xac dinh toa do hien thi tren LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
}
// ***************************************************
// Ten CTC: lcd_puts(*s).
// Thong so dau vao: s: Chuoi thong tin can hien thi.
// Thong so dau ra:
// Cong dung: Hien thi chuoi thong tin len LCD.
// ***************************************************
void lcd_puts(const char *s)
{
// Khai bao bien.
// Dinh nghia ham.
while(*s)
{
lcd_putc(*s++);
}
}
LCD4x20
//
// Hieu chinh va bo sung: PHAM QUANG TRI - Ho Chi Minh University of Industry.
//
#ifndef _LCD_H_
#define _LCD_H_
#include <htc.h>
/* Khai bao tan so thach anh dao dong */
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
/* Cac khai bao dieu khien bat/tat hien thi */
#define DON 0b00001111 /* Bat hien thi */
#define DOFF 0b00001011 /* Tat hien thi */
#define CURSOR_ON 0b00001111 /* Bat con tro */
#define CURSOR_OFF 0b00001101 /* Tat con tro */
#define BLINK_ON 0b00001111 /* Nhap nhay con tro */
#define BLINK_OFF 0b00001110 /* Khong nhap nhay con tro */
/* Cac khai bao dich chuyen hien thi va con tro */
#define SHIFT_CUR_LEFT 0b00000100 /* Con tro dich sang trai */
#define SHIFT_CUR_RIGHT 0b00000101 /* Con tro dich sang phai */
#define SHIFT_DISP_LEFT 0b00000110 /* Hien thi dich sang trai */
#define SHIFT_DISP_RIGHT 0b00000111 /* Hien thi dich sang phai */
/* Cac khai bao thiet lap chuc nang */
#define FOUR_BIT 0b00101100 /* Giao dien 4-bit */
#define EIGHT_BIT 0b00111100 /* Giao dien 8-bit */
#define LINE_5X7 0b00110000 /* Ky tu 5x7, mot hang */
#define LINE_5X10 0b00110100 /* Ky tu 5x10 */
#define LINES_5X7 0b00111000 /* Ky tu 5x7, nhieu hang */
/* Cac khai bao ket noi chan LCD voi PIC */
#ifndef LCD_RS
#define LCD_RS RC1
#define LCD_EN RC3
#define LCD_RW RC2
#define LCD_DATA4 RD4
#define LCD_DATA5 RD5
#define LCD_DATA6 RD6
#define LCD_DATA7 RD7
#define LCD_RS_TRIS TRISC1
#define LCD_EN_TRIS TRISC3
#define LCD_RW_TRIS TRISC2
#define LCD_DATA4_TRIS TRISD4
#define LCD_DATA5_TRIS TRISD5
#define LCD_DATA6_TRIS TRISD6
#define LCD_DATA7_TRIS TRISD7
#endif
/* Khai bao bien du lieu 8-bit */
typedef union _BYTE_VAL
{
unsigned char Val;
struct
{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} bits;
} BYTE_VAL;
/* Khai bao cac lenh dung cho LCD */
void lcd_init(); // Khoi dong LCD.
unsigned char lcd_busy(); // Thong bao LCD ban xu ly thong tin.
unsigned char lcd_get_byte(unsigned char rs); // Doc mot byte du lieu tu LCD.
void lcd_put_byte(unsigned char a,unsigned char b); // Ghi mot byte du lieu/lenh den LCD.
void lcd_gotoxy(unsigned char col, unsigned char row); // Dinh toa do tren LCD.
void lcd_putc(char c); // Ghi mot ky tu den LCD.
void lcd_puts(const char* s); // Ghi mot chuoi den LCD.
#endif
TT: số lượng thùng
DD : Giá trị mặc định số sản phẩn trong một thùng
SSSS: Số lượng sản phẩm
sử dụng nút nhấn giả lập để đếm xung
sử dụng timer để đếm sản phẩm
Tự chọn số sản phẩm mặc định trong một thùng (>=12)
code chương trình :
#include <pic.h>
#include <htc.h>
#include <math.h>
#include "lcd4x20.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Cau hinh su dung.
__CONFIG(HS & WDTDIS & PWRTEN & UNPROTECT & BORDIS & LVPDIS);
#define _XTAL_FREQ 4000000
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const unsigned char A[] = "DEM SLSP T.THUNG";
char B[16] = {' ',' ',' ',' ',0x00,0x00,':','1','5',':',0x00,0x00,' ',' ',' ',' '};
char so[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char count = 1; // Khai bao va dat gia tri ban dau cho bien dem.
int s1,s2,s3,s4;
int p1,p2;
int h1,h2;
d1=0;
d2=0;
s1=0;
s2=0;
s3=0;
s4=0;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_PORTD(void)
{
PORTD = 0X00; // Khoi tao Port D.
TRISD = 0X00; // PORTD la ngo ra.
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_PORTC(void)
{
PORTC = 0X00; // Khoi tao Port C.
TRISC = 0X00; // PORTC la ngo ra.
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_PORTB(void)
{
PORTB = 0x00;
TRISB = 0Xff;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void thoigian(void)
{
s2++;
if(s2==10)
{
s1++;
s2=0;
if(s1==10)
{
s2=0;
s1=0;
s3++;
}
}
if(s3==10)
{
s4++;
s3=0;
if(s4==10)
{
s1=0;
s2=0;
s3=0;
s4=0;
}
}
if(count==15)
{
d1++;
if(d1==10)
{
d2++;
d1=0;
}
if(d2==10)
{
d1=0;
d2=0;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//HAM CHONG DOI BAN PHIM
void debounce(void)
{
int db_cntrl1 , db_cntrl2; // Bien su dung cho vong lap chong doi.
for (db_cntrl1=0;db_cntrl1<=0x0f;db_cntrl1++)
{
for(db_cntrl2=0;db_cntrl2<=0x0f;db_cntrl2++)
{}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//HAM NGAT
void interrupt isr(void)
{
debounce();
if(T0IF && T0IE) // Kiem tra cho phep ngat va co ngat duoc kich hoat (bang HIGH)
{
TMR0 =255;
T0IF = 0; // Xoa co ngat ngoai.
thoigian(); // timer la sao de cho duoc 1s
count++;
if(count==16)
count=1;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_Timer1(void) //HAM KHOI TAO CHO TIMER0
{
TMR0 =254; // CHO TIMER 0 HOAT DONG TU 0;
T0CS=1; // Chon xung clock la TOCKI
T0SE=0; // Tang tu timer0 den tran
PSA = 1; // KHONG SU DUNG BO CHI TI LE LA TIMER0
PS0 = 0;
PS1 = 0;
PS2 = 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
init_PORTD();
init_PORTC();
init_PORTB();
lcd_init();
debounce();
init_Timer1(); // Khoi tao Timer1.
ADCON1 = 1;
PCFG0 = 0;
PCFG1 = 0;
PCFG2 = 1;
PCFG3 = 0;
// ANSEL = 0; // Cau hinh tat ca chan Analog la chan Digital I/O.
// ANSELH = 0;
TRISA = 0X00; // Cau hinh PortE, ket noi LED tai RE1 va RE2
PORTA = 0xFF; //Tat cac LED RE1 va RE2.
T0IE = 1; // CHO PHEP NGAT TIMER0.
T0IF = 0; // XOA CO NGAT TIMER0.
GIE = 1; // Cho phep ngat toan cuc.
while(1)
{
//Xuat cac ky tu co dinh tren LCD
lcd_gotoxy(0,0);
for(int i=0;i<=15;i++)
lcd_putc(A[i]);
lcd_gotoxy(5,1);
lcd_putc(B[6]);
lcd_gotoxy(8,1);
lcd_putc(B[9]);
//Xuat thoi gian la Giay
lcd_gotoxy(9,1);
lcd_putc(so[s4]);
lcd_gotoxy(10,1);
lcd_putc(so[s3]);
lcd_gotoxy(12,1);
lcd_putc(so[s2]);
lcd_gotoxy(11,1);
lcd_putc(so[s1]);
//Xuat gia tri cua tung thung hang
lcd_gotoxy(7,1);
lcd_putc(B[8]);
lcd_gotoxy(6,1);
lcd_putc(B[7]);
//Xuat thoi gian la Gio
lcd_gotoxy(4,1);
lcd_putc(so[d1]);
lcd_gotoxy(3,1);
lcd_putc(so[d2]);
}
}
LCD4x20:
// ***************************************************
// Cong dung:
// Chuong trinh su dung cac lenh de thuc hien viec dieu khien va hien thi cac
// thong tin len man hinh LCD 4x20 duoc ket noi voi PIC theo kieu 4 bit
// du lieu va 3 bit dieu khien.
//
// Cot 0 20
// [--------------------]
// Hang 0 [ ]
// Hang 1 [ ]
// Hang 2 [ ]
// Hang 3 [ ]
// [--------------------]
//
// Lenh lcd_init(): Khoi dong LCD.
// Lenh lcd_busy(): Thong bao LCD ban xu ly thong tin.
// Lenh lcd_get_byte(rs): Doc mot byte du lieu tu LCD.
// Lenh lcd_put_byte(rs, b): Ghi mot byte du lieu/lenh den LCD.
// Lenh lcd_putc(c): Ghi mot ky tu den LCD.
// Lenh lcd_gotoxy(col, row): Dinh toa do tren LCD.
// Lenh lcd_puts(*s): Ghi mot chuoi den LCD.
// Lenh lcd_cgram(): Luu cac ma ky tu dac biet vao vung nho CGRAM cua LCD.
//
// Ket noi LCD: RD<1> -> LCD_RS RD<4> -> LCD_DATA4.
// RD<2> -> LCD_RW RD<5> -> LCD_DATA5.
// RD<3> -> LCD_EN RD<6> -> LCD_DATA6.
// RD<7> -> LCD_DATA7.
//
// Luu y: Cach ket noi va cac lenh dung cho LCD xem them trong file lcd.h
//
// Hieu chinh va bo sung: PHAM QUANG TRI - Ho Chi Minh University of Industry.
//
// ***************************************************
#include <stdlib.h>
#include <ctype.h>
#include "lcd4x20.h" // Cau hinh ket noi va khai bao lenh dung cho LCD.
// ***************************************************
// Ten CTC: lcd_init().
// Thong so dau vao: Xem cach ket noi phan cung LCD nhu tren.
// Thong so dau ra:
// Cong dung: Khoi dong LCD theo cau hinh 4 bit du lieu.
// ***************************************************
void lcd_init()
{
// Khai bao bien.
unsigned char i;
// Dinh nghia ham.
LCD_EN_TRIS = 0; // Cau hinh ngo ra cac duong dieu khien.
LCD_RS_TRIS = 0;
LCD_RW_TRIS = 0;
LCD_DATA4_TRIS = 0; // Cau hinh ngo ra cho cac duong du lieu.
LCD_DATA5_TRIS = 0;
LCD_DATA6_TRIS = 0;
LCD_DATA7_TRIS = 0;
LCD_EN = 0; // EN = 0 - Disable.
LCD_RS = 0; // RS = 0 - Command.
LCD_RW = 0; // RW = 0 - Write.
__delay_ms(100); // Tao thoi gian tre khi bat nguon cho LCD.
// Reset LCD.
lcd_put_byte(0,0x30);
__delay_ms(50);
lcd_put_byte(0,0x30);
__delay_ms(50);
lcd_put_byte(0,0x32);
__delay_ms(100); // Tao tre de reset LCD.
__delay_ms(100); //
__delay_ms(100); //
while(lcd_busy());
lcd_put_byte(0,FOUR_BIT & LINES_5X7); // Thiet lap loai LCD.
while(lcd_busy());
lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF); // Tat hien thi.
while(lcd_busy());
lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF); // Bat hien thi.
while(lcd_busy());
lcd_put_byte(0,0x01); // Xoa hien thi va di chuyen con tro ve dau dong.
while(lcd_busy());
lcd_put_byte(0,SHIFT_CUR_LEFT); // Che do dich chuyen con tro.
while(lcd_busy());
lcd_put_byte(0,0x01); // Xoa hien thi va di chuyen con tro ve dau dong.
while(lcd_busy());
}
// ***************************************************
// Ten CTC: lcd_busy().
// Thong so dau vao:
// Thong so dau ra: Tra ve gia tri: <0> Khong ban - <1> Bao ban.
// Cong dung: Thong bao LCD dang ban xu ly thong tin.
// ***************************************************
unsigned char lcd_busy()
{
// Khai bao bien.
unsigned char busy;
// Dinh nghia ham.
LCD_DATA4_TRIS = 1; // Cau hinh ngo vao cho cac duong du lieu.
LCD_DATA5_TRIS = 1;
LCD_DATA6_TRIS = 1;
LCD_DATA7_TRIS = 1;
LCD_RW = 1; // RW = 1 - Read.
LCD_RS = 0; // RS = 0 - Command.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable.
__delay_us(20);
busy = LCD_DATA7; // Doc gia tri co bao ban tu LCD.
LCD_EN = 0; // EN = 0 - Disable.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Tao xung truyen thong tin.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
return busy; // Tra ve gia tri bao LCD ban hay khong (1: Busy).
}
// ***************************************************
// Ten CTC: lcd_get_byte(rs).
// Thong so dau vao: rs: Chon lua doc lenh (Command) hay du lieu (Data) tu LCD.
// rs = 0: Command - rs = 1: Data.
// Can xac dinh toa do du lieu can doc tu LCD truoc ham nay.
// Thong so dau ra: Gia tri byte doc duoc tu LCD.
// Cong dung: Doc 1 byte tu LCD tai toa do xac dinh tu truoc.
// ***************************************************
unsigned char lcd_get_byte(unsigned char rs)
{
// Khai bao bien.
BYTE_VAL b; // Bien chua gia tri doc ve tu LCD.
// Dinh nghia ham.
LCD_DATA4_TRIS = 1; // Cau hinh ngo vao cho cac duong du lieu.
LCD_DATA5_TRIS = 1;
LCD_DATA6_TRIS = 1;
LCD_DATA7_TRIS = 1;
LCD_RW = 1; // RW = 1 - Read.
LCD_RS = 0; // RS = 0 - Command. Mac dinh la doc Command.
if (rs) LCD_RS = 1; // Kiem tra yeu cau doc Data (rs = 1) hay doc Command (rs = 0).
// RS = 1 - Data. Neu chon lua doc Data.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Doc 4 bit cao cua thong tin can doc tu LCD.
__delay_us(20);
b.bits.b7 = LCD_DATA7; // Doc 4 bit cao.
b.bits.b6 = LCD_DATA6;
b.bits.b5 = LCD_DATA5;
b.bits.b4 = LCD_DATA4;
LCD_EN = 0; // EN = 0 - Disable.
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Doc 4 bit thap cua thong tin can doc tu LCD.
__delay_us(20);
b.bits.b3 = LCD_DATA7; // Doc 4 bit thap.
b.bits.b2 = LCD_DATA6;
b.bits.b1 = LCD_DATA5;
b.bits.b0 = LCD_DATA4;
LCD_EN = 0; // EN = 0 - Disable.
return b.Val; // Tra ve gia tri doc duoc tu LCD (8 bit).
}
// ***************************************************
// Ten CTC: lcd_put_byte(rs, b).
// Thong so dau vao: rs: Chon lua doc lenh (Command) hay du lieu (Data) tu LCD.
// rs = 0: Command - rs = 1: Data.
// b: Gia tri 8 bit cua thong tin can ghi vao LCD.
// Can xac dinh toa do du lieu can doc tu LCD truoc ham nay.
// Thong so dau ra:
// Cong dung: Ghi 1 byte vao LCD tai toa do xac dinh tu truoc.
// ***************************************************
void lcd_put_byte(unsigned char rs, unsigned char b)
{
// Khai bao bien.
BYTE_VAL temp; // Bien luu tam thong tin.
// Dinh nghia ham.
LCD_DATA4_TRIS = 0; // Cau hinh ngo ra cho cac duong du lieu.
LCD_DATA5_TRIS = 0;
LCD_DATA6_TRIS = 0;
LCD_DATA7_TRIS = 0;
LCD_RS = 0; // RS = 0 - Command. Mac dinh la ghi Command.
if(rs) LCD_RS = 1; // Kiem tra yeu cau ghi Data (rs = 1) hay ghi Command (rs = 0).
// RS = 1 - Data. Neu chon lua ghi Data.
__delay_us(20);
LCD_RW = 0; // RW = 0 - Write.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
temp.Val = b; // Lay gia tri thong tin can ghi vao LCD.
LCD_DATA4 = temp.bits.b4; // Gui 4 bit cao len bus.
LCD_DATA5 = temp.bits.b5;
LCD_DATA6 = temp.bits.b6;
LCD_DATA7 = temp.bits.b7;
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Ghi 4 bit cao cua thong tin vao LCD.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
LCD_DATA4 = temp.bits.b0; // Gui 4 bit thap len bus.
LCD_DATA5 = temp.bits.b1;
LCD_DATA6 = temp.bits.b2;
LCD_DATA7 = temp.bits.b3;
__delay_us(20);
LCD_EN = 1; // EN = 1 - Enable. Ghi 4 bit thap cua thong tin vao LCD.
__delay_us(20);
LCD_EN = 0; // EN = 0 - Disable.
}
// ***************************************************
// Ten CTC: lcd_putc(c).
// Thong so dau vao: c: Lenh dieu khien va thong tin hien thi.
// /f: Xoa hien thi.
// /n: Bat dau dong moi.
// /b: Lui ve 1 vi tri.
// Mac dinh la hien thi cac ky tu co kha nang hien thi duoc.
// Thong so dau ra:
// Cong dung: Hien thi ky tu va dieu khien cac chuc nang hoat dong cua LCD.
// ***************************************************
void lcd_putc(char c)
{
// Khai bao bien.
// Dinh nghia ham.
switch(c)
{
case '\f': // Chuc nang xoa hien thi.
lcd_put_byte(0,0x01); // Goi ham truyen thong tin (lenh) sang C.LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
break; // Lenh: Xoa hien thi tren man hinh C.LCD (0x01).
case '\r': // Chuc nang dua con tro ve dau dong hien thi.
lcd_put_byte(0,0x02); // Goi ham truyen thong tin (lenh) sang C.LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
break; // Lenh: Dau con tro ve dau dong hien thi tren man hinh C.LCD (0x02).
case '\n': // Chuc nang bat dau hang thu 2.
lcd_gotoxy(0,1); // Goi ham truyen thong tin (du lieu) sang C.LCD.
break;
case '\b': // Chuc nang lui ve 1 vi tri.
lcd_put_byte(0,0x10); // Goi ham truyen thong tin (lenh) sang C.LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
break; // Lenh: Doi con tro sang trai (0x10).
default: // Hien thi tat ca ky tu mac dinh trong LCD (c: dia chi HEX cua ky tu)
// if(isprint(c)) // Dong lenh dung khi chi muon hien thi nhung ky tu tren ban phim PC?
// {
lcd_put_byte(1,c); // Gui thong tin sang LCD de hien thi tai toa do da xac dinh.
while(lcd_busy()); // Kiem tra LCD bao ban.
// }
break;
}
}
// ***************************************************
// Ham duoi day duoc su dung de cho phep xuat thong tin ra LCD bang
// lenh printf().
// ***************************************************
void putch(char c)
{
lcd_putc(c);
}
// ***************************************************
// Ten CTC: lcd_gotoxy(col, row).
// Thong so dau vao: col: Toa do cot hien thi (0 - 15).
// row: Toa do hang hien thi (0 - 1).
// Thong so dau ra:
// Cong dung: Xac dinh toa do hien thi thong tin tren LCD.
// ***************************************************
void lcd_gotoxy(unsigned char col, unsigned char row)
{
// Khai bao bien.
unsigned char address;
// Dinh nghia ham.
switch(row)
{
case 0:
address=0x00; // Nap dia chi RAM cua hang 1.
break;
case 1:
address=0x40; // Nap dia chi RAM cua hang 2.
break;
case 2:
address=0x14; // Nap dia chi RAM cua hang 3.
break;
case 3:
address=0x54; // Nap dia chi RAM cua hang 4.
break;
}
address += col; // Ket hop gia tri hang va cot de tao ra dia chi hien thi.
lcd_put_byte(0,0x80|address); // Gui lenh xac dinh toa do hien thi tren LCD.
while(lcd_busy()); // Kiem tra LCD bao ban.
}
// ***************************************************
// Ten CTC: lcd_puts(*s).
// Thong so dau vao: s: Chuoi thong tin can hien thi.
// Thong so dau ra:
// Cong dung: Hien thi chuoi thong tin len LCD.
// ***************************************************
void lcd_puts(const char *s)
{
// Khai bao bien.
// Dinh nghia ham.
while(*s)
{
lcd_putc(*s++);
}
}
LCD4x20
//
// Hieu chinh va bo sung: PHAM QUANG TRI - Ho Chi Minh University of Industry.
//
#ifndef _LCD_H_
#define _LCD_H_
#include <htc.h>
/* Khai bao tan so thach anh dao dong */
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
/* Cac khai bao dieu khien bat/tat hien thi */
#define DON 0b00001111 /* Bat hien thi */
#define DOFF 0b00001011 /* Tat hien thi */
#define CURSOR_ON 0b00001111 /* Bat con tro */
#define CURSOR_OFF 0b00001101 /* Tat con tro */
#define BLINK_ON 0b00001111 /* Nhap nhay con tro */
#define BLINK_OFF 0b00001110 /* Khong nhap nhay con tro */
/* Cac khai bao dich chuyen hien thi va con tro */
#define SHIFT_CUR_LEFT 0b00000100 /* Con tro dich sang trai */
#define SHIFT_CUR_RIGHT 0b00000101 /* Con tro dich sang phai */
#define SHIFT_DISP_LEFT 0b00000110 /* Hien thi dich sang trai */
#define SHIFT_DISP_RIGHT 0b00000111 /* Hien thi dich sang phai */
/* Cac khai bao thiet lap chuc nang */
#define FOUR_BIT 0b00101100 /* Giao dien 4-bit */
#define EIGHT_BIT 0b00111100 /* Giao dien 8-bit */
#define LINE_5X7 0b00110000 /* Ky tu 5x7, mot hang */
#define LINE_5X10 0b00110100 /* Ky tu 5x10 */
#define LINES_5X7 0b00111000 /* Ky tu 5x7, nhieu hang */
/* Cac khai bao ket noi chan LCD voi PIC */
#ifndef LCD_RS
#define LCD_RS RC1
#define LCD_EN RC3
#define LCD_RW RC2
#define LCD_DATA4 RD4
#define LCD_DATA5 RD5
#define LCD_DATA6 RD6
#define LCD_DATA7 RD7
#define LCD_RS_TRIS TRISC1
#define LCD_EN_TRIS TRISC3
#define LCD_RW_TRIS TRISC2
#define LCD_DATA4_TRIS TRISD4
#define LCD_DATA5_TRIS TRISD5
#define LCD_DATA6_TRIS TRISD6
#define LCD_DATA7_TRIS TRISD7
#endif
/* Khai bao bien du lieu 8-bit */
typedef union _BYTE_VAL
{
unsigned char Val;
struct
{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} bits;
} BYTE_VAL;
/* Khai bao cac lenh dung cho LCD */
void lcd_init(); // Khoi dong LCD.
unsigned char lcd_busy(); // Thong bao LCD ban xu ly thong tin.
unsigned char lcd_get_byte(unsigned char rs); // Doc mot byte du lieu tu LCD.
void lcd_put_byte(unsigned char a,unsigned char b); // Ghi mot byte du lieu/lenh den LCD.
void lcd_gotoxy(unsigned char col, unsigned char row); // Dinh toa do tren LCD.
void lcd_putc(char c); // Ghi mot ky tu den LCD.
void lcd_puts(const char* s); // Ghi mot chuoi den LCD.
#endif