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)
Full code:
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......
}
HTML:
http://www.mediafire.com/view/?yd3t8sh5kv4ma3d