1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
51單片機的P3.2和P3.3口有區別嗎?
[打印本頁]
作者:
wrl123456
時間:
2020-5-15 22:36
標題:
51單片機的P3.2和P3.3口有區別嗎?
proteus仿真里把P3.2設為信號輸入判斷高低電平計數,P3.3為計數啟動鍵這里我想把這兩個鍵對調一下,變為:P3.2啟動鍵,P3.3信號輸入鍵,程序里是外部定義全局變量,把P口改了,但是仿真里好像識別不到P3.3的信號?我的啟動鍵一上一下反而計數值增加了,這是為什么?
程序如下:
sbit k1=P3^2; //sbit在外部定義全局變量 k1啟動鍵
sbit P33=P3^3;
//變量
uint now=0; //計數值
uint set=10;
uint bzbu=0;//設置
uint bz=0;//模式
uint qidong=0;//運行
//顯示控制
void dis()
{
//now
lcd1602_adr(0x0B);
lcd1602_writenumber(0x30+now%10000/1000);
lcd1602_writenumber(0x30+now%1000/100);
lcd1602_writenumber(0x30+now%100/10);
lcd1602_writenumber(0x30+now%10);
//set
lcd1602_adr(0x4B);
lcd1602_writenumber(0x30+set%10000/1000);
lcd1602_writenumber(0x30+set%1000/100);
lcd1602_writenumber(0x30+set%100/10);
lcd1602_writenumber(0x30+set%10);
if(bz==0)lcd1602_writenumber(' ');
if(bz==1)lcd1602_writenumber('<'); //bz為1寫入,為0???沒看懂
//啟動
if(bz==0)
{
if(k1==0)
{qidong=(qidong+1)%2;
if(qidong==1)
{;} //
else {;}
while(k1==0);}
}
//啟動 K1為0 啟動 %取余數
if(qidong==1)
{
if(now>=set){qidong=0;_delay_ms(500); } //蜂鳴器叫,燈關
}
//啟動
}
//按鍵功能函數
void key()
{
//掃描
key_z();
if(keyn1<16)
{
if((keyn1<10)&&(bz==1))
{
if(bzbu==0){set=keyn1;}
if(bzbu==1){set=set*10+keyn1;}
if(bzbu==2){set=set*10+keyn1;}
if(bzbu==3){set=set*10+keyn1;}
bzbu=(bzbu+1)%4;
}
if((keyn1==0x0a)&&(bz==0)){now=0;}//復位
if((keyn1==0x0b)&&(bz==1)){set=0;}//復位輸入
if((keyn1==0x0c)&&(qidong==0)){bz=1;}//設置
if(keyn1==0x0d){bz=0;}//退出
keyn1=16;
}
}
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void SETP_MOTOR_FFW(uchar n)
{
uchar i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
P1 = FFW[j];
DelayMS(25);
dis(); //顯示
key();
}
}
}
void SETP_MOTOR_REV(uchar n)
{
uchar i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
P1 = REV[j];
DelayMS(25);
dis(); //顯示
key();
}
}
}
//-----------------------
void main()
{
uchar N = 3;
_delay_us(10);
_delay_ms(10);
//中斷允許
IT0=1;
EX0=1;
EA=1;
//初始化
lcd1602_init();
LCD1602_string(1,1,zifu0);
LCD1602_string(1,1,zifu0);
LCD1602_string(2,1,zifu1);
while(1)
{
if(K1 == 0)
{
dis(); //顯示
key();
SETP_MOTOR_FFW(N);
}
else if(K2 == 0)
{
dis(); //顯示
key();
SETP_MOTOR_REV(N);
}
else
{
dis(); //顯示
key();
}
}
}
//INT0中斷函數
void EX_INT0() interrupt 0
{
if(qidong==1)
{
_delay_ms(3);if(P33==0)now=now+1;
}
}
1589552934(1).jpg
(2.19 KB, 下載次數: 73)
下載附件
2020-5-15 22:29 上傳
作者:
wrl123456
時間:
2020-5-15 22:59
發現了,是中斷方式那里的問題...
我把中斷方式從0改為1, IT0=1; EX0=1; 改為 IT1=1; EX1=1; ,再把最后void EX_INT0() interrupt 0改為void EX_INT1() interrupt 0
為啥還是不行?
作者:
w254489035
時間:
2020-5-21 15:35
兩個IO共一個中斷向量嗎?如果不是,改了IO口就必須改對應的中斷向量名稱才能進入中斷
作者:
1435哈哈哈
時間:
2020-5-22 08:56
p3.2 3.3和其他IO口沒什么區別,就是它本身多了個中斷的功能,其他引腳怎么接與它無關,你想用中斷功能就把要中斷的外部器件接到它兩其中一個上就好了,然后編寫響應的中斷程序。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1