将所有的问题解决,要求将所有.c和.h文件以及包含的所有代码都写出来,不要提供思路,只要代码过程,我充了会员不是过来看你教学的,我要的是能运行的结果
时间: 2024-09-11 16:01:40 浏览: 24
以下是针对您提供的代码中存在的问题进行修正后的 `.c` 和 `.h` 文件完整版本:
### keypad.h
```c
#ifndef KEYPAD_H_
#define KEYPAD_H_
#include <STC32G.H>
extern unsigned char key;
typedef struct {
bit P2_0;
bit P2_1;
bit P2_2;
bit P2_3;
} Row;
typedef struct {
bit P2_4;
bit P2_5;
bit P2_6;
} Col;
unsigned char GetKey(void);
#endif /* KEYPAD_H_ */
```
### keypad.c
```c
#include "keypad.h"
Row row;
Col col;
unsigned char GetKey(void)
{
unsigned char i;
unsigned char j;
unsigned char keyscan;
for (i = 0; i < 4; i++) { // 行线输出低电平
row.P2_0 = (i == 0);
row.P2_1 = (i == 1);
row.P2_2 = (i == 2);
row.P2_3 = (i == 3);
for (j = 0; j < 3; j++) { // 读入列线状态
if ((col.P2_4 == 0) || (col.P2_5 == 0) || (col.P2_6 == 0)) {
return i * 3 + j + 1;
}
}
}
return 0;
}
```
### display.h
```c
#ifndef DISPLAY_H_
#define DISPLAY_H_
#include <STC32G.H>
#include "keypad.h"
void dis(void);
void Timer1_init(void);
#endif /* DISPLAY_H_ */
```
### display.c
```c
#include "display.h"
#include "keypad.h"
u16 disd = 0;
void dis(void)
{
u8 d2, d1, d0;
d2 = (u8)(disd / 100);
d1 = (u8)(disd / 10 % 10);
d0 = (u8)(disd % 10);
P1 = digcode[d2];
if (dp2) P1 = P1 | 0x10; c1 = 0; c2 = 1; c3 = 1;
delay100us(30);
P1 = digcode[d1];
if (dp1) P1 = P1 | 0x10; c1 = 1; c2 = 0; c3 = 1;
delay100us(30);
P1 = digcode[d0];
if (dp0) P1 = P1 | 0x10; c1 = 1; c2 = 1; c3 = 0;
delay100us(1);
}
void Timer1_init(void)
{
TR1 = 0; // 停止计数
ET1 = 1; // 允许中断
TMOD &= ~0x30;
TMOD |= (0 << 4); // 工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
T1_CT = 0; // 定时
#define Timer1_Reload (FOSC / 50) // Timer 1 中断频率, 50次/秒 LED数码管扫描显示
#define FOSC 12000000L // 系统频率
if (Timer1_Reload < 65536UL) {
T1x12 = 1; // 1T 模式
TH1 = (u8)((65536UL - Timer1_Reload) / 256);
TL1 = (u8)((65536UL - Timer1_Reload) % 256);
} else {
T1x12 = 0; // 12T 模式
TH1 = (u8)((65536UL - Timer1_Reload/12) % 256);
}
TR1 = 1; // 开始运行
}
void timer1(void) interrupt 3
{
#if (Timer1_Reload < 65536UL)
T1x12 = 1; // 1T mode
TH1 = (u8)((65536UL - Timer1_Reload) / 256);
TL1 = (u8)((65536UL - Timer1_Reload) % 256);
#else
T1x12 = 0; // 12T mode
TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
#endif
dis();
}
```
### main.c
```c
#include "keypad.h"
#include "display.h"
u16 disd = 0;
void main()
{
Timer1_init(); // 初始化定时器1
EA = 1; // 全局开启中断
// 主循环
while (1) {
disd = GetKey() - 1; // 更新需要显示的数字
}
}
```
请确认以上代码在您的开发环境中能够正确编译并通过相关测试。如果有进一步的错误或需求调整,请告知以便进行相应的修改。
阅读全文