標(biāo)題:
lpc177x嵌入式步進(jìn)電機(jī)代碼
[打印本頁]
作者:
你的二狗
時(shí)間:
2018-1-18 19:17
標(biāo)題:
lpc177x嵌入式步進(jìn)電機(jī)代碼
#include "lpc177x_8x.h"
#include "lpc177x_8x_gpio.h"
#include "lpc177x_8x_pinsel.h"
#include "lpc177x_8x_exti.h"
#include "lpc177x_8x_nvic.h"
#include "12864.h"
#include "bsp.h"
uint8_t start_flag=0; /* 2???μ??úμ????ˉ°′?¥±ê???? */
uint8_t stop_flag=0; /* 2???μ??úμ?í£?1°′?¥±ê???? */
void SM_delay(uint8_t m);
void SM_GPIO_Init(void);
void SM_Forward(uint8_t frequent);
void delay(uint8_t m);
void LED_GPIO_Init(void);
void LED(uint8_t i);
void KEY_GPIO_Init(void);
void KEY_GPIO(uint32_t temp);
void EINT0_IRQHandler(void);
void EINT0_Init(void);
void delay1(unsigned int x);
void Clr_Screen(void);
void LCD_Init(void);
void check_busy(void);
void LCD_Wcmd(uint8_t cmd);
void LCD_Wdata(uint8_t data);
void LCD_Write_Str(uint8_t x, uint8_t y, uint8_t *str);
int KeyValue;
uint32_t KEY_HIGH,temp;
#define KEY_HIGH ((LPC_GPIO0->PIN&0x3C0)>>2) /* 讀取按鍵的高四位 */
#define LCD_RS_1() LPC_GPIO2->SET|= (1uL<<13) /* p2.13 H:Data L:Instruction */
#define LCD_RS_0() LPC_GPIO2->CLR|= (1uL<<13)
#define LCD_RW_1() LPC_GPIO1->SET|= (1uL<<26) /* P1.26 H:Read L:Write */
#define LCD_RW_0() LPC_GPIO1->CLR|= (1uL<<26)
#define LCD_E_1() LPC_GPIO1->SET|= (1uL<<27) /* P1.27 H:Enable L:Disable */
#define LCD_E_0() LPC_GPIO1->CLR|= (1uL<<27)
#define LCD_DIR_1() LPC_GPIO1->SET|= (1uL<<29) /* P1.29 S N74LV4245A總線收發(fā)器方向控制位
H: 數(shù)據(jù)由 12864到MCU L: 數(shù)據(jù)由 MCU到 12864 */
#define LCD_DIR_0() LPC_GPIO1->CLR|= (1uL<<29)
const uint32_t LedTable[]={0xFFFE,0xFFFD,0xFFFB,0xFFF7,
0xFFEF,0xFFDF,0xFFBF,0xFF7F,
0xFEFF,0xFDFF,0xFBFF,0xF7FF,
0xFFF8,0xFFC7,0xFE3F,0xF1FF,0xFFFF};
void delay1(uint32_t x) //延時(shí) x ms
{
uint32_t i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void Clr_Screen(void) //清屏函數(shù),注意要經(jīng)常調(diào)用清屏函數(shù),即使在剛剛初始化后;
{
LCD_Wcmd(0x30);
LCD_Wcmd(0x01);
}
void LCD_Init(void) //液晶屏初始化,包括CPU的相關(guān)端口設(shè)置
{
LPC_GPIO1->DIR |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28)); /* 所有管腳配置為數(shù)字輸出 */
LPC_GPIO2->DIR |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));
LPC_GPIO1->SET |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28)); /* 所有管腳配置為數(shù)字輸出 */
LPC_GPIO2->SET |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));
LCD_DIR_0(); /* 數(shù)據(jù)由 MCU到 12864 */
LCD_Wcmd(0x30); //8位MPU接口,默認(rèn)基本指令集,參見12864數(shù)據(jù)手冊
LCD_Wcmd(0x0C); //開顯示,關(guān)光標(biāo),不閃爍
LCD_Wcmd(0x06); //指定在資料寫入或讀取時(shí),光標(biāo)的移動方向
LCD_Wcmd(0x01);
/**************************************************************
基本指令集
4.顯示開關(guān)設(shè)置
LCD_Wcmd(0x08);//整體顯示關(guān) ,不改變內(nèi)存內(nèi)容
LCD_Wcmd(0x0e);//整體顯示開 ,游標(biāo)顯示開,不閃爍
LCD_Wcmd(0x0f);//整體顯示開 ,游標(biāo)顯示開,閃爍
5.游標(biāo)或顯示移位控制,注意是以第一行與第三行連成一線來看的,即分為上下兩屏
LCD_Wcmd(0x10);//游標(biāo)向左移動一個(gè)字
LCD_Wcmd(0x14);//游標(biāo)向右移動一個(gè)字
LCD_Wcmd(0x18);//游標(biāo)不動,屏幕整體左移一個(gè)字
LCD_Wcmd(0x1c);//游標(biāo)不動,屏幕整體右移一個(gè)字
6.功能設(shè)定
LCD_Wcmd(0x34);//RE=1進(jìn)入擴(kuò)充指令集
擴(kuò)充指令集
2.卷動位置
LCD_Wcmd(0x03);//允許垂直滾動地址
3.反白顯示
LCD_Wcmd(0x04);//0X04第一行和第三行反白顯示
LCD_Wcmd(0x05);//0X05第二行和第四行反白顯示
4.睡眠模式
LCD_Wcmd(0x08);//進(jìn)入睡眠模式
LCD_Wcmd(0x0c);//退出睡眠模式
5.繪圖模式
LCD_Wcmd(0x34);//關(guān)閉繪圖模式
LCD_Wcmd(0x36);//打開繪圖模式
***********************************************************************/
}
void SM_Backword(uint8_t frequent)
{LPC_GPIO1->SET|=((1uL<<5)|(1uL<<3)|(1uL<<2));
LPC_GPIO1->CLR|=(1uL<<6);
SM_delay(frequent);
LPC_GPIO1->SET|=((1uL<<5)|(1uL<<3)|(1uL<<6));
LPC_GPIO1->CLR|=(1uL<<2);
SM_delay(frequent);
LPC_GPIO1->SET|=((1uL<<5)|(1uL<<2)|(1uL<<6));
LPC_GPIO1->CLR|=(1uL<<3);
SM_delay(frequent);
LPC_GPIO1->SET|=((1uL<<3)|(1uL<<2)|(1uL<<6));
LPC_GPIO1->CLR|=(1uL<<5);
SM_delay(frequent);
}
void check_busy(void) //檢測忙狀態(tài)
{
LPC_GPIO2->SET |= (1uL<< 7); //DB7狀態(tài)位置1
delay1(1);
LCD_DIR_1(); // SN74LVC4245方向設(shè)置為主芯片接收
LCD_RS_0();
LCD_RW_1(); //讀忙狀態(tài)
delay1(1);
LPC_GPIO2->DIR &= ((0x0<< 0 )&(0x0<< 1 )& (0x0<< 2 )&(0x0<< 3)&(0x0<< 4)& (0x0<< 5)&(0x0<< 6)&(0x0<<7)); //數(shù)據(jù)口設(shè)為輸入
LCD_E_1();
while((LPC_GPIO2->PIN&0x00000080)==0x00000080); //一直等待,直到DB7狀態(tài)位為0;
LCD_E_0();
LPC_GPIO1->DIR |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28)); /* 所有管腳配置為數(shù)字輸出 */
LPC_GPIO2->DIR |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));
LCD_DIR_0();
}
void LCD_Wcmd(uint8_t cmd) //寫命令
{
check_busy();
delay1(1);
LCD_DIR_0();
LCD_RS_0();
LCD_RW_0(); //寫命令
delay1(1);
LCD_E_1();
LPC_GPIO2->MASK=~0x000000FF;
LPC_GPIO2->PIN=cmd; //命令寫到 P2_0~P2_7
LPC_GPIO2->MASK=0;
delay1(50);
LCD_E_0();
delay1(50); //使能的下降沿將信號傳給12864
}
void LCD_Wdata(uint8_t data) //寫數(shù)據(jù),時(shí)序參考PDF
{
check_busy();
LCD_DIR_0();
LCD_RS_1();
LCD_RW_0(); //寫數(shù)據(jù)
LCD_E_1();
LPC_GPIO2->MASK=~0x000000FF;
LPC_GPIO2->PIN=data; //數(shù)據(jù)寫到 P2_0~P2_7
LPC_GPIO2->MASK=0;
delay1(50);
LCD_E_0();
delay1(50); //使能的下降沿將信號傳給12864
}
//注意:中文顯示時(shí)空格符或數(shù)字ASCII碼必需兩個(gè)一起用,標(biāo)點(diǎn)符號注意中英文
void LCD_Write_Str(uint8_t x, uint8_t y, uint8_t *str) //向某行某列寫字符串
{
uint8_t addr;
if(1==x){addr=0x80;}
if(2==x){addr=0x90;}
if(3==x){addr=0x88;}
if(4==x){addr=0x98;}
addr=addr+y;
delay1(1);
LCD_Wcmd(addr);
while(*str)
{
LCD_Wdata(*str);
delay1(35);
str++;
}
}
void delay(uint8_t m) //1ms
{
uint32_t i,j;
for(i=0;i<100*m;i++)
for(j=0;j<200;j++);
}
/* LED初始化,管腳配置為GPIO功能、數(shù)字輸出口、高電平 */
void LED_GPIO_Init(void)
{
LPC_GPIO0->DIR|=((1uL<<27)|(1uL<<17)|(1uL<<18)|(1uL<<19)|(1uL<<28));
LPC_GPIO2->DIR|=(1uL<<25);
LPC_GPIO4->DIR|=((1uL<<26)|(1uL<<27)|(1uL<<30)|(1uL<<31)|(1uL<<22)|(1uL<<21));
LPC_GPIO0->SET|=((1uL<<27)|(1uL<<17)|(1uL<<18)|(1uL<<19)|(1uL<<28));
LPC_GPIO2->SET|=(1uL<<25);
LPC_GPIO4->SET|=((1uL<<26)|(1uL<<27)|(1uL<<30)|(1uL<<31)|(1uL<<22)|(1uL<<21));
}
/* LED點(diǎn)亮 */
void LED(uint8_t i)
{
LPC_GPIO0->MASK&=~0x08000000; //P0_27;屏蔽P0中除P0_27的其他管腳
LPC_GPIO0->PIN=((LedTable[i]&0x00000001)<<27); // 取出LedTable[i]中的第一位賦給P0_27
LPC_GPIO0->MASK=0; //使的P0能正常訪問
LPC_GPIO4->MASK=~0x04000000; //P0.26 同上
LPC_GPIO4->PIN=((LedTable[i]&0x00000002)<<25);
LPC_GPIO4->MASK=0;
LPC_GPIO4->MASK=~0x08000000; //P4.27
LPC_GPIO4->PIN=((LedTable[i]&0x00000004)<<25);
LPC_GPIO4->MASK=0;
LPC_GPIO4->MASK=~0x40000000; //P4.30
LPC_GPIO4->PIN=((LedTable[i]&0x00000008)<<27);
LPC_GPIO4->MASK=0;
LPC_GPIO4->MASK=~0x80000000; //P4.31
LPC_GPIO4->PIN=((LedTable[i]&0x00000010)<<27);
LPC_GPIO4->MASK=0;
LPC_GPIO0->MASK=~0x00020000; //P0.17
LPC_GPIO0->PIN=((LedTable[i]&0x00000020)<<12);
LPC_GPIO0->MASK=0;
LPC_GPIO0->MASK=~0x00040000; //P0.18
LPC_GPIO0->PIN=((LedTable[i]&0x00000040)<<12);
LPC_GPIO0->MASK=0;
LPC_GPIO0->MASK=~0x00080000; //P0.19
LPC_GPIO0->PIN=((LedTable[i]&0x00000080)<<12);
LPC_GPIO0->MASK=0;
LPC_GPIO2->MASK=~0x02000000; //P2.25
LPC_GPIO2->PIN=((LedTable[i]&0x00000100)<<17);
LPC_GPIO2->MASK=0;
LPC_GPIO4->MASK=~0x00400000; //P4.22
LPC_GPIO4->PIN=((LedTable[i]&0x00000200)<<13);
LPC_GPIO4->MASK=0;
LPC_GPIO4->MASK=~0x00200000; //P4.21
LPC_GPIO4->PIN=((LedTable[i]&0x00000400)<<11);
LPC_GPIO4->MASK=0;
LPC_GPIO0->MASK=~0x10000000; //P0.28
LPC_GPIO0->PIN=((LedTable[i]&0x00000800)<<17);
LPC_GPIO0->MASK=0;
}
void KEY_GPIO_Init()
{
LPC_GPIO0->DIR &= ((~(1uL<< 6 ))&(~(1uL<< 7 ))& (~(1uL<< 8 ))&(~(1uL<< 9))); /* P0.6-P0.9 管腳配置為數(shù)字輸入 */
LPC_GPIO0->MASK &= ((~(1uL<< 6 ))&(~(1uL<< 7 ))& (~(1uL<< 8 ))&(~(1uL<< 9)));
LPC_GPIO0->DIR |= ((1uL<< 2)|(1uL<< 3)|(1uL<< 4)|(1uL<<5)); /* P0.2-P0.5 管腳配置為數(shù)字輸出 0 */
LPC_GPIO0->MASK &= ((~(1uL<< 2 ))&(~(1uL<< 3 ))& (~(1uL<< 4 ))&(~(1uL<< 5)));
LPC_GPIO0->CLR |= ((1uL<< 2)|(1uL<< 3)|(1uL<< 4)|(1uL<<5));
}
void KEY_GPIO(uint32_t temp)
{
LPC_GPIO0->DIR &= ((~(1uL<< 6 ))&(~(1uL<< 7 ))& (~(1uL<< 8 ))&(~(1uL<< 9))); /* P0.6-P0.9 管腳配置為數(shù)字輸入 */
LPC_GPIO0->MASK &= ((~(1uL<< 6 ))&(~(1uL<< 7 ))& (~(1uL<< 8 ))&(~(1uL<< 9)));
LPC_GPIO0->DIR |= ((1uL<< 2)|(1uL<< 3)|(1uL<< 4)|(1uL<<5)); /* P0.2-P0.5 管腳配置為數(shù)字輸出1 */
LPC_GPIO0->MASK &= ((~(1uL<< 2 ))&(~(1uL<< 3 ))& (~(1uL<< 4 ))&(~(1uL<< 5)));
LPC_GPIO0->SET |= ((1uL<< 2)|(1uL<< 3)|(1uL<< 4)|(1uL<<5));
LPC_GPIO0->CLR |= (temp<<2);
}
void EINT0_IRQHandler(void)
{
LPC_SC->EXTINT |= (1uL <<0); //清中斷標(biāo)志
NVIC_DisableIRQ(EINT0_IRQn); //關(guān)中斷
KEY_GPIO(0x01); //第1列初始化為
if(KEY_HIGH!=0xf0) //讀取按鍵是否按下
{
delay(10); //延時(shí)10ms進(jìn)行消抖
if(KEY_HIGH!=0xf0) //再次檢測按鍵是否按下
{
switch(KEY_HIGH)
{
case(0xe0): KeyValue=1;break;
case(0xd0): KeyValue=2;break;
case(0xb0): KeyValue=3;break;
case(0x70): KeyValue=4;break;
default: break;
}
while(KEY_HIGH!=0xf0); //按鍵松手檢測
}
}
KEY_GPIO(0x02); //第2列初始化為
if(KEY_HIGH!=0xf0) //讀取按鍵是否按下
{
delay(10); //延時(shí)10ms進(jìn)行消抖
if(KEY_HIGH!=0xf0) //再次檢測按鍵是否按下
{
switch(KEY_HIGH)
{
case(0xe0): KeyValue=5;break;
case(0xd0): KeyValue=6;break;
case(0xb0): KeyValue=7;break;
case(0x70): KeyValue=8;break;
default: break;
}
while(KEY_HIGH!=0xf0); //按鍵松手檢測
}
}
KEY_GPIO(0x04); //第3列初始化為
if(KEY_HIGH!=0xf0) //讀取按鍵是否按下
{
delay(10); //延時(shí)10ms進(jìn)行消抖
if(KEY_HIGH!=0xf0) //再次檢測按鍵是否按下
{
switch(KEY_HIGH)
{
case(0xe0): KeyValue=9;break;
case(0xd0): KeyValue=10;break;
case(0xb0): KeyValue=11;break;
case(0x70): KeyValue=12;break;
default: break;
}
while(KEY_HIGH!=0xf0); //按鍵松手檢測
}
}
KEY_GPIO(0x08); //第4列初始化為
if(KEY_HIGH!=0xf0) //讀取按鍵是否按下
{
delay(10); //延時(shí)10ms進(jìn)行消抖
if(KEY_HIGH!=0xf0) //再次檢測按鍵是否按下
{
switch(KEY_HIGH)
{
case(0xe0): KeyValue=13;break;
case(0xd0): KeyValue=14;break;
case(0xb0): KeyValue=15;break;
case(0x70): KeyValue=16;break;
default: break;
}
while(KEY_HIGH!=0xf0); //按鍵松手檢測
}
}
if(9==KeyValue) {Clr_Screen();LED(8);LCD_Write_Str(1,0," 停止 ");}
if(10==KeyValue) {Clr_Screen();LED(9);LCD_Write_Str(1,0," 10 ");}
if(11==KeyValue) {Clr_Screen();LED(10);LCD_Write_Str(1,0," 11 ");}
if(12==KeyValue) {Clr_Screen();LED(11);LCD_Write_Str(1,0," 12 ");}
if(13==KeyValue) {Clr_Screen();LED(12);LCD_Write_Str(1,0," 13 ");}
if(14==KeyValue) {Clr_Screen();LED(13);LCD_Write_Str(1,0," 14 ");}
if(15==KeyValue) {Clr_Screen();LED(14);LCD_Write_Str(1,0," 15");}
if(16==KeyValue) {Clr_Screen();LED(15);LCD_Write_Str(1,0," 16 ");}
KEY_GPIO_Init();
NVIC_EnableIRQ(EINT0_IRQn);
}
void EINT0_Init(void)
{
LPC_GPIO2->DIR &= ~(1uL<< 10 ); // 配置P2.10 引腳為輸入
LPC_IOCON->P2_10 = 1; // 配置P2.10 引腳為EINT0功能
LPC_SC->EXTINT = 0x0; // 中斷標(biāo)志位
LPC_SC->EXTMODE |= (1 << 0); // 選擇邊沿觸發(fā)方式
LPC_SC->EXTPOLAR &= ~(1<<0); // 選擇下降沿觸發(fā)方式
NVIC_SetPriority(EINT0_IRQn, 1); // 設(shè)置中斷優(yōu)先級
NVIC_EnableIRQ(EINT0_IRQn); // 使能EINT0中斷
}
/*********************************************************************************************************
** Function name: SM_delay
** Descriptions: ?óê±oˉêy
** input parameters: m: ?μ??′ó£??óê±ê±????3¤
** output parameters: ?T
** Returned value: ?T
*********************************************************************************************************/
void SM_delay(uint8_t m)
{
uint32_t i,j;
for(i=0;i<100*m;i++)
for(j=0;j<100;j++);
}
/********************************************************************************
** Descriptions£o SM_GPIO_Init
** Descriptions: 2???μ??ú3?ê??ˉ
** Returned value £o None
*********************************************************************************/
void SM_GPIO_Init(void)
{
LPC_GPIO1->DIR|=((1uL<<2)|(1uL<<3)|(1uL<<5)|(1uL<<6)); /* 2???μ??ú?à1?òy??3?ê??ˉ£?1ü???????aGPIO1|?ü?¢êy×?ê?3??ú */
}
/********************************************************************************
** Descriptions£o SM_Forward
** Descriptions: 2???μ??ú?y×a£???±e??P1.5?¢P1.3?¢P1.4?¢P1.6?3?μ0111?¢1011?¢1101?¢1110;
** Returned value £o None
*********************************************************************************/
void SM_Forward(uint8_t frequent)
{
LPC_GPIO1->SET|=((1uL<<3)|(1uL<<2)|(1uL<<6));
LPC_GPIO1->CLR|=(1uL<<5);
SM_delay(frequent);
LPC_GPIO1->SET|=((1uL<<5)|(1uL<<2)|(1uL<<6));
LPC_GPIO1->CLR|=(1uL<<3);
SM_delay(frequent);
LPC_GPIO1->SET|=((1uL<<5)|(1uL<<3)|(1uL<<6));
LPC_GPIO1->CLR|=(1uL<<2);
SM_delay(frequent);
LPC_GPIO1->SET|=((1uL<<5)|(1uL<<3)|(1uL<<2));
LPC_GPIO1->CLR|=(1uL<<6);
SM_delay(frequent);
}
int main(void)
{LED_GPIO_Init();
KEY_GPIO_Init ();
EINT0_Init();
LCD_Init();
SM_GPIO_Init();
while (1)
{while(1==KeyValue) {Clr_Screen();LCD_Write_Str(1,0," fan");LCD_Write_Str(2,0,"1 ");SM_Forward(50);}
while(5==KeyValue) {Clr_Screen();LCD_Write_Str(1,0," zheng ");LCD_Write_Str(2,0,"1 ");SM_Backword(50);}
while(2==KeyValue) {Clr_Screen();LED(1);LCD_Write_Str(1,0," fan ");LCD_Write_Str(2,0,"2 ");SM_Forward(40);}
while(3==KeyValue) {Clr_Screen();LED(2);LCD_Write_Str(1,0," fan ");LCD_Write_Str(2,0,"3 ");SM_Forward(30);}
while(4==KeyValue) {Clr_Screen();LED(3);LCD_Write_Str(1,0," fan ");LCD_Write_Str(2,0,"4 ");SM_Forward(10);}
while(6==KeyValue) {Clr_Screen();LED(5);LCD_Write_Str(1,0," zheng ");LCD_Write_Str(2,0,"2 ");SM_Backword(40);}
while(7==KeyValue) {Clr_Screen();LED(6);LCD_Write_Str(1,0," zheng ");LCD_Write_Str(2,0,"3");SM_Backword(30);}
while(8==KeyValue) {Clr_Screen();LED(7);LCD_Write_Str(1,0," zheng ");LCD_Write_Str(2,0,"4 ");SM_Backword(10);}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1