http://www.picvietnam.com/forum/showthread.php?t=3187
http://www.dientuvietnam.net/forums/showthread.php?p=149856
Đây là source code và báo cáo về sản phẩm này.
http://falleaf.net/download/mTouch/REP01.02.MTOUCH.NGMT.041208.SRC.zip
source file
main.c#includelcd.c
#include
#include "touch.h"
#include "lcd.h"
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);
extern volatile unsigned char touch_pressed;
void main()
{
RE1 = 0;
TRISE1 = 0;
ANS6 = 0;
lcd_init();
touch_init();
lcd_puts("\fLab - 8\n-----mTouch-----");
OPTION = 0b10000100; // timer 0 prescaler = 1:256
T0IF = 0;
T0IE = 1;
GIE = 1;
while(1){
if(touch_pressed){
RE1 = 1;
}else{
RE1 = 0;
}
}
}
void putch(char c)
{
lcd_putc(c);
}
void interrupt isr()
{
if(T0IF && T0IE){
touch_service();
TMR0 = 0;
T0IF = 0;
}
}
#includetouch.c
#include
#include "lcd.h"
void lcd_init(){
unsigned char i;
LCD_EN_TRIS = 0;
LCD_RS_TRIS = 0;
LCD_RW_TRIS = 0;
LCD_DATA4_TRIS = 0;
LCD_DATA5_TRIS = 0;
LCD_DATA6_TRIS = 0;
LCD_DATA7_TRIS = 0;
LCD_EN = 0;
LCD_RS = 0;
LCD_RW = 0;
__delay_ms(100); // delay for power on
// 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); // delay for LCD reset
__delay_ms(100); // delay for LCD reset
__delay_ms(100); // delay for LCD reset
while(lcd_busy());
lcd_put_byte(0,FOUR_BIT & LINES_5X7); // Set LCD type
while(lcd_busy());
lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF); // display off
while(lcd_busy());
lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF); // display on
while(lcd_busy());
lcd_put_byte(0,0x01); // clear display and move cursor to home
while(lcd_busy());
lcd_put_byte(0,SHIFT_CUR_LEFT); // cursor shift mode
while(lcd_busy());
lcd_put_byte(0,0x01); // clear display and move cursor to home
while(lcd_busy());
}
unsigned char lcd_busy()
{
unsigned char busy;
LCD_DATA4_TRIS = 1;
LCD_DATA5_TRIS = 1;
LCD_DATA6_TRIS = 1;
LCD_DATA7_TRIS = 1;
LCD_RW = 1;
LCD_RS = 0;
__delay_us(20);
LCD_EN = 1;
__delay_us(20);
busy = LCD_DATA7;
LCD_EN = 0;
__delay_us(20);
LCD_EN = 1;
__delay_us(20);
LCD_EN = 0;
return busy;
}
unsigned char lcd_get_byte(unsigned char rs)
{
BYTE_VAL b;
LCD_DATA4_TRIS = 1;
LCD_DATA5_TRIS = 1;
LCD_DATA6_TRIS = 1;
LCD_DATA7_TRIS = 1;
LCD_RW = 1;
LCD_RS = 0;
if(rs) LCD_RS = 1;
__delay_us(20);
LCD_EN = 1;
__delay_us(20);
b.bits.b7 = LCD_DATA7;
b.bits.b6 = LCD_DATA6;
b.bits.b5 = LCD_DATA5;
b.bits.b4 = LCD_DATA4;
LCD_EN = 0;
__delay_us(20);
LCD_EN = 1;
__delay_us(20);
b.bits.b3 = LCD_DATA7;
b.bits.b2 = LCD_DATA6;
b.bits.b1 = LCD_DATA5;
b.bits.b0 = LCD_DATA4;
LCD_EN = 0;
return b.Val;
}
void lcd_put_byte(unsigned char rs, unsigned char b)
{
BYTE_VAL temp;
LCD_DATA4_TRIS = 0;
LCD_DATA5_TRIS = 0;
LCD_DATA6_TRIS = 0;
LCD_DATA7_TRIS = 0;
LCD_RS = 0;
if(rs) LCD_RS = 1;
__delay_us(20);
LCD_RW = 0;
__delay_us(20);
LCD_EN = 0;
temp.Val = b;
// send the high nibble
LCD_DATA4 = temp.bits.b4;
LCD_DATA5 = temp.bits.b5;
LCD_DATA6 = temp.bits.b6;
LCD_DATA7 = temp.bits.b7;
__delay_us(20);
LCD_EN = 1;
__delay_us(20);
LCD_EN = 0;
// send the low nibble
LCD_DATA4 = temp.bits.b0;
LCD_DATA5 = temp.bits.b1;
LCD_DATA6 = temp.bits.b2;
LCD_DATA7 = temp.bits.b3;
__delay_us(20);
LCD_EN = 1;
__delay_us(20);
LCD_EN = 0;
}
void lcd_putc(char c){
switch(c){
case '\f':
lcd_put_byte(0, 1);
while(lcd_busy());
break;
case '\n':
lcd_gotoxy(0, 1);
break;
default:
if(isprint(c)){
lcd_put_byte(1, c);
while(lcd_busy());
}
break;
}
}
void lcd_gotoxy(unsigned char col, unsigned char row)
{
unsigned char address;
if(row!=0)
address=0x40;
else
address=0;
address += col;
lcd_put_byte(0,0x80|address);
while(lcd_busy());
}
void lcd_puts(const char* s)
{
while(*s){
lcd_putc(*s++);
}
}
#includeHeader file
#include
#include "touch.h"
volatile unsigned char touch_pressed=0;
void touch_init(void)
{
TRISA0 = 1; // C12IN0-
TRISA2 = 1; // C2IN+
ANS2 = 1; //
ANS0 = 1;
TRISA5 = 0; // C2OUT
ANS5 = 0;
TRISC0 = 1; // T1CKI
// comparator 1
C1OE = 1;
C1POL = 1;
C1R = 1;
C1ON = 1;
// comparator 2
C2OE = 1;
C2ON = 1;
CM2CON1 = 0b00100000;
// VREF = 2/3 Vdd
//VRCON = 0b10001111;
VRCON = 0b10001111;
// SR latch control
SRCON = 0xF0;
// timer 1
TMR1L = 0;
TMR1H = 0;
T1CON = 0b00000111;
}
void touch_service()
{
static unsigned char calibrate = 64;
static long average=0;
long raw, percent;
TMR1ON = 0; // dung timer 1
// 1: Doc gia tri timer 1
raw = ((unsigned int)TMR1H<<8) + TMR1L;
// 2: khi moi khoi dong can tinh toan gia tri Average ban dau de lam moc so sanh
if(calibrate){
average = (average * 15 + raw)/16;
calibrate--;
TMR1L = 0;
TMR1H = 0;
TMR1ON = 1;
return;
}
if(average==0){
TMR1L = 0;
TMR1H = 0;
TMR1ON = 1;
return;
}
// 3: tinh toan % thay doi cua gia tri raw so voi gia tri trung binh Average
percent = average - raw;
if(percent<0)
percent = 0;
else{
percent *= 1000;
percent /= average;
}
// 4: kiem tra neu su thay doi vuot qua nguong dinh san
if(percent > PERCENT_ON){ // pressed
touch_pressed = 1;
}else{
touch_pressed = 0;
average = (average * 15 + raw)/16;
if(raw > average)
average = (average * 15 + raw)/16;
}
// 5: reset timer1, dem lai tu dau
TMR1L = 0;
TMR1H = 0;
TMR1ON = 1;
}
lcd.h
#ifndef _LCD_H_touch.h
#define _LCD_H_
#include
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
/* Display ON/OFF Control defines */
#define DON 0b00001111 /* Display on */
#define DOFF 0b00001011 /* Display off */
#define CURSOR_ON 0b00001111 /* Cursor on */
#define CURSOR_OFF 0b00001101 /* Cursor off */
#define BLINK_ON 0b00001111 /* Cursor Blink */
#define BLINK_OFF 0b00001110 /* Cursor No Blink */
/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT 0b00000100 /* Cursor shifts to the left */
#define SHIFT_CUR_RIGHT 0b00000101 /* Cursor shifts to the right */
#define SHIFT_DISP_LEFT 0b00000110 /* Display shifts to the left */
#define SHIFT_DISP_RIGHT 0b00000111 /* Display shifts to the right */
/* Function Set defines */
#define FOUR_BIT 0b00101100 /* 4-bit Interface */
#define EIGHT_BIT 0b00111100 /* 8-bit Interface */
#define LINE_5X7 0b00110000 /* 5x7 characters, single line */
#define LINE_5X10 0b00110100 /* 5x10 characters */
#define LINES_5X7 0b00111000 /* 5x7 characters, multiple line */
/* Pins mapping */
#ifndef LCD_RS
#define LCD_RS RD1
#define LCD_EN RD3
#define LCD_RW RD2
#define LCD_DATA4 RD4
#define LCD_DATA5 RD5
#define LCD_DATA6 RD6
#define LCD_DATA7 RD7
#define LCD_RS_TRIS TRISD1
#define LCD_EN_TRIS TRISD3
#define LCD_RW_TRIS TRISD2
#define LCD_DATA4_TRIS TRISD4
#define LCD_DATA5_TRIS TRISD5
#define LCD_DATA6_TRIS TRISD6
#define LCD_DATA7_TRIS TRISD7
#endif
//typedef unsigned char unsigned char; // 8-bit unsigned
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;
void lcd_init();
unsigned char lcd_busy();
unsigned char lcd_get_byte(unsigned char rs);
void lcd_put_byte(unsigned char a,unsigned char b);
void lcd_gotoxy(unsigned char col, unsigned char row);
void lcd_putc(char c);
void lcd_puts(const char* s);
#endif
#ifndef _TOUCH_H_code main.c(bật tắt)
#define _TOUCH_H_
#define PERCENT_ON 35
void touch_init(void);
void touch_service();
#endif
#include
#include
#include "touch.h"
#include "lcd.h"
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);
extern volatile unsigned char touch_pressed;
void delay_ms(int ms);
void main()
{
RE1 = 0;
TRISE1 = 0;
ANS6 = 0;
lcd_init();
touch_init();
lcd_puts("\fLab - 8\n-----mTouch-----");
OPTION = 0b10000100; // timer 0 prescaler = 1:256
T0IF = 0;
T0IE = 1;
GIE = 1;
while(1){
if(touch_pressed){
RE1 = 1;
while(touch_pressed){ // cho toi khi phim bam duoc nha
__delay_ms(1);
}
}
if(touch_pressed){
RE1 = 0;
while(touch_pressed){ // cho toi khi phim bam duoc nha
__delay_ms(1);
}
}
}
}
void putch(char c)
{
lcd_putc(c);
}
void interrupt isr()
{
if(T0IF && T0IE){
touch_service();
TMR0 = 0;
T0IF = 0;
}
}
void delay_ms(int ms)
{
int i;
for(i=0; i
_delay(1000);//1ms
}
}
No comments:
Post a Comment
Cám ơn bạn đã ghé ngonnguc.blogspot.com. Bạn có ý kiến thắc mắc hay bình luận gì về bài viết này vui lòng click nhận xét. Để lưu bài viết vào trình duyệt web hoặc tài khoản lưu trữ và chia sẻ bookmark trực tuyến, hãy nhấn vào đây. Bạn cũng có thể đọc bài viết trên blog thông qua các công cụ đọc tin Feed bằng link này hoặc đăng ký nhận bài viết mới qua email. Ngoài ra bạn cũng có thể cho địa chỉ blog này vào Favorites (Internet Explorer) hoặc Bookmark (Mozilla Firefox) để tiện việc theo dõi. Nếu đang làm blog tại Google Blogger bạn cũng có thể lưu blog này ở chế độ theo dõi trong hồ sơ, đó cũng là cách mang lại nguồn khách viếng thăm blog bạn. Tôi hy vọng bạn tìm thấy những thú vị từ trang này.Bạn có thể gõ tiếng việt bằng công cụ có trên blog