找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3788|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

有沒有人會解釋一下這個用C語言指針實現(xiàn)的流水燈程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:891154 發(fā)表于 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;

}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:808634 發(fā)表于 2021-7-16 08:06 | 只看該作者
P0口0x01左移,0000 00001 左移一位 0000  0010
回復(fù)

使用道具 舉報

板凳
ID:808634 發(fā)表于 2021-7-16 08:07 | 只看該作者
buf 為0x01 然后傳給指針,然后在void shifleft函數(shù)中左移
0000 0001 左移一位 0000 0010
回復(fù)

使用道具 舉報

地板
ID:332444 發(fā)表于 2021-7-16 08:10 | 只看該作者
指針有什么?給地址,讀內(nèi)容就是.
回復(fù)

使用道具 舉報

5#
ID:332444 發(fā)表于 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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

6#
ID:689247 發(fā)表于 2021-7-16 08:55 | 只看該作者
&取地址符,讀取變量的地址,*指針,可以把地址中的數(shù)據(jù)讀出來。
指針指向的就是地址,函數(shù)ShiftLeft(unsigned char *p)入口參數(shù)是指針,所以要傳入一個地址。
&buf,就把buf的地址取了出來,(buf定義的時候系統(tǒng)會分配內(nèi)存地址,真正的數(shù)據(jù)是存放在地址中的)ShiftLeft(&buf),就是把buf的地址傳入ShiftLeft函數(shù)中,在ShiftLeft函數(shù)中*p所代表的可以理解為buf地址中的內(nèi)容,直接對地址中的內(nèi)容進行移位,下次讀取buf就是移位后的BUF。
你也可以不用指針,用全局變量也可以,現(xiàn)階段可能好理解一點。
回復(fù)

使用道具 舉報

7#
ID:689247 發(fā)表于 2021-7-16 08:59 | 只看該作者
學單片機的同時,可以把C語言好好學習一下,僅僅使用C51,可能對未來編程影響挺大。有時間還是把C從頭到尾系統(tǒng)的學一遍。我就吃這個虧
回復(fù)

使用道具 舉報

8#
ID:934353 發(fā)表于 2021-7-16 09:52 | 只看該作者
我覺得這注釋已經(jīng)挺詳細了來著,建議好好學一下C語言的指針
回復(fù)

使用道具 舉報

9#
ID:883242 發(fā)表于 2021-7-16 13:37 | 只看該作者
8051的指令體系就不適合用指針,不信你看看生成的匯編代碼,又笨又丑。
回復(fù)

使用道具 舉報

10#
ID:81196 發(fā)表于 2021-7-16 16:55 | 只看該作者
*p = *p << 1;右側(cè)的*p是吧數(shù)據(jù)取出來,<<1是將取出的數(shù)據(jù)左移一位,,*p=是將數(shù)據(jù)再寫入到指針指向的那個空間內(nèi)
回復(fù)

使用道具 舉報

11#
ID:748788 發(fā)表于 2021-7-16 17:20 | 只看該作者
將buf變量的存放地址以指針的方式傳遞給子程序shiftleft。本來這么簡單的程序用不到指針,用指針反倒讓程序復(fù)雜化了。這么做大概是給初學者講解指針的
回復(fù)

使用道具 舉報

12#
ID:917614 發(fā)表于 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;  //指針

}
回復(fù)

使用道具 舉報

13#
ID:490652 發(fā)表于 2021-7-16 22:18 | 只看該作者
&buf是取了buf變量的地址,送入函數(shù)ShiftLeft,函數(shù)定義成*p,就代表在函數(shù)中對指針p的修改將是對該地址內(nèi)容的修改,而不是把變量內(nèi)容復(fù)制過來。
回復(fù)

使用道具 舉報

14#
ID:928284 發(fā)表于 2021-11-29 07:24 | 只看該作者
cpu小白白 發(fā)表于 2021-7-16 08:55
&取地址符,讀取變量的地址,*指針,可以把地址中的數(shù)據(jù)讀出來。
指針指向的就是地址,函數(shù)ShiftLeft(unsi ...

說的非常好,受益了。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表