PIC Vietnam

Go Back   PIC Vietnam > Các Đề Tài > Các dự án mã nguồn mở

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Các dự án mã nguồn mở Nếu bạn không mở mã nguồn, ít nhất là một phần nào đó trong dự án của bạn, xin đừng vào đây.

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 25-07-2009, 12:02 PM   #3
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Ủng hộ kimhuynguyen mình POST code viết bằng CCS C cho mạch của bạn

CODE CCS C
Code:
/*Author
    R&P Forwarding - Trading Co., Ltd.
    58/48 Nguyen Minh Hoang, Ward 12, Tan Binh District, HCMC, Viet Nam.
    http://dientu.rpc.vn
    
*/
#include<16f727.h>
#fuses    HS, NOWDT, MCLR
#use delay(clock=20Mhz)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

#byte    ANSELA = 0x185
#byte    ANSELB = 0x186
#byte    ANSELD = 0x188
#byte    ANSELE = 0x189

#byte    PORTA = 0x5
#byte    PORTB = 0x6
#byte     PORTC = 0x7
#byte    PORTD = 0x8
#byte    PORTE = 0x9

#byte    TRISA = 0x85
#byte     TRISB = 0x86
#byte    TRISC = 0x87
#byte     TRISD = 0x88
#byte    TRISE = 0x89



#byte    T2CON =  0x012                    // T2ON, prescale = 1:16
#byte    T1CON  = 0x010            // Timer1 enable, source= capacity sensing, 1:1 prescale, don't sync with sys clock
#byte    T1GCON = 0x08F            // T1GSS = Timer 2, toggle mode
#byte    PR2 =     0x092
#byte    OSCTUNE    = 0x091
#byte    OSCCON    = 0x090

#byte     CPSCON0 = 0x108                // control settings
#byte    CPSCON1 = 0x109                        // init to channel select = 0 (4 LSb's)


#bit     TMR1GIF   = 0x0C.7                        // clear gate intpt flag
#bit     TMR1GIE   = 0x8C.7                    // enable gate intpt
#bit    PEIE      = 0x8B.6                        // enable peripheral intpts
#bit    TMR2IF       = 0x0C.1
#bit    TMR2IE         = 0x8C.1
#bit    GIE         = 0x8B.7
#bit     TMR1ON        = 0x10.0

#bit    LED1_MUX    = PORTA.0
#bit    LED2_MUX    = PORTA.1
#bit    LED3_MUX    = PORTA.2
#bit    LED4_MUX    = PORTA.3
#bit    LED5_MUX    = PORTB.6
#bit    LED6_MUX    = PORTB.7
#bit    LED7_MUX    = PORTC.0
#bit    LED8_MUX    = PORTE.2

#bit    TRIS_LED1    = TRISA.0
#bit    TRIS_LED2    = TRISA.1
#bit    TRIS_LED3    = TRISA.2
#bit    TRIS_LED4    = TRISA.3
#bit    TRIS_LED5    = TRISB.6
#bit    TRIS_LED6    = TRISB.7
#bit    TRIS_LED7    = TRISC.0
#bit    TRIS_LED8    = TRISE.2




#define BOUNCE_TIME 2
unsigned char index;
unsigned long     reading[16];        // current reading for each button
unsigned long     average[16];        // running average for each button
unsigned long     threshold;                // threshold value is req'd # counts decrease from avg
unsigned long    bigval;                        // current button bigval   - for averaging technique
unsigned long    smallavg;                    // current button smallavg - for averaging technique


typedef struct{
    struct {
        unsigned char bounce;
    }BYTES;    
    struct {
        unsigned char isPress:1;
        unsigned char flagPress:1;
        unsigned char isRelease:1;    
        unsigned char unused:5;
    }FLAG;    
} BUTTON;

BUTTON    BTN[16];
    


void init();
void main() {
    unsigned char i;
    init();


    while(1) {    
        for(i=0; i<16; i++) {
            //button i is Pressed
            if(BTN[i].FLAG.isPress) {

                
                //Your code here when BTN[i] Pressed
                
                //Must Clear when BTN Press Processed
                BTN[i].FLAG.isPress = 0;
            
            //button i is Released
            }else if(BTN[i].FLAG.isRelease) {

                //Your code here when BTN[i] Release
                
                //Must Clear when BTN Release Processed
                BTN[i].FLAG.isRelease = 0;
            }
            
        //end for    
        }
    
    }    
}    

void init() {    
    char i;
    //setup_oscillator(OSC_8MHZ);
    for (index=0; index<16; index++){
        average[index] = 0;
        reading[index] = 0;
    }
    ANSELA = 0b00110000;
    TRISA  = 0b11111111;
    
    ANSELB = 0b00111111;
    TRISB  = 0b11111111;
    
    ANSELD = 0b11111111;
    TRISD  = 0b11111111;
    TRISC  = 0b11111111;
    
    ANSELE = 0b00000000;
    TRISE  = 0b00000000;
    
    T2CON  = 0b011110111;                    // T2ON, prescale = 1:16
    T1CON  = 0b11000101;                // Timer1 enable, source= capacity sensing, 1:1 prescale, don't sync with sys clock
    T1GCON = 0b11100010;                // T1GSS = Timer 2, toggle mode
    PR2 = 0xB4;
    
    CPSCON0 = 0b10001100;                // control settings
    CPSCON1 = 0x01;                        // init to channel select = 0 (4 LSb's)
    index = 0;
    
    TMR1GIF   = 0;                        // clear gate intpt flag
    TMR1GIE   = 1;                        // enable gate intpt
    PEIE      = 1;                        // enable peripheral intpts
    TMR2IF = 0;
    TMR2IE = 1;
    GIE = 1;

    for(i=0; i<16; i++) BTN[i] = 0;
    //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
    //enable_interrupts(INT_RTCC);
}    

#INT_DEFAULT 
void global_isr() {
    if (TMR1GIF && TMR1GIE) {
        TMR1GIF = 0;                    // clear intpt flag
        TMR1ON = 0;                        // Timer1 off
        
        bigval = get_timer1();
        bigval = bigval * 4;
        reading[index] = bigval;
        smallavg = average[index] / 4;
        threshold = average[index]>>1;                                    // ratiometric threshold from avail above (& combinations)

        if (bigval < average[index] - threshold) 
        {
            if(BTN[index].BYTES.bounce < BOUNCE_TIME) BTN[index].BYTES.bounce++;
            if(!BTN[index].FLAG.flagPress && BTN[index].BYTES.bounce == BOUNCE_TIME) {
                BTN[index].FLAG.isPress = 1;    
                BTN[index].FLAG.flagPress = 1;
            }    
        }
        else 
        {
            if(BTN[index].BYTES.bounce > 0) BTN[index].BYTES.bounce--;
            if(BTN[index].FLAG.flagPress && BTN[index].BYTES.bounce == 0) {
                BTN[index].FLAG.flagPress = 0;
                BTN[index].FLAG.isRelease = 1;    
            }    
            // Perform average after detection comparison
            average[index] += bigval/4 - smallavg;
        }
        set_timer1(0);
        TMR1ON  = 1;                // Set up for next channel
        index ++;
         index &= 0x0F;;
        CPSCON1 = index;
    }else if(TMR2IF) {
        TMR2IF = 0;
    }
    
}
File Kèm Theo
File Type: zip mTouch.zip (1.8 KB, 729 lần tải)

thay đổi nội dung bởi: phamminhtuan, 27-07-2009 lúc 11:50 AM. Lý do: Bổ sung thông tin
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Tags
16f727, mtouch


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 10:15 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam