这是按键无线发射的程序,我加了一个lcd1602,目前是开机就显示一个A。
我想按键按下再显示,应该怎么改,求告知
程序有点长,希望能帮我看一下
小弟感激不尽!!!
- #include "stm32f10x.h"
- #include "public.h"
- #define DATA (GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15)
- #define rs (GPIO_Pin_1)
- #define rw (GPIO_Pin_7)
- #define e (GPIO_Pin_0)
- #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
- #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
- #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
- //IO口地址映射
- #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
- #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
- #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
- #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
- #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
- #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
- #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
- #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
- #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
- #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
- #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
- #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
- #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
- #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
- //IO口操作,只对单一的IO口!
- //确保n的值小于16!
- #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
- #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
- #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
- #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
- #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
- #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
- #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
- #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
- #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
- #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
- #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
- #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
- #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
- #define LED0 PAout(8)
- #define LED1 PDout(12)
- #define J1 PBout(7)
- #define J2 PBout(8)
- unsigned char *P_RXD;//接收数据指针
- unsigned char Num_RXD=0;//要打印字节区位码的字节数
- unsigned char Num_TXD=0;//发送缓冲区的字节数
- unsigned char TxBuffer[256]={0,2,3,};//串口发送缓冲区
- unsigned char RxBuffer[256]; //串口接收缓冲区
- unsigned char Key1_Value=1;
- unsigned char Key2_Value=1;
- unsigned char t;
- void Key_Delay (void)
- {
- unsigned int i;
- for(i=0;i<0xfff;i++);
- }
- void GPIOINIT() //端口初始化
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin=DATA|rs|rw|e;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- // GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//把调试设置普通IO口
- }
- void RCCINIT() //系统初始化
- {
- SystemInit();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- //如果不加这条语句程序显示就会出错,即没有打开端口复用功能的时钟配置
- }
- u8 readbusy() //忙信号检测
- {
- u8 f;
- GPIO_ResetBits(GPIOB,rs);
- GPIO_SetBits(GPIOB,rw);
- GPIO_SetBits(GPIOB,e);
- f=((GPIO_ReadInputData(GPIOB)&0X8000));
- delayms(10);
- GPIO_ResetBits(GPIOB,e);
- return f;
- }
- void lcdwrc(u8 c) //写八位数据
- {
- while(readbusy());
- GPIO_ResetBits(GPIOB,rs);
- GPIO_ResetBits(GPIOB,rw);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- GPIOB->BSRR = c<<8 & 0xf000; //将数据送到P0口
- GPIOB->BRR = ((~c)<<8) & 0xf000;
- delayms(1);
- GPIO_SetBits(GPIOB,e);
- delayms(1);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- }
- void lcdwrc4bit(long c) //写8位数据,通过4个引脚
- {
- while(readbusy());
- GPIO_ResetBits(GPIOB,rs);
- GPIO_ResetBits(GPIOB,rw);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- GPIOB->BSRR = c<<8 & 0xf000; //将数据送到P0口
- GPIOB->BRR = ((~c)<<8) & 0xf000;
- delayms(1);
- GPIO_SetBits(GPIOB,e);
- delayms(1);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- GPIOB->BSRR = c<<12 & 0xf000; //将数据送到P0口
- GPIOB->BRR = ((~c)<<12) & 0xf000;
- delayms(1);
- GPIO_SetBits(GPIOB,e);
- delayms(1);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- }
- void lcdwrd(long dat) //读八位数据通过4个引脚
- {
- while(readbusy());
- GPIO_SetBits(GPIOB,rs);
- GPIO_ResetBits(GPIOB,rw);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- GPIOB->BSRR = dat<<8 & 0xf000; //将数据送到P0口
- GPIOB->BRR = ((~dat)<<8) & 0xf000;
- delayms(1);
- GPIO_SetBits(GPIOB,e);
- delayms(1);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- GPIOB->BSRR = dat<<12 & 0xf000; //将数据送到P0口
- GPIOB->BRR = ((~dat)<<12) & 0xf000;
- delayms(1);
- GPIO_SetBits(GPIOB,e);
- delayms(1);
- GPIO_ResetBits(GPIOB,e);
- delayms(1);
- GPIO_ResetBits(GPIOB,rs);
- }
- void lcdinit() //LCD初始化
- {
- delayms(15);
- lcdwrc4bit(0x32);
- delayms(5);
- lcdwrc4bit(0x28);
- delayms(5);
- lcdwrc4bit(0x08);
- delayms(5);
- lcdwrc4bit(0x01);
- delayms(5);
- lcdwrc4bit(0x06);
- delayms(5);
- lcdwrc4bit(0x0c);
- delayms(5);
- }
- //返回按键值
- //0,没有任何按键按下
- //1,KEY0按下
- //2,KEY1按下
- //3,KEY2按下 WK_UP
- //注意此函数有响应优先级,KEY0>KEY1>KEY2!!
- u8 KEY_Scan(void)
- {
- static u8 key_up=1;//按键按松开标志
- //JTAG_Set(JTAG_SWD_DISABLE);
- if(key_up&&((KEY0 == 0x00)||(KEY1 == 0x00)||(KEY_WK == 0x01)))
- {
- delay_ms(10);//去抖动
- key_up=0;
- if (KEY0 == 0x00) //按键按下:低电平有效
- {
- //JTAG_Set(SWD_ENABLE);
- return 1;
- }
- if (KEY1 == 0x00) //按键按下:低电平有效
- {
- //JTAG_Set(SWD_ENABLE);
- return 2;
- }
- if (KEY_WK == 0x01) //按键按下:高电平有效
- {
- //JTAG_Set(SWD_ENABLE);
- return 3;
- }
- }
- else if((KEY0 == 0x01)&&(KEY1 == 0x01)&&(KEY_WK == 0x00)) key_up=1;
- //JTAG_Set(SWD_ENABLE);
- return 0;// 无按键按下
- }
- /*
- *********************************************************************************************************
- * 函 数 名: LedToggle
- * 功能说明: 翻转指定的LED指示灯。
- * 形 参:_no : 指示灯序号,范围 1 - 4, 0表示全部
- * 返 回 值: 按键代码
- *********************************************************************************************************
- */
- void LedToggle(uint8_t NUM)
- {
- if (NUM == 0)
- {
- LED0^=1;
- LED1^=1;
-
- return;
- }
- NUM--;
- if (NUM == 0)
- {
- LED0^=1;
- }
- else if (NUM == 1)
- {
- LED1^=1;
- }
-
- }
- unsigned char key,mode;
-
- unsigned char tmp_buf[33];
- /**
- * @brief Main program.
- * @param None
- * @retval : None
- */
- int main(void)
- {
- /* Setup STM32 system (clock, PLL and Flash configuration) */
- //uint8_t i =0;
- RCCINIT(); // 系统时钟初始化
- GPIOINIT(); // 端口初始化
- lcdinit(); // 液晶显示初始化
- lcdwrc4bit(0x00+0x80);
- lcdwrd('A');
- SystemInit();
- RCC_Configuration();
- NVIC_Configuration();
- GPIO_Configuration();
- SysTick_init(); //延时初始化
- SPI2_Init(); //初始化SPI硬件口
- P_RXD=RxBuffer; //接收指针指向接收缓冲区
- USART_Configuration(); //USART1配置
- TIM2_Config(); //定时器初始化
- LED0_ON(); //LED亮
- LED0_OFF(); //LED灭
- LED1_ON(); //LED亮
- LED1_OFF(); //LED灭
- NRF24L01_Init(); //初始化NRF24L01
- while(1)
- {
- if(KEY1==0)
- {
- TX_Mode();
- delay_ms(10);
- if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
- {
- tmp_buf[0]=4;
- tmp_buf[1]=5;
- LED1_ON();
- delay_ms(5000);
- LED1_OFF();
- }
- }
-
- }
- }
复制代码
|