- #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);}
- }
- }
复制代码 |