[Chia sẻ] Code nhắn tin điện thoại

naebolo

Thành Viên PIF
Trong ngày Touch Design Contest 2013 vừa rồi có bạn j đó có ý định làm bàn phìm nhắn tin cho điện thoại nhưng bị lỗi nhấn 1 lần ra "a", nhần 2 lần thì nó lại ra "ab". Trước đây mình có làm bài tập lớn về thiết kế 1 máy nhắn tin đơn giản.
Vì vậy muốn chia sẽ code ở đây cho mọi người tham khảo. Mong sẽ giúp được các bạn phần nào.

Code viết cho PIC18F97J60, giao tiếp UART với module SIM, và LCD 20x4 (nguyên tắc hoạt động giống với LCD 16x2)
Code:
#define __KEYBOARD_C
 
#include "TCPIPConfig.h"
#include "TCPIP Stack/TCPIP.h"
#include "MainDemo.h"
    #define ROW0                (PORTDbits.RD0)
    #define ROW1                (PORTDbits.RD1)
    #define ROW2                (PORTDbits.RD2)
    #define ROW3                (PORTDbits.RD3)
 
    #define COLUMN0                (PORTDbits.RD4)
    #define COLUMN1                (PORTDbits.RD5)
    #define COLUMN2                (PORTDbits.RD6)
    #define COLUMN3                (PORTDbits.RD7)
#define ALARM_VERSION        "V1.00"
#define BT0            0
#define BT1            1
#define BT2            2
#define BT3            3
#define BT4            4
#define BT5            5
#define BT6            6
#define BT7            7
#define BT8            8
#define BT9            9
#define BTMENU        10
#define BTUP        //11
#define BTDOWN        //12
#define BTON        16//13
#define BTOFF        15//14
#define BTBACK        12//15
#define BTOK        11//16
#define BTPOINT        13
 
#pragma udata udata3
BYTE ContentSMS[200];
BYTE LengSMS1;
BYTE PhoneNumber1[20];
BYTE LengPhone1;
BOOL haveSMS;
#pragma udata udata4
static BYTE PhoneToSend[162] = "";
#pragma udata
WORD StepLCD;//TRANG THAI THIET BI
static BYTE PasswordLCD[20] = "1234", ComparePassLCD[20];
static BYTE DetailSMS[12] = "";
 
static BYTE LengP1 = 4, LengP2 = 0, LengPhone = 0;
static BOOL CheckPassOK = FALSE;
static BYTE LengSMS = 0;
//----------------------------------------------------------
ROM BYTE Enter[11][10] = {" 0\n",
                        ".,?!1@'",
                        "abc2",
                        "def3",
                        "ghi4",
                        "jkl5",
                        "mno6",
                        "pqrs7",
                        "tuv8",
                        "wxyz9",
                        ""
};
 
ROM BYTE EnterUpcase[11][10] = {" 0\n",
                        ".,?!1@'",
                        "ABC2",
                        "DEF3",
                        "GHI4",
                        "JKL5",
                        "MNO6",
                        "PQRS7",
                        "TUV8",
                        "WXYZ9",
                        ""
};
 
ROM BYTE NumberKey[11] ={3, 7, 4, 4, 4, 4, 4, 5, 4, 5, 0};
//----------------------------------------------------------
 
BOOL Device[8];
//#include "MainDemo.h"
static BYTE KeypadSelect[4] = {0, 0, 0, 0};
static DWORD timeEnter;
static BOOL Upcase = FALSE;
 
BYTE GetColumn(BYTE vt);
void SetDevices(BYTE Device, BYTE Value);
void SetSensorType(BYTE Sensor, BYTE Value);
void StatusDevices(BYTE address, BOOL onOff);
void SendSMS(void);
BOOL CheckPass();
 
BYTE GetButton(){
    char tmp;
    ROW1 = 0;
    ROW2 = 0;
    ROW3 = 0;
    ROW0 = 1;
    tmp = GetColumn(0);
    if (tmp > 0)
        if (tmp == 4) return 10;
        else return tmp;
    ROW0 = 0;
    ROW1 = 1;
    tmp = GetColumn(1);
    if (tmp > 0)
        if (tmp == 4) return 11;
        else return (tmp + 3);
    ROW1 = 0;
    ROW2 = 1;
    tmp = GetColumn(2);
    if (tmp > 0)
        if (tmp == 4) return 12;
        else return (tmp + 6);
    ROW2 = 0;
    ROW3 = 1;
    tmp = GetColumn(3);
    if (tmp > 0)
        if(tmp == 2) return 0;
        else return (12 + tmp);
    ROW3 = 0;
    return 100;
}
 
 
BYTE GetColumn(BYTE vt){
    if (COLUMN0){
        if ((KeypadSelect[vt] & 1) == 0){
            DelayMs(100);
            if (COLUMN0){
                KeypadSelect[vt] |= 1;
                return 1;
            }
        }   
    }else KeypadSelect[vt] &= ~1;
 
    if (COLUMN1){
        if (((KeypadSelect[vt] >> 1) & 1) == 0){
            DelayMs(100);
            if (COLUMN1){
                KeypadSelect[vt] |=  (1 << 1);
                return 2;
            }
        }   
    }else KeypadSelect[vt] &= ~(1 << 1);
 
    if (COLUMN2){
        if (((KeypadSelect[vt] >> 2) & 1) == 0){
            DelayMs(100);
            if (COLUMN2){
                KeypadSelect[vt] |= (1 << 2);
                return 3;
            }
        }   
    }else KeypadSelect[vt] &= ~(1 << 2);
 
    if (COLUMN3){
        if (((KeypadSelect[vt] >> 3) & 1) == 0){
            DelayMs(100);
            if (COLUMN3){
                KeypadSelect[vt] |= (1 << 3);
                return 4;
            }
        }   
    }else KeypadSelect[vt] &= ~(1 << 3);
    return 0;
}
 
