[mw_shl_code=c,true]/*****keyscan.h*****/
#ifndef __keyscan_H
#define __keyscan_H
//#include<reg52.h>
sfr P3 = 0xB0;
unsigned char i,j,k=0;
unsigned char KeyScanCode[]={0xef,0xdf,0xbf,0x7f};
unsigned char KeyCodeTable[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7d,0x7b};
unsigned char GetKey();
#endif[/mw_shl_code]
[mw_shl_code=c,true]/******lcd1602.h*****/
#ifndef __lcd1602_H
#define __lcd1602_H
//#include<reg52.h>
#include<intrins.h>
#define Delaynop(){_nop_();_nop_();_nop_();}
sfr P2 = 0xA0;
sfr P0 = 0x80;
sbit RW=P2^1;
sbit RS=P2^0;
sbit EN=P2^2;
void Delayms(unsigned int);
void Display_String(unsigned char);
bit LCD_Busy_Check();
void LCD_Write_Command(unsigned char);
void LCD_Wdat(unsigned char);
void Init_LCD();
void LCD_Pos(unsigned char);
#endif[/mw_shl_code]
lcd1602.c keyscan.c这里就不贴出来了
笔者遇到最大的问题就是参数重复定义,因为刚开始的时候上述两个头文件都用到了IO口,所以之前我就都调用了reg52.h这个头文件
编译程序后系统提示了一麻麻错误,redefinition!
那么问题就来了
因为我两个头文件里都用到了IO,必须都调用reg5.h,思索良久才想到去找系统自定义的头文件,打开reg52.h,发现把所有的IO都定义好了,还有一些寄存器
于是我把reg52.h里我有用到的定义复制到了我自定义的头文件里,编译后redefinition都好了,但是出现我没有定义位参数RS RW EN
于是我在头文件里第一次定义位是这样的:
[mw_shl_code=c,true]#define RW P2^1;
#define RS P2^0;
#define EN P2^2;[/mw_shl_code]
但编译后还是一样的错误,后来想了下define 是让我的参数等于一个已有定义的变量或者常量,
还没解决本质问题,后来就想到了sbit。其实是很简单的问题,但由于第一次自定义头文件,总是难以避免的。
而后就是_nop()_了,提示在我的头文件lcd1602.h里_nop_()是未定义的函数,由于只在这个头文件里调用了_nop_(),
所以我就直接
[mw_shl_code=c,true]#include<intrins.h>[/mw_shl_code]
当然还有一种办法就是同之前一样,去#include<intrins.h>里面把_nop_()的函数定义copy过来;
翻过这篇,那么笔者的问题来了
问题一:我自定义两个头文件A B,而我又不想去系统头文件里copy,而是直接调用,假入A B都需要调用system.h,那我能不能A调用system.h(泛指系统头文件),
B中#include<A.h>?
问题二:外部文件引用extern!在头文件A.h中定义了函数function(void)(泛指),而B.c中又用到了A中的function(void),我能不能在B.h中
extern function(void),这样我在B.c中直接调用A中的function(void),需不需要在B.c或B.h中#include<A.h>,因为我在想假如需要#include<A.h>的话,
又何必去extern function(void)?
问题三:主程序编译其他错误
第一次是提示我调用函数时前后传递参数不匹配,后来我就把*str定义成unsigned char code类型,然后就提示我different length of parameter list,
真是搞不定,不知哪里又犯低级错误了
说得比较多,哎!!!
最后一个问题:keil C51自定义的头文件是不是要手动放到系统安装目录头文件下,不能再软件里添加进去?
|