找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2110|回复: 13
收起左侧

有没有人会解释一下这个用C语言指针实现的流水灯程序

[复制链接]
ID:891154 发表于 2021-7-15 16:52 | 显示全部楼层 |阅读模式
10黑币
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void ShiftLeft(unsigned char *p);
void main()
{
unsigned int i;
unsigned char buf = 0x01;

ENLED = 0; //使能选择独立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;

while (1)
{
P0 = ~buf; //缓冲值取反送到 P0 口
for (i=0; i<20000; i++); //延时
ShiftLeft(&buf); //缓冲值左移一位
if (buf == 0) //如移位后为 0 则重赋初值
{
buf = 0X01;
         }
       }
}
void ShiftLeft(unsigned char *p)
{

*p = *p << 1;

}

回复

使用道具 举报

ID:808634 发表于 2021-7-16 08:06 | 显示全部楼层
P0口0x01左移,0000 00001 左移一位 0000  0010
回复

使用道具 举报

ID:808634 发表于 2021-7-16 08:07 | 显示全部楼层
buf 为0x01 然后传给指针,然后在void shifleft函数中左移
0000 0001 左移一位 0000 0010
回复

使用道具 举报

ID:332444 发表于 2021-7-16 08:10 | 显示全部楼层
指针有什么?给地址,读内容就是.
回复

使用道具 举报

ID:332444 发表于 2021-7-16 08:11 | 显示全部楼层

  1. void jw(unsigned int *n, unsigned char *y, unsigned char *t, unsigned char *shi, unsigned char *fen, unsigned char *miao)
  2. {/*时间日期进位*/
  3.         if(*miao>=60)
  4.         {
  5.                 *miao=0;
  6.                 ++*fen;
  7.         }
  8.         if(*fen>=60)
  9.         {
  10.                 *fen=0;
  11.                 ++*shi;
  12.         }
  13.         if(*shi>=24)
  14.         {
  15.                 *shi=0;
  16.                 ++*t;
  17.         }
  18.         if(*t>nyt(*n,*y))
  19.         {
  20.                 ++*y;
  21.                 *t=1;
  22.         }
  23.         if(*y>12)
  24.         {
  25.                 ++*n;
  26.                 *y=1;
  27.         }
  28. }
复制代码
回复

使用道具 举报

ID:689247 发表于 2021-7-16 08:55 | 显示全部楼层
&取地址符,读取变量的地址,*指针,可以把地址中的数据读出来。
指针指向的就是地址,函数ShiftLeft(unsigned char *p)入口参数是指针,所以要传入一个地址。
&buf,就把buf的地址取了出来,(buf定义的时候系统会分配内存地址,真正的数据是存放在地址中的)ShiftLeft(&buf),就是把buf的地址传入ShiftLeft函数中,在ShiftLeft函数中*p所代表的可以理解为buf地址中的内容,直接对地址中的内容进行移位,下次读取buf就是移位后的BUF。
你也可以不用指针,用全局变量也可以,现阶段可能好理解一点。
回复

使用道具 举报

ID:689247 发表于 2021-7-16 08:59 | 显示全部楼层
学单片机的同时,可以把C语言好好学习一下,仅仅使用C51,可能对未来编程影响挺大。有时间还是把C从头到尾系统的学一遍。我就吃这个亏
回复

使用道具 举报

ID:934353 发表于 2021-7-16 09:52 | 显示全部楼层
我觉得这注释已经挺详细了来着,建议好好学一下C语言的指针
回复

使用道具 举报

ID:883242 发表于 2021-7-16 13:37 | 显示全部楼层
8051的指令体系就不适合用指针,不信你看看生成的汇编代码,又笨又丑。
回复

使用道具 举报

ID:81196 发表于 2021-7-16 16:55 | 显示全部楼层
*p = *p << 1;右侧的*p是吧数据取出来,<<1是将取出的数据左移一位,,*p=是将数据再写入到指针指向的那个空间内
回复

使用道具 举报

ID:748788 发表于 2021-7-16 17:20 | 显示全部楼层
将buf变量的存放地址以指针的方式传递给子程序shiftleft。本来这么简单的程序用不到指针,用指针反倒让程序复杂化了。这么做大概是给初学者讲解指针的
回复

使用道具 举报

ID:917614 发表于 2021-7-16 21:05 | 显示全部楼层

#include <reg52.h>       //定义52的底库
sbit ADDR0 = P1^0;      //ADDR0的引脚口为p1.0
sbit ADDR1 = P1^1;      //ADDR1的引脚口为p1.1
sbit ADDR2 = P1^2;     //ADDR2的引脚口为p1.2
sbit ADDR3 = P1^3;    //ADDR3的引脚口为p1.3
sbit ENLED = P1^4;     //ENLED的引脚口为p1.4
void ShiftLeft(unsigned char *p);
void main()
{
unsigned int i;        //无符号整形变量为I
unsigned char buf = 0x01;      //无符号字符buf为0x01

ENLED = 0; //使能选择独立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;  
ADDR0 = 0;

while (1)
{
P0 = ~buf; //缓冲值取反送到 P0 口
for (i=0; i<20000; i++); //延时
ShiftLeft(&buf); //缓冲值左移一位
if (buf == 0) //如移位后为 0 则重赋初值
{
buf = 0X01;
         }
       }
}
void ShiftLeft(unsigned char *p)
{

*p = *p << 1;  //指针

}
回复

使用道具 举报

ID:490652 发表于 2021-7-16 22:18 | 显示全部楼层
&buf是取了buf变量的地址,送入函数ShiftLeft,函数定义成*p,就代表在函数中对指针p的修改将是对该地址内容的修改,而不是把变量内容复制过来。
回复

使用道具 举报

ID:928284 发表于 2021-11-29 07:24 | 显示全部楼层
cpu小白白 发表于 2021-7-16 08:55
&取地址符,读取变量的地址,*指针,可以把地址中的数据读出来。
指针指向的就是地址,函数ShiftLeft(unsi ...

说的非常好,受益了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表