欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機矩陣鍵盤控制步進電機到達設定步距角 程序有問題 求幫助
[打印本頁]
作者:
哈哈151-
時間:
2021-4-8 20:32
標題:
單片機矩陣鍵盤控制步進電機到達設定步距角 程序有問題 求幫助
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar display_digit[]={0,0,0};
uchar code run[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//A→AB→B→BC→C→CD→D→DA→A
uchar disbuf[4]={0,0,0,0};
uchar code LED_0F[] =
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x63
};
unsigned char K_Value=0;
unsigned int key_temp1=0;
unsigned int jiaodu=0;
uchar num1=0,num2=0,num3=0,num4=0,leiji=0;
sbit DIO = P0^1; //串行數據輸入
sbit RCLK = P0^2; //時鐘脈沖信號——上升沿有效
sbit SCLK = P0^0; //打入信號————上升沿有效
bit Flag = 0;
// 全局變量
uchar LED[8]; //用于LED的8位顯示緩存
void delay(uint time)
{
uint x,y;
for(x=time;x>0;x--)
for(y=110;y>0;y--);
}
void LED_OUT(uchar X)
{
uchar i;
for(i=8;i>=1;i--)
{
if (X&0x80) DIO=1; else DIO=0;
X<<=1;
SCLK = 0;
SCLK = 1;
}
}
/**************************************************************************************
* 描 述 : LED顯示函數
* 入 參 : 無
* 返回值 : 無
**************************************************************************************/
void LED8_Display (void)
{
uchar *led_table; // 查表指針
uchar i;
//顯示第1位
led_table = LED_0F + LED[0];
i = *led_table;
LED_OUT(i);
LED_OUT(0xfe);
RCLK = 0;
RCLK = 1;
//顯示第2位
led_table = LED_0F + LED[1];
i = *led_table;
LED_OUT(i);
LED_OUT(0xfd);
RCLK = 0;
RCLK = 1;
//顯示第3位
led_table = LED_0F + LED[2];
i = *led_table;
LED_OUT(i);
LED_OUT(0xfb);
RCLK = 0;
RCLK = 1;
//顯示第4位
led_table = LED_0F + LED[3];
i = *led_table;
LED_OUT(i);
LED_OUT(0xf7);
RCLK = 0;
RCLK = 1;
//顯示第6位
led_table = LED_0F + LED[5];
i = *led_table;
LED_OUT(i);
LED_OUT(0xdf);
RCLK = 0;
RCLK = 1;
//顯示第7位
led_table = LED_0F + LED[6];
i = *led_table;
LED_OUT(i);
LED_OUT(0xbf);
RCLK = 0;
RCLK = 1;
//顯示第8位
led_table = LED_0F + LED[7];
i = *led_table;
LED_OUT(i);
LED_OUT(0x7f);
RCLK = 0;
RCLK = 1;
}
void zheng()
{
static uchar i=0,k;
if(Flag == 1)
{
if(jiaodu<key_temp1)
{
while(jiaodu<key_temp1)
{
while(i<8)
{
P2=run[i];
delay(15);//轉速調節
if(++k>=2)//1個脈沖轉一個步距角
{
k = 0;
++jiaodu;
if(jiaodu >= key_temp1)break;
}
if(++i>=8)i=0;
}
}
k = 0;
if(i>=8)i=0;
while(i<8)
{
if(++i>=8)i=0;
P2=run[i];
delay(15);//轉速調節
if(++k>=2)//1個脈沖轉一個步距角
{
k = 0;
break;
}
}
}
else if(jiaodu > key_temp1)
{
while(jiaodu > key_temp1)
{
while(i>=0)
{
P2=run[i];
delay(15);//轉速調節
if(++k >= 2)//1個脈沖轉一個步距角
{
k = 0;
--jiaodu;
if(jiaodu <= key_temp1)break;
}
if(i-- <= 0)i=7;
}
}
k = 0;
if(i < 0)i = 7;
while(i < 8)
{
if(i-- <= 0)i=7;
P2=run[i];
delay(15);//轉速調節
if(++k>=2)//1個脈沖轉一個步距角
{
k = 0;
break;
}
}
}
leiji=0;num2=0;num3=0;num4=0;
Flag = 0;
}
}
void Init_Timer0(void)
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x30; //設置定時初值
TH0 = 0xF8; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1; //定時器中斷打開
EA=1; //總中斷打開
}
/******按鍵值處理函數********/
void key(void)
{
switch(K_Value)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
num4=num3;
num3=num2;
num2=K_Value;
leiji++;//記錄按下的次數
key_temp1=num4*100+num3*10+num2;
break;
case 10://R
break;
case 11://L
break;
case 12://ENTER
if(key_temp1)
Flag = 1;
break;
}
}
void main()
{
Init_Timer0();
while(1)
{
LED[0]=key_temp1/100%10;
LED[1]=key_temp1/10%10;
LED[2]=key_temp1%10;;
LED[3]=10;
LED[5]=jiaodu/100%10;
LED[6]=jiaodu/10%10;
LED[7]=jiaodu%10;
zheng();
if(leiji>2)//按下的次數大于3次時清零十位百位
{leiji=0;num2=0;num3=0;num4=0;}
}
}
void T0_OverFlow(void) interrupt 1 //定時器0溢出中斷,2ms進入一次
{
static uint cnt = 0;
static uchar key_zt = 0;
unsigned char X,Y,Z;
TH0 = 0xf8; //12m 2000
TL0 = 0x30;
if(++cnt >= 5)
{
P1=0xff;
_nop_();_nop_();_nop_();
cnt = 0;
P1=0x0f;
switch(key_zt)
{
case 0:
if(P1!=0x0f)
key_zt = 1;
else K_Value = 100;
break;
case 1:
if(P1!=0x0f)
{
key_zt = 2;
X=P1; //保存行掃描時有鍵按下時狀態
P1=0xf0; //列掃描
Y=P1; //保存列掃描時有鍵按下時狀態
Z=X|Y; //取出鍵值
/*********************************************************************/
switch ( Z ) //判斷鍵值(那一個鍵按下)
{
case 0xee: K_Value=0; break; //對鍵值賦值
case 0xed: K_Value=1; break;
case 0xeb: K_Value=2; break;
case 0xe7: K_Value=3; break;
case 0xde: K_Value=4; break;
case 0xdd: K_Value=5; break;
case 0xdb: K_Value=6; break;
case 0xd7: K_Value=7; break;
case 0xbe: K_Value=8; break;
case 0xbd: K_Value=9; break;
case 0xbb: K_Value=10;break;
case 0xb7: K_Value=11;break;
case 0x7e: K_Value=12;break;
case 0x7d: K_Value=13;break;
case 0x7b: K_Value=14;break;
case 0x77: K_Value=15;break;
}
key();
}
else
{
K_Value = 100;
key_zt = 0;
}
case 2:
if(P1 == 0x0f)
key_zt = 0;
break;
}
}
LED8_Display(); //4位數碼管顯示:4 3 2 1
}
復制代碼
程序無法編譯,仿真也不能運行,求大神指點:
矩陣鍵盤控制步進電機到達設定步距角.rar
(147.17 KB, 下載次數: 5)
2021-4-8 20:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1