- #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總線收發器方向控制位
- H: 數據由 12864到MCU L: 數據由 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) //延時 x ms
- {
- uint32_t i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Clr_Screen(void) //清屏函數,注意要經常調用清屏函數,即使在剛剛初始化后;
- {
- LCD_Wcmd(0x30);
- LCD_Wcmd(0x01);
- }
- void LCD_Init(void) //液晶屏初始化,包括CPU的相關端口設置
- {
- LPC_GPIO1->DIR |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28)); /* 所有管腳配置為數字輸出 */
- 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)); /* 所有管腳配置為數字輸出 */
- LPC_GPIO2->SET |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));
- LCD_DIR_0(); /* 數據由 MCU到 12864 */
-
- LCD_Wcmd(0x30); //8位MPU接口,默認基本指令集,參見12864數據手冊
- LCD_Wcmd(0x0C); //開顯示,關光標,不閃爍
- LCD_Wcmd(0x06); //指定在資料寫入或讀取時,光標的移動方向
- LCD_Wcmd(0x01);
-
- /**************************************************************
- 基本指令集
- 4.顯示開關設置
- LCD_Wcmd(0x08);//整體顯示關 ,不改變內存內容
- LCD_Wcmd(0x0e);//整體顯示開 ,游標顯示開,不閃爍
- LCD_Wcmd(0x0f);//整體顯示開 ,游標顯示開,閃爍
- 5.游標或顯示移位控制,注意是以第一行與第三行連成一線來看的,即分為上下兩屏
- LCD_Wcmd(0x10);//游標向左移動一個字
- LCD_Wcmd(0x14);//游標向右移動一個字
- LCD_Wcmd(0x18);//游標不動,屏幕整體左移一個字
- LCD_Wcmd(0x1c);//游標不動,屏幕整體右移一個字
- 6.功能設定
- LCD_Wcmd(0x34);//RE=1進入擴充指令集
- 擴充指令集
- 2.卷動位置
- LCD_Wcmd(0x03);//允許垂直滾動地址
- 3.反白顯示
- LCD_Wcmd(0x04);//0X04第一行和第三行反白顯示
- LCD_Wcmd(0x05);//0X05第二行和第四行反白顯示
- 4.睡眠模式
- LCD_Wcmd(0x08);//進入睡眠模式
- LCD_Wcmd(0x0c);//退出睡眠模式
- 5.繪圖模式
- LCD_Wcmd(0x34);//關閉繪圖模式
- 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) //檢測忙狀態
- {
- LPC_GPIO2->SET |= (1uL<< 7); //DB7狀態位置1
- delay1(1);
- LCD_DIR_1(); // SN74LVC4245方向設置為主芯片接收
- LCD_RS_0();
- LCD_RW_1(); //讀忙狀態
- delay1(1);
- LPC_GPIO2->DIR &= ((0x0<< 0 )&(0x0<< 1 )& (0x0<< 2 )&(0x0<< 3)&(0x0<< 4)& (0x0<< 5)&(0x0<< 6)&(0x0<<7)); //數據口設為輸入
- LCD_E_1();
- while((LPC_GPIO2->PIN&0x00000080)==0x00000080); //一直等待,直到DB7狀態位為0;
- LCD_E_0();
- LPC_GPIO1->DIR |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28)); /* 所有管腳配置為數字輸出 */
- 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) //寫數據,時序參考PDF
- {
- check_busy();
- LCD_DIR_0();
- LCD_RS_1();
- LCD_RW_0(); //寫數據
-
- LCD_E_1();
- LPC_GPIO2->MASK=~0x000000FF;
- LPC_GPIO2->PIN=data; //數據寫到 P2_0~P2_7
- LPC_GPIO2->MASK=0;
- delay1(50);
- LCD_E_0();
- delay1(50); //使能的下降沿將信號傳給12864
- }
- //注意:中文顯示時空格符或數字ASCII碼必需兩個一起用,標點符號注意中英文
- 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功能、數字輸出口、高電平 */
- 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點亮 */
- 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 管腳配置為數字輸入 */
- 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 管腳配置為數字輸出 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 管腳配置為數字輸入 */
- 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 管腳配置為數字輸出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); //清中斷標志
- NVIC_DisableIRQ(EINT0_IRQn); //關中斷
- KEY_GPIO(0x01); //第1列初始化為
- if(KEY_HIGH!=0xf0) //讀取按鍵是否按下
- {
- delay(10); //延時10ms進行消抖
- 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); //延時10ms進行消抖
- 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); //延時10ms進行消抖
- 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); //延時10ms進行消抖
- 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; // 中斷標志位
- LPC_SC->EXTMODE |= (1 << 0); // 選擇邊沿觸發方式
- LPC_SC->EXTPOLAR &= ~(1<<0); // 選擇下降沿觸發方式
- NVIC_SetPriority(EINT0_IRQn, 1); // 設置中斷優先級
- 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);}
- }
- }
復制代碼 |