以上这题用分块函数来写
时间: 2024-03-14 09:44:33 浏览: 15
好的,以下是使用分块函数来实现的代码:
```c
#include <reg52.h>
#define ROWS 4
#define COLS 4
const char keyValues[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
char scanKey() {
char keyValue = 0;
unsigned char i, j;
for (i = 0; i < ROWS; i++) {
P1 = ~(1 << i);
for (j = 0; j < COLS; j++) {
if ((P1 & (1 << (j + ROWS))) == 0) {
keyValue = keyValues[i][j];
break;
}
}
if (keyValue != 0) break;
}
return keyValue;
}
void display(char value) {
// 在这里实现显示功能,例如用数码管显示
}
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 125; j++) {
// 使用定时器产生1ms的延时
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
TR0 = 1;
while (TF0 == 0);
TR0 = 0;
TF0 = 0;
}
}
}
void main() {
char keyValue = 0;
while (1) {
keyValue = scanKey();
if (keyValue != 0) {
display(keyValue);
delay(1000);
}
}
}
```
在上面的代码中,我们使用了一个名为`delay`的分块函数来实现延时功能。这个函数接受一个参数`ms`,表示需要延时的毫秒数。函数内部使用了定时器来实现1ms的延时,并循环执行`ms`次来实现总共需要延时的时间。
需要注意的是,在使用定时器时需要先设置定时器的初值,然后启动定时器,等待定时器中断,最后关闭定时器和清除中断标志位。
除了延时函数外,其他的代码和之前的版本是相同的。