#include<reg51h>
#define uchar unsigned char
uchar led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
uchar i;
while(1)
{
P0=(led+i);
delay(50);
i++;
i%=8;
}
}
你这个只是代码段,读程序最好是要能从整体到局部。就先讲讲你的这几个问题吧。问题1:指针的指向是需要赋值的,所以它的实际指向是在调用语句中体现的。至于你说的指向,看看 W1302(ucAddr,pClock); 后面的注释,再看看time_data_buff,lcd1602_line1,mun_to_char 后面的注释,要匹配。不是随便乱赋值的。问题2:EA=0;所有中断失能。EA=1;所有中断使能。关掉中断可以防止反复触发,比如这个程序本身就是中断服务子程序的话,可以防止中断程序对其的影响。问题3:指针的地址都是在调用的时候赋值的,有的编译器默认初值是0,有的不是。为了防止指针的错误,最好调用时赋值,也可防止错误先在定义时赋个初值,不要依赖编译器的特性。
这个程序段貌似是对液晶显示时手动调时间的功能的实现,感觉似乎是按键中断的子程序。按键用来控制是否调时间,所以可以解释问题2了。这里有些小建议:能写出好程序不难,能读懂别人的程序才是真的大神。读程序首先要明确整体功能,可以先忽略细节,抓住每个函数的作用,要利用好注释。首先应该知道在做什么,然后才是怎么做。有模块化的 思想。将子程序和主函数结合起来,不要割裂了。编程最难的不是语法,而是思想。平时写完程序后尽量多想想,怎样更简洁些?写程序应该追求的是,可靠--足够的健壮性;简洁--简约而不简单,简约指代码量要少,不简单指功能足够满足用户;可移植性--尽量保证你写的函数可以几乎不加修改的被调用,从而屏蔽掉编译器等的影响;前瞻性--尽量保证你的代码在三年后仍然有生命力,为什么很多真正的实用程序都有很多空函数,就是为了便于将来功能扩展预先留下的。
汇编语言是非常好实现指针的,指针 *** 作的实质是程序内部直接 *** 作内存或者寄存器,而汇编最常用的mov指令就是直接 *** 作内存地址里面的数据。所以要实现指针,你需要用一个内存单元来存放内存的地址,这样就构成了间接寻址。间接寻址就是高级语言中的指针。
第一步首先定义指针:将要寻址的地址放入寄存器中,如:MOV R0,#33h,把33h放到R0里面。
第二步:取内容:如MOV A,@R0,这样就把33h内存里面的内容放入A当中了。
嘿嘿,汇编的效率是非常高的啊。
PC——程序计数器,功能:用来指示下一条指令的地址(逻辑地址即偏移量),一般情况下,系统指示对其进行加1 *** 作,担当遇到转移指令,如JMP,CALL,LOOP等时系统就会将跳转到的指令地址保存在PC中
这个要理清楚加不加code的区别。
不加code,变量是存在片内RAM里面,就是通常意义上的变量,是运行时才从RAM里面分配的,可以在代码中修改变量的值。
加code,虽然写法上是变量,实际上是存储在ROM里面的,就是在程序烧写到单片机时已经分配好了,就是固定的常量,不能在代码中对其值进行修改的。
加不加code区分以后就很好解释了,语句4加code,在烧写进去时是必须定好的常量,语句 1 2 3就必须加code,因为不能在烧写程序时的ROM空间的指针指向尚未初始化的RAM内容。语句4不加code,在运行后分配的RAM指针指向不加code的RAM空间也行,指向加code的ROM空间也行。
先确定好你的通讯方式
比如互联网、串口等等
然后定好一个协议,包括包头内容包尾神马的
接着单片机上撸好代码,烧写成功
上位机撸好代码,编译成dll
接着其他人就调用你的dll完事
实在不会可以外包出来
判断程序是否跑飞可以按照你说的方法来做,至于要求复位之后回到模块2继续执行可以这样实现:将程序模块化,在每个模块的程序开始执行时,现保存该段程序的入口地址,如果程序跑飞,我们把入口地址取出,继续执行即可。
以上就是关于STC89c52单片机 用指针和数组写个流水灯程序全部的内容,包括:STC89c52单片机 用指针和数组写个流水灯程序、单片机C语言编程 指针的问题、单片机 汇编 怎么用指针啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)