調試單片機程序中遇到的c語言指針問題

數碼管顯示HELLO

/*數碼管靜動態顯示,特別注意用C語言寫的左移函數,參考《深度解析C語言中的指針》*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0x76,0x79,0x38,0x38,0x3f};
void display(uchar table[]);
sbit dula=P2^6;
sbit wela=P2^7;
uint num0;
uchar temp;
void moveleft(uchar temp);
uchar x;
void delay(uint z)//z=100爲100ms
{
 uint x,y;
    for(x=z;x>0;x--)
      for(y=123;y>0;y--); 
}
void main()

 temp=0xfe;
 num0=0; 
 while(1)
 { 
  display(table);
 }
}
void display(uchar table[])
{  
    P0=0xff;
 wela=1;
 P0=temp;
 wela=0;
 P0=0xff;
 dula=1;
 P0=table[num0];
 dula=0;
 delay(1);
 num0++;
    moveleft(temp);//注意這個地方的函數的調用
 if(num0==5)
 { 
  num0=0;
  temp=0xfe;
 }

}
void moveleft(uchar temp)//c語言寫的循環左移,形參改變不了實參

 if(temp&0x80)
 {
     temp<<=1;
     temp|=0x01;
 }
 else
 {
     temp<<=1;
 }

單步調試發現是void moveleft(uchar temp),temp根本就沒左移,形參改變不了實參,想用的引用,發現c語言中不能用,是C++的特權。

找到

#include "iostream.h"

void ChangeValue(int* p)//int*與*是兩個不同的概念
{
 *p=4;//
}
int main()
{
 int a;
 a=2;
 cout<<a<<endl;
 ChangeValue(&a);
 cout<<"after change a="<<a<<endl;

調試 用指針來修改

最後程序

/*用數碼管顯示HELL0,選用《L:\流動區\FFDZ-51\工具軟件》裏面的《單片機使用工具.exe》
查詢字母的數碼字形生成*/
/*數碼管靜動態顯示,特別注意用C語言寫的左移函數,參考《深度解析C語言中的指針》*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0x76,0x79,0x38,0x38,0x3f};
void display(uchar table[]);
sbit dula=P2^6;
sbit wela=P2^7;
uint num0;
uchar temp;
void moveleft(uchar *temp);
uchar x;
void delay(uint z)//z=100爲100ms
{
 uint x,y;
    for(x=z;x>0;x--)
      for(y=123;y>0;y--); 
}
void main()

 temp=0xfe;
 num0=0; 
 while(1)
 { 
  display(table);
 }
}
void display(uchar table[])
{  
    P0=0xff;
 wela=1;
 P0=temp;
 wela=0;
 P0=0xff;
 dula=1;
 P0=table[num0];
 dula=0;
 delay(1);
 num0++;
    moveleft(&temp);//注意這個地方的函數的調用
 if(num0==5)
 { 
  num0=0;
  temp=0xfe;
 }

}
void moveleft(uchar *temp)//c語言寫的循環左移,形參改變不了實參

 if((*temp)&0x80)
 {
     (*temp)<<=1;
     (*temp)|=0x01;
 }
 else
 {
     (*temp)<<=1;
 }
}
/*  c語言寫的循環左移解釋
#include "iostream.h"

void ChangeValue(int* p)//int*與*是兩個不同的概念
{
 *p=4;//
}
int main()
{
 int a;
 a=2;
 cout<<a<<endl;
 ChangeValue(&a);
 cout<<"after change a="<<a<<endl;
}
*/

小結:

1.形參修改實參的問題知道,也用過,不過真正動起手來,就出問題了,動手

2.c語言與c++的區別,以後要注意了

3.開始對int *p=& temp,&temp是取temp的地址,*p是地址的內容,爲什麼中間是等號不太理解。後來發現(int*)p是用int*來定義p這個地址*表示p爲指針變量int表示這個指針變量是一整形,p代表地址與&temp的地址之間的關係,也對int *與*的概念有了一定了解

最後希望在csdn上多認識一些朋友,技術上的非技術上的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章