电子产业一站式赋能平台

PCB联盟网

搜索
查看: 3548|回复: 5
收起左侧

keil编写C程序是不是不能在函数内定义变量啊,求大神

[复制链接]

591

主题

959

帖子

5157

积分

四级会员

Rank: 4

积分
5157
发表于 2022-7-16 07:58:44 | 显示全部楼层 |阅读模式
这几天玩玩单片机,刚下的keilc51的语法和C语言不太一样,也没相关的书就自己摸索,发现只要是在函数内定义的局部变量都是无效的,必须在程序最开头定义,而且不能在主函数前声明函数,此函数如果要被调用必须整个函数写在最前面。。。而且定义变量时赋值是确定变量存储地址,而不是真正的给变量赋值。。。    是我的keil版本太低还是keil用的编译器就这样。。。
     每次临时想加个循环计数的变量,结果都要跑到最前边先定义,看来单片机存储单元应该也是不能释放的,如果每个变量都必须单独定义,非常麻烦还占存储空间,是不是因为单片机只能这样,还是keil只能这样。。。
回复

使用道具 举报

585

主题

910

帖子

4977

积分

四级会员

Rank: 4

积分
4977
发表于 2022-7-16 07:59:43 | 显示全部楼层
其实是可以的,在程序最开头定义的变量,只是为了让你在以后使用中改变参数啥的更加方便,不必再找到子函数,在子函数里面进行修改,只需要在开始的前面修改即可。

我说的可能也不是很对,我是这么理解的,有时候就需要,在子函数里面进行修改,一点点进行修改。

有啥不懂的咱们一起讨论一起进步吧,我也是一只小菜鸟
回复 支持 反对

使用道具 举报

578

主题

936

帖子

4943

积分

四级会员

Rank: 4

积分
4943
发表于 2022-7-16 08:00:43 | 显示全部楼层
可以啊!
void xxx();
void main() {};
void xxx() {int x;};
这样是可以的啊
回复 支持 反对

使用道具 举报

591

主题

1772

帖子

5770

积分

四级会员

Rank: 4

积分
5770
发表于 2022-7-16 08:01:33 | 显示全部楼层
在主函数一开始定义就好了。这是c 语言的规定。你可能在VC6.0里边见过在主函数开始后某一行才定义,但在keil中不行,Vc容错性比较好的
回复 支持 反对

使用道具 举报

594

主题

958

帖子

5093

积分

四级会员

Rank: 4

积分
5093
发表于 2022-7-16 08:02:24 | 显示全部楼层
肯定可以的:比如
程序动态显示字符 显示光标和光标闪烁打开效果



------------------------------------------------*/
#include<reg52.h> //包含头文件,义
#include<intrins.h>


sbit RS = P2^4;   //定义端口
sbit RW = P2^5;
sbit EN = P2^6;


#define RS_CLR RS=0
#define RS_SET RS=1


#define RW_CLR RW=0
#define RW_SET RW=1


#define EN_CLR EN=0
#define EN_SET EN=1


#define DataPort P0
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}


/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
{     
LCD_Write_Com(0x80 + x);     
}
else
{     
LCD_Write_Com(0xC0 + x);     
}        
while (*s)
{     
LCD_Write_Data( *s);     
s ++;     
}
}
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
{     
LCD_Write_Com(0x80 + x);     
}   
else
{     
LCD_Write_Com(0xC0 + x);     
}        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*显示模式设置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }
   
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
unsigned char i;
unsigned char *pa,*pb;


LCD_Init();
LCD_Write_Com(0x0f);//光标开,光标闪烁开
while (1)
{  
pa = "Welcome to";
pb = "www.doflye.net";  
LCD_Clear();  
LCD_Write_String(2,0,pa);  //显示2行信息
LCD_Write_String(1,1,pb);
for(i=0;i<8;i++)            //延时2s左右
     DelayMs(250);
LCD_Clear();                //清屏显示其他信息
i = 2;
while (*pa)                 //循环输入方式显示2行信息
{   
LCD_Write_Char(i,0,*pa);   
i ++;   
pa ++;   
DelayMs(250);   
}  
i=1;  
while (*pb)
{   
LCD_Write_Char(i,1,*pb);   
i ++;   
pb ++;   
DelayMs(250);   
}  


  DelayMs(250);  
}
}
回复 支持 反对

使用道具 举报

585

主题

910

帖子

4977

积分

四级会员

Rank: 4

积分
4977
发表于 2022-7-16 08:03:22 | 显示全部楼层
路过
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表