1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
| /\* Main.c file generated by New Project wizard \* \* Created: 2023-5-22 \* Processor: 80C52 \* Compiler: SDCC for 8051 \*/ #include <mcs51reg.h> //#include <compiler.h> //NOP() //#include <8052.h> //#include <stc89.h> #include <stdio.h>
#define FOSC 11059200UL //System frequency #define BAUD 9600 //UART baudrate
#define T1MS (65536-FOSC/12/1000) //1ms timer
#define COL1 (0xEF) #define COL2 (0xDF) #define COL3 (0xBF) #define COL4 (0x7F)
#define wei1 (P2\_0) #define wei2 (P2\_1) #define LED (P2\_2)
unsigned char key_val[] = { COL1, COL2, COL3, COL4 };
unsigned char __code key_data[] = { 0xEE, 0xED, 0xEB, 0xE7, // Key 1, 2, 3, 4 0xDE, 0xDD, 0xDB, 0xD7, // Key 5, 6, 7, 8 0xBE, 0xBD, 0xBB, 0xB7, // Key 9, 10, 11, 12 0x7E, 0x7D, 0x7B, 0x77, // Key 13, 14, 15, 16 }; unsigned char __code table[] = {// 0x3f,0x06,0x5b,0x4f,// 0 1 2 3 0x66,0x6d,0x7d,0x07,// 4 5 6 7 0x7f,0x6f // 8 9 };
unsigned char key_row = 0; unsigned char key_col = 0; unsigned char Button_value = 0; //unsigned int count = 0;
void delayms(unsigned int ms) { unsigned int x; unsigned int y; for (y=ms; y>0; y--) { for (x=227; x>0; x--) ; } }
void uart\_init() { SCON |= 0x50; TMOD |= 0x20;
// TH1 = 0xFD;//波特率9600 // TL1 = 0xFD; TH1 = (unsigned char)(((65536 - (FOSC/32/BAUD) )>>8) - 2) ; TL1 = (unsigned char)(65536- (FOSC/32/BAUD) - 2) ; TR1 = 1; }
void SendData(char data1) { SBUF = data1; while (!TI) ; TI = 0; }
void SendString(unsigned char \*buffer) { unsigned char \*p = buffer; while (\*p) { SendData(\*p); p++; } }
int putchar(int data1) { SendData(data1); return data1;
}
void int0\_init() { IT0 = 1; // 下降沿触发 EX0 = 1; // 开外部中断0 EA = 1; //open global interrupt switch }
void key\_scan() { unsigned char i = 0;
for (i=0; i<4; i++) { key_col = key_val[i]; P1 = key_col; delayms(2); } }
void key\_value(unsigned char value) { unsigned char i = 0; for (i=0; i<16; i++) { if (value == key_data[i]) { Button_value = i + 1; printf("Keyvalue:%d \r\n",Button_value); } } } /\*------------------------------------------------ 外部中断(INT0)中断子程序 ------------------------------------------------\*/ void int0\_isr(void) __interrupt 0 __using 1 { EX0 = 0; delayms(10); // 延时去抖 key_row = P1; key\_value(key_row); EX0 = 1; } void led\_off() { wei1= 1; wei2= 1; }
void Display() { TR0 = 0; //timer0 STOP wei1=0,wei2=1; P0= table[Button_value/10]; delayms(6); // NOP();NOP();NOP();NOP(); led\_off();
delayms(1); //消隐 NOP();NOP(); wei1=1,wei2=0; P0= table[Button_value%10]; // NOP();NOP();NOP();NOP(); delayms(6); // NOP();NOP(); led\_off(); delayms(1); //消隐 TR0 = 1; //timer0 start running } /\*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------\*/ void Init\_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TL0 = T1MS; //initial timer0 low byte TH0 = T1MS >> 8; //initial timer0 high byte TR0 = 1; //timer0 start running ET0 = 1; //enable timer0 interrupt EA = 1; //open global interrupt switch }
/\*------------------------------------------------ 定时器0中断子程序 ------------------------------------------------\*/ void Timer0\_isr(void) __interrupt 1 __using 2 { TL0 = T1MS; //reload timer0 low byte TH0 = T1MS >> 8; //reload timer0 high byte Display(); LED = ! LED; //指示灯反相,可以看到闪烁
} void main(void) {
Init\_Timer0(); int0\_init(); uart\_init(); while (1) { // 键盘扫描 key\_scan(); } }
|