不要偷懒,将所有.c和.h的所有代码都写出来
时间: 2024-09-11 09:01:25 浏览: 46
loonandroid 3.0 说明文档.pdf
依照您的需求,下面将提供一个基于STC32G8K64单片机的完整示例项目框架,该框架包含`keypad.c`, `keypad.h`, `display.c`, 和必要的头文件及配置。请注意实际开发环境中可能需要进一步调整以适应特定硬件配置或编程习惯。
### keypad.h
```c
#ifndef KEYPAD_H_
#define KEYPAD_H_
#include <reg52.h>
extern unsigned char key;
// 定义矩阵键盘引脚
#define ROW_COUNT 4
#define COL_COUNT 3
sbit row[ROW_COUNT] = { P2_0, P2_1, P2_2, P2_3 };
sbit col[COL_COUNT] = { P2_4, P2_5, P2_6 };
unsigned char GetKey(void);
#endif /* KEYPAD_H_ */
```
### keypad.c
```c
#include "keypad.h"
unsigned char GetKey(void)
{
unsigned char i;
unsigned char j;
unsigned char keyscan;
for(i=0;i<ROW_COUNT;i++) //行线输出低电平
row[i]=0;
for(j=0;j<COL_COUNT;j++) //读入列线状态
if(col[j]==0)
return i*COL_COUNT + j+1;
return 0;
}
```
### display.h
```c
#ifndef DISPLAY_H_
#define DISPLAY_H_
#include <reg52.h>
#include "keypad.h"
#include "common.h"
void dis(void);
void Timer1_init(void);
#endif /* DISPLAY_H_ */
```
### display.c
```c
#include "display.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; // 定时
#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);
TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
#endif
TR1 = 1; // 开始运行
}
void main()
{
Timer1_init();
EA = 1; //全局中断使能
while(1)
{
disd = GetKey() - 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();
}
```
### common.h
```c
#ifndef COMMON_H_
#define COMMON_H_
#include <intrins.h> /* To get definitions of _crol_/_cror_. */
#define bit8 unsigned char
#define bit16 unsigned int
#define cpl(x) (_crol_(1,(x)?0:1)) /* Complement a single bit. */
#define clr(x) (_crol_(1,(x)&0)) /* Clear a single bit. */
#define setb(x) (_crol_(1,(x)|1)) /* Set a single bit. */
#define P1 P0 /* 重新定义P1指向P0端口 */
#define P2 P1 /* 重新定义P2指向P1端口 */
#define delay100us(n) __asm__("nop;nop;nop;nop;nop;nop;nop;nop;nop;nop")
#endif /* COMMON_H_ */
```
这个项目应该能够满足您的基本要求,并且可以在Keil C251环境下进行编译。请根据实际情况修改宏定义以及I/O端口定义等细节。注意这里假设您已经熟悉了Keil环境下的项目设置过程,比如添加源文件、配置生成目标等步骤。
阅读全文