/*----------------------------------------------------------
*    MENU    10
*    UP        11
*    DOWN    12
*    ON        13
*    OFF        14
*    BACK    15
*    OK        16
-----------------------------------------------------------*/
void SolveForKeyboard(){
    static BYTE tmp, oldTmp, eButton, i;
    WORD tmpStepLCD;
    DWORD tmpTime, tmpTime2;
    tmp = GetButton();
    if (tmp == 100) return;
    // ---------------------------- STATE TABLE -------------------
    tmpStepLCD = StepLCD;
    switch (StepLCD){
        case 0: //Main menu
            if (tmp == BTMENU)
                if (CheckPass()) tmpStepLCD = 2;
                else tmpStepLCD = 1;
            break;
        case 11: // Enter the password
            if (tmp >=0 && tmp <= 9){
                if (LengP2 < 10){
                    DelayMs(5);
                    LCDText[41 + LengP2] = '*';
                    ComparePassLCD[LengP2 ++] = tmp + '0';
                    LCDUpdate();
                }
            }
            else if (tmp == BTOK)
                if (CheckPass()) tmpStepLCD = 2;
                else{
                    LengP2 = 0;
                    tmpStepLCD = 8;
                }
            else if (tmp == BTMENU) tmpStepLCD = 0;
            else if (tmp == BTBACK)
                if (LengP2 > 0){
                    LengP2 --;
                    LCDText[41 + LengP2] = 32;
                    DelayMs(5);
                    LCDUpdate();
                }
            break;
        case 2: // Read SMS
            if (tmp == BTOK)
                if (haveSMS == TRUE){
                    tmpStepLCD = 21;
                    haveSMS = FALSE;
                }
                else tmpStepLCD = 10;
           
            else if (tmp == BTMENU) tmpStepLCD = 3;
            break;
        case 21: // Status device 1
            if (tmp == BTBACK  || tmp == BTMENU) tmpStepLCD = 2;
            else if (tmp == BTOK) tmpStepLCD = 22;
            break;
        case 22:
            if (tmp == BTOK && LengSMS1 > 71) tmpStepLCD = 23;
            else if (tmp == BTMENU) tmpStepLCD = 0;
            break;
        case 23:
            if (tmp == BTOK) tmpStepLCD = 22;
            else if (tmp == BTMENU) tmpStepLCD = 0;
            break;
        case 3: //New message
            if (tmp == BTOK) tmpStepLCD = 31;
            else if (tmp == BTMENU) tmpStepLCD = 6;
            break;
        case 41: //Enter phone number
            if (tmp >=0 && tmp <= 9){
                if (LengP2 < 10){
                    DelayMs(5);
                    LCDText[45 + LengPhone] = tmp + '0';
                    PhoneToSend[LengPhone ++] = tmp + '0';
                    PhoneToSend[LengPhone] = 0;
                    LCDUpdate();
                }
            }
            else if (tmp == BTOK) tmpStepLCD = 411;
            else if (tmp == BTMENU){
                tmpStepLCD = 0;
                LengPhone  = 0;
                PhoneToSend[0] = '\0';
            }
            else if (tmp == BTBACK)
                if (LengPhone > 0){
                    LengPhone --;
                    LCDText[45 + LengPhone] = 32;
                    DelayMs(5);
                    LCDUpdate();
                }
            break;
 
    //Xem thêm ở file đính kèm, vì post bài quá dài ko post hết code được......
}
Full code:
HTML:
http://www.mediafire.com/view/?yd3t8sh5kv4ma3d
 

cxduc92

Thành Viên PIF
cám ơn anh,thật ra cái đó là em dự định làm thôi chứ làm chưa đc.Cũng muốn làm cái này lâu rồi mà đang lo mấy bài tập khác nên cũng chưa làm lại:1cool_byebye:.
 
Top