#include < reg51.h > #include < stdlib.h > #include "st7565.h"
unsigned char keyvalue = 0; bit flag = 0; bit keyflag = 0; bit startflag = 0;
unsigned char num[3] = { 5, 5, 5 }; unsigned char t = 0, a = 0; sbit KEY_IN_1 = P1 ^ 3; sbit KEY_IN_2 = P1 ^ 2; sbit KEY_IN_3 = P1 ^ 1; sbit KEY_IN_4 = P1 ^ 0; sbit KEY_OUT_1 = P1 ^ 4; sbit KEY_OUT_2 = P1 ^ 5; sbit KEY_OUT_3 = P1 ^ 6; sbit KEY_OUT_4 = P1 ^ 7;
void KeyDriver();
unsigned char code KeyCodeMap[4][4] = { { 0x30, 0x37, 0x34, 0x31 }, { 0x1b, 0x38, 0x35, 0x32 }, { 0x0d, 0x39, 0x36, 0x33 }, { 0x27, 0x28, 0x25, 0x26 }
};
unsigned char KeySta[4][4] = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
void Delay10ms(unsigned int c) { unsigned char a, b; for (; c > 0; c--) for (b = 38; b > 0; b--) for (a = 130; a > 0; a--); }
void refresh12864() { Lcd12864_Write16CnCHAR(96, 2, "壤土"); Lcd12864_Write16CnCHAR(64, 2, "壤土"); Lcd12864_Write16CnCHAR(32, 2, "壤土"); Lcd12864_Write16CnCHAR(96, 4, "壤土"); Lcd12864_Write16CnCHAR(64, 4, "壤土"); Lcd12864_Write16CnCHAR(32, 4, "壤土"); Lcd12864_Write16CnCHAR(96, 6, "壤土"); Lcd12864_Write16CnCHAR(64, 6, "壤土"); Lcd12864_Write16CnCHAR(32, 6, "壤土");
Delay10ms(30); if (num[1] == 1) Lcd12864_Write16CnCHAR(96, 2, "鼠地"); else if (num[1] == 2) Lcd12864_Write16CnCHAR(64, 2, "鼠地"); else if (num[1] == 3) Lcd12864_Write16CnCHAR(32, 2, "鼠地"); else if (num[1] == 4) Lcd12864_Write16CnCHAR(96, 4, "鼠地"); else if (num[1] == 5) Lcd12864_Write16CnCHAR(64, 4, "鼠地"); else if (num[1] == 6) Lcd12864_Write16CnCHAR(32, 4, "鼠地"); else if (num[1] == 7) Lcd12864_Write16CnCHAR(96, 6, "鼠地"); else if (num[1] == 8) Lcd12864_Write16CnCHAR(64, 6, "鼠地"); else Lcd12864_Write16CnCHAR(32, 6, "鼠地"); }
void Timer0Init() { TMOD |= 0X01; TH0 = 0XFC; TL0 = 0X18; ET0 = 1; EA = 1; TR0 = 1; }
void freenum() { while (1) { srand(t); a = (char)(rand() % 10); if (a == num[1] | a == 0) { continue; } else { num[2] = num[1]; num[1] = num[0]; num[0] = a; break; } } }
void main() { Timer0Init(); Lcd12864_Init(); freenum();
Lcd12864_ClearScreen(); Lcd12864_Write16CnCHAR(40, 3, "鼠地打"); while (1) { if (flag == 1) { Lcd12864_ClearScreen(); flag = 0; refresh12864(); }
KeyDriver();
if (keyflag) { keyflag = 0; if (num[1] == keyvalue) { freenum(); flag = 1; } else { Lcd12864_ClearScreen(); Lcd12864_Write16CnCHAR(32, 3, "束结戏游");
} }
} }
void KeyAction(unsigned char keycode) {
if ((keycode >= 0x31) && (keycode <= 0x39)) { if (startflag) { keyvalue = (keycode - 0x30); keyflag = 1; } } else if (keycode == 0x1B) { startflag = 0; flag = 0; Lcd12864_ClearScreen(); Lcd12864_Write16CnCHAR(40, 3, "鼠地打"); } else if (keycode == 0x0D) { flag = 1; startflag = 1; }
}
void KeyDriver() { unsigned char i, j; static unsigned char backup[4][4] = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (backup[i][j] != KeySta[i][j]) { if (backup[i][j] != 0) { KeyAction(KeyCodeMap[i][j]); } backup[i][j] = KeySta[i][j]; } } } }
void KeyScan() { unsigned char i; static unsigned char keyout = 0; static unsigned char keybuf[4][4] = { { 0xFF, 0xFF, 0xFF, 0xFF }, { 0xFF, 0xFF, 0xFF, 0xFF }, { 0xFF, 0xFF, 0xFF, 0xFF }, { 0xFF, 0xFF, 0xFF, 0xFF } };
keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1; keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2; keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4; for (i = 0; i < 4; i++) { if ((keybuf[keyout][i] & 0x0F) == 0x00) { KeySta[keyout][i] = 0; } else if ((keybuf[keyout][i] & 0x0F) == 0x0F) { KeySta[keyout][i] = 1; } } keyout++; keyout = keyout & 0x03; switch (keyout) { case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; } }
void Timer0() interrupt 1 { TH0 = 0xFC; TL0 = 0x67; t++; if (t == 100) t = 0; KeyScan(); }
|