欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 有沒有人會解釋一下這個用C語言指針實現的流水燈程序 [打印本頁]

作者: 3042974988    時間: 2021-7-15 16:52
標題: 有沒有人會解釋一下這個用C語言指針實現的流水燈程序
#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;

}


作者: 七禾頁    時間: 2021-7-16 08:06
P0口0x01左移,0000 00001 左移一位 0000  0010
作者: 七禾頁    時間: 2021-7-16 08:07
buf 為0x01 然后傳給指針,然后在void shifleft函數中左移
0000 0001 左移一位 0000 0010
作者: xianfajushi    時間: 2021-7-16 08:10
指針有什么?給地址,讀內容就是.
作者: xianfajushi    時間: 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. }
復制代碼

作者: cpu小白白    時間: 2021-7-16 08:55
&取地址符,讀取變量的地址,*指針,可以把地址中的數據讀出來。
指針指向的就是地址,函數ShiftLeft(unsigned char *p)入口參數是指針,所以要傳入一個地址。
&buf,就把buf的地址取了出來,(buf定義的時候系統會分配內存地址,真正的數據是存放在地址中的)ShiftLeft(&buf),就是把buf的地址傳入ShiftLeft函數中,在ShiftLeft函數中*p所代表的可以理解為buf地址中的內容,直接對地址中的內容進行移位,下次讀取buf就是移位后的BUF。
你也可以不用指針,用全局變量也可以,現階段可能好理解一點。
作者: cpu小白白    時間: 2021-7-16 08:59
學單片機的同時,可以把C語言好好學習一下,僅僅使用C51,可能對未來編程影響挺大。有時間還是把C從頭到尾系統的學一遍。我就吃這個虧
作者: 開心就好hhhh    時間: 2021-7-16 09:52
我覺得這注釋已經挺詳細了來著,建議好好學一下C語言的指針
作者: Hephaestus    時間: 2021-7-16 13:37
8051的指令體系就不適合用指針,不信你看看生成的匯編代碼,又笨又丑。
作者: shumivan    時間: 2021-7-16 16:55
*p = *p << 1;右側的*p是吧數據取出來,<<1是將取出的數據左移一位,,*p=是將數據再寫入到指針指向的那個空間內
作者: wwh2382    時間: 2021-7-16 17:20
將buf變量的存放地址以指針的方式傳遞給子程序shiftleft。本來這么簡單的程序用不到指針,用指針反倒讓程序復雜化了。這么做大概是給初學者講解指針的
作者: wfl1314520    時間: 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;  //指針

}
作者: geyobing    時間: 2021-7-16 22:18
&buf是取了buf變量的地址,送入函數ShiftLeft,函數定義成*p,就代表在函數中對指針p的修改將是對該地址內容的修改,而不是把變量內容復制過來。
作者: lsg0280    時間: 2021-11-29 07:24
cpu小白白 發表于 2021-7-16 08:55
&取地址符,讀取變量的地址,*指針,可以把地址中的數據讀出來。
指針指向的就是地址,函數ShiftLeft(unsi ...

說的非常好,受益了。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1