在做一个菜单的时候,想首次进入菜单的时候进入方法1不是首次进入的时候进入方法2,由于他们之间有公共的一部分 当时用的方法是 利用#define FIRST 然后第一次用完后undef 后面判断FIRST有没定义 ,#ifdef FIRST。。。但在测试的时候却发现运行不尽人意,第二天偶尔看见一篇关于宏定义的解说,才发现 自己从写代码的初期就错了,(语法错误 ) 宏的定义 在 预处理的时候进行处理,记得很清楚,用却想当然。
void init_matrix(unsigned char temprat_inter,unsigned char temprat_float,
unsigned char menu_flag, unsigned char key_argv)
{
if(menu_flag % 10 == 0){ //清屏幕
Write_com(0x01);//清显示:清屏幕指令
switch( menu_flag) {
case FIRST_INTO :menu_flag = HOME_PAGE;
case HOME_PAGE:{
string[0] = '0' + temprat_inter/10;
string[1] = '0' + temprat_inter%10 ;
string[2] = '.';
string[3] = '0' + temprat_float%10;//前4位显示
menu_flag != TEMPRAT_EXCEED ? strcpy(&string[7],"safe") : strcpy(&string[7],"Warning") ;
strcpy(string1,"MenuSet");
}break;//对温度进行显示 显示主页
case MENU_DISPLAY:{ //菜单展示
memset(string,0 ,sizeof(string));
memset(string1,0,sizeof(string1)); //将 数组清空,为下面的菜单切换 做准备
strcpy(string," PhoneSet ");
strcpy(string1," TemperatSet");
#define MENU_SET_INIT_SUCESS
}break;
case TEMPRAT_SET_MENU:{
}break;
case PHONE_SET_MENU: {
}break;
default: break;
}
}
else if(menu_flag %10 == SECOND_INTO) { //第二次进入根据 菜单页面 选择刷新部分 温度下降的很慢 ?什么原因???根据 键值 移动光标
//else{
switch((menu_flag - 1 )){
case HOME_PAGE:{
WriteAddress(0x00);//写如数据的首地址
WriteData('0' + temprat_inter/10);
WriteData('0' + temprat_inter%10);
WriteData('.');
WriteData('0' + temprat_inter%10);
}break;
case MENU_DISPLAY: {
/*消去初始化光标的 影响 我们把宏注销掉*/
#ifdef MENU_SET_INIT_SUCESS
#undef MENU_SET_INIT_SUCESS
#endif
//if(key_argv == NULL)
if(key_argv == ADD)FIRST_LINE; //只是光标的移动即可
if(key_argv == DEC)SECOND_LINE;//向下则光标移动到下面
WriteData('k' + temprat_inter/10);
}break;
case TEMPRAT_SET_MENU:
case PHONE_SET_MENU: break;
default : WriteAddress(0x00);//写如数据的首地址
WriteData('k' + temprat_inter/10);
}
}
}
void __1602lcd_main( unsigned char temprat_inter,unsigned char temprat_float,
unsigned char menu_flag, unsigned char key_argv) //主函数 不敢用指针,只敢用原型
{
unsigned char i,j;
i = 0;
//while(num [i]!= 'd' ){ //这个不可以
// string[i] = num[i];
// i++;
//}
// string[1]='s'; //这个可以
init_matrix(temprat_inter,temprat_float,menu_flag,key_argv);
if(menu_flag == FIRST_INTO){
LcdInt(); //调用LCD初始化函数
delay(10);
//while(1)
//{
Write_com(0x01);//清显示:清屏幕指令
}
if(menu_flag%10 == FIRST) //首次进入
{ __CUT__TIME__;delay(5);
WriteAddress(0x00); // 设置显示位置为第一行的第1个字
__CUT__TIME__; delay(5);
i = 0;
while(string[i] != '\0') //'\0'是数组结束标志
{ // 显示字符 WWW.RICHMCU.COM
WriteData(string[i]);
i++;
__CUT__TIME__;//delay(100);
}
WriteAddress(0x40); // 设置显示位置为第二行的第1个字
i = 0;
while(string[i] != '\0') //'\0'是数组结束标志
{ // 显示字符 QUICK STUDY MCU
WriteData(string1[i]);
i++;
__CUT__TIME__;//delay(100);
}
}
//if(menu_flag%10 == SECOND_INTO){
// WriteAddress(0x00); WriteData('4'); WriteData('5');
//} 自己调的时候用
//while(1);
//delay(1000);
//while(1);
// delay(1000);
// Write_com(0x08); //关闭显示
//while(1);
// delay(3000); //延时 维持显示一段时间
// Write_com(0x0c);//开显示
// while(1);
// delay(3000); //延时 维持显示一段时间
// Write_com(0x0f); //开光标
// while(1);
// delay(1000); //延时 维持显示一段时间
//while(1);
// Write_com(0x40); //设定CGRAM地址
// delay(5);
// for(j=0;j<8;j++ )
// {
// WriteData(User[j]);//写入自定义图形 ℃
// }
// WriteAddress(0x05);//设定屏幕上的显示位置
// delay(5);
// WriteData(0x00); //从CGRAM里取出自定义图形显示
//while(1);
//}
#ifdef MENU_SET_INIT_SUCESS
FIRST_LINE;
#endif
}
#define NUM_1 2
#define total (NUM_1) + 4
int main()
{
int apple = 1,pear = 3;
if(apple == pear)
{
apple = 5;
#define NUM_1 3
}
printf("%d\n",(int)total);
#undef NUM_1
#define NUM_1 1
printf("%d\n",(int)total);
return 0;
}
这里答案是
7
5
这个预处理不受if的语句判断。所以上面if是没用的。
今天想用 宏__COVER 当成注释符号用 即是 用这个替换 // 这个后来发现不可行 比如:#define __COVER // 这时__COVER并不是替换//而是空这个需要注意,难道要用转义字符,(经过查询 /,不用转义) 这里发现宏定义并不是什么都替换的