找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2005|回复: 12
打印 上一主题 下一主题
收起左侧

谁能帮我看一下stm32按键无线发射的程序,各位大佬帮下忙!

[复制链接]
回帖奖励 30 黑币 回复本帖可获得 6 黑币奖励! 每人限 2 次
跳转到指定楼层
楼主
ID:312859 发表于 2018-5-31 08:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是按键无线发射的程序,我加了一个lcd1602,目前是开机就显示一个A。
我想按键按下再显示,应该怎么改,求告知
程序有点长,希望能帮我看一下
小弟感激不尽!!!

  1. #include "stm32f10x.h"
  2. #include "public.h"
  3. #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)
  4. #define rs (GPIO_Pin_1)
  5. #define rw (GPIO_Pin_7)
  6. #define e (GPIO_Pin_0)

  7. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  8. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  9. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

  10. //IO口地址映射
  11. #define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
  12. #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
  13. #define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
  14. #define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
  15. #define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
  16. #define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
  17. #define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   
  18. #define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
  19. #define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
  20. #define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
  21. #define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
  22. #define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
  23. #define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
  24. #define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

  25. //IO口操作,只对单一的IO口!
  26. //确保n的值小于16!
  27. #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
  28. #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入
  29. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
  30. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入
  31. #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出
  32. #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入
  33. #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出
  34. #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入
  35. #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
  36. #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入
  37. #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出
  38. #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入
  39. #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出
  40. #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入


  41. #define LED0  PAout(8)
  42. #define LED1  PDout(12)
  43. #define J1  PBout(7)
  44. #define J2  PBout(8)

  45. unsigned char *P_RXD;//接收数据指针
  46. unsigned char Num_RXD=0;//要打印字节区位码的字节数
  47. unsigned char Num_TXD=0;//发送缓冲区的字节数

  48. unsigned char TxBuffer[256]={0,2,3,};//串口发送缓冲区
  49. unsigned char RxBuffer[256]; //串口接收缓冲区
  50. unsigned char Key1_Value=1;
  51. unsigned char Key2_Value=1;
  52. unsigned char t;

  53. void Key_Delay (void)
  54. {
  55. unsigned int i;

  56. for(i=0;i<0xfff;i++);


  57. }
  58. void GPIOINIT()   //端口初始化
  59. {
  60. GPIO_InitTypeDef GPIO_InitStructure;
  61. GPIO_InitStructure.GPIO_Pin=DATA|rs|rw|e;
  62. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  63. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  64. GPIO_Init(GPIOB,&GPIO_InitStructure);
  65. // GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//把调试设置普通IO口
  66. }
  67. void RCCINIT() //系统初始化
  68. {
  69. SystemInit();
  70. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  71.     //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  72. //如果不加这条语句程序显示就会出错,即没有打开端口复用功能的时钟配置
  73. }
  74. u8 readbusy() //忙信号检测
  75. {  
  76. u8 f;
  77. GPIO_ResetBits(GPIOB,rs);  
  78. GPIO_SetBits(GPIOB,rw);
  79. GPIO_SetBits(GPIOB,e);
  80. f=((GPIO_ReadInputData(GPIOB)&0X8000));
  81. delayms(10);
  82. GPIO_ResetBits(GPIOB,e);
  83. return f;  
  84. }
  85. void lcdwrc(u8 c)   //写八位数据
  86. {
  87. while(readbusy());
  88. GPIO_ResetBits(GPIOB,rs);  
  89. GPIO_ResetBits(GPIOB,rw);
  90. GPIO_ResetBits(GPIOB,e);
  91. delayms(1);
  92. GPIOB->BSRR = c<<8 & 0xf000;  //将数据送到P0口
  93.     GPIOB->BRR = ((~c)<<8) & 0xf000;
  94. delayms(1);
  95. GPIO_SetBits(GPIOB,e);
  96. delayms(1);
  97. GPIO_ResetBits(GPIOB,e);
  98. delayms(1);
  99. }
  100. void lcdwrc4bit(long c)    //写8位数据,通过4个引脚
  101. {
  102. while(readbusy());
  103. GPIO_ResetBits(GPIOB,rs);  
  104. GPIO_ResetBits(GPIOB,rw);
  105. GPIO_ResetBits(GPIOB,e);
  106. delayms(1);
  107. GPIOB->BSRR = c<<8 & 0xf000;  //将数据送到P0口
  108.     GPIOB->BRR = ((~c)<<8) & 0xf000;
  109. delayms(1);
  110. GPIO_SetBits(GPIOB,e);
  111. delayms(1);
  112. GPIO_ResetBits(GPIOB,e);
  113. delayms(1);
  114. GPIOB->BSRR = c<<12 & 0xf000;  //将数据送到P0口
  115.     GPIOB->BRR = ((~c)<<12) & 0xf000;
  116. delayms(1);
  117. GPIO_SetBits(GPIOB,e);
  118. delayms(1);
  119. GPIO_ResetBits(GPIOB,e);
  120. delayms(1);
  121. }
  122. void lcdwrd(long dat)   //读八位数据通过4个引脚
  123. {
  124. while(readbusy());  
  125. GPIO_SetBits(GPIOB,rs);  
  126. GPIO_ResetBits(GPIOB,rw);
  127. GPIO_ResetBits(GPIOB,e);
  128. delayms(1);
  129. GPIOB->BSRR = dat<<8 & 0xf000;  //将数据送到P0口
  130.     GPIOB->BRR = ((~dat)<<8) & 0xf000;
  131. delayms(1);
  132. GPIO_SetBits(GPIOB,e);
  133. delayms(1);
  134. GPIO_ResetBits(GPIOB,e);
  135. delayms(1);
  136. GPIOB->BSRR = dat<<12 & 0xf000;  //将数据送到P0口
  137.     GPIOB->BRR = ((~dat)<<12) & 0xf000;
  138. delayms(1);
  139. GPIO_SetBits(GPIOB,e);
  140. delayms(1);
  141. GPIO_ResetBits(GPIOB,e);
  142. delayms(1);
  143. GPIO_ResetBits(GPIOB,rs);
  144. }
  145. void lcdinit()      //LCD初始化
  146. {
  147. delayms(15);
  148. lcdwrc4bit(0x32);
  149. delayms(5);
  150. lcdwrc4bit(0x28);
  151. delayms(5);
  152. lcdwrc4bit(0x08);
  153. delayms(5);
  154. lcdwrc4bit(0x01);
  155. delayms(5);
  156. lcdwrc4bit(0x06);
  157. delayms(5);
  158. lcdwrc4bit(0x0c);
  159. delayms(5);
  160. }

  161. //返回按键值
  162. //0,没有任何按键按下
  163. //1,KEY0按下
  164. //2,KEY1按下
  165. //3,KEY2按下 WK_UP
  166. //注意此函数有响应优先级,KEY0>KEY1>KEY2!!
  167. u8 KEY_Scan(void)
  168. {  
  169. static u8 key_up=1;//按键按松开标志
  170. //JTAG_Set(JTAG_SWD_DISABLE);
  171. if(key_up&&((KEY0 == 0x00)||(KEY1 == 0x00)||(KEY_WK == 0x01)))
  172.   {
  173.   delay_ms(10);//去抖动
  174.   key_up=0;
  175.   if (KEY0 == 0x00)  //按键按下:低电平有效
  176.    {
  177.    //JTAG_Set(SWD_ENABLE);
  178.    return 1;
  179.    }
  180.   if (KEY1 == 0x00)  //按键按下:低电平有效
  181.    {
  182.    //JTAG_Set(SWD_ENABLE);
  183.    return 2;
  184.    }
  185.   if (KEY_WK == 0x01)  //按键按下:高电平有效
  186.    {
  187.    //JTAG_Set(SWD_ENABLE);
  188.    return 3;
  189.    }
  190.   }
  191.   else if((KEY0 == 0x01)&&(KEY1 == 0x01)&&(KEY_WK == 0x00)) key_up=1;      
  192. //JTAG_Set(SWD_ENABLE);
  193. return 0;// 无按键按下
  194. }


  195. /*
  196. *********************************************************************************************************
  197. * 函 数 名: LedToggle
  198. * 功能说明: 翻转指定的LED指示灯。
  199. * 形    参:_no : 指示灯序号,范围 1 - 4, 0表示全部
  200. * 返 回 值: 按键代码
  201. *********************************************************************************************************
  202. */
  203. void LedToggle(uint8_t NUM)
  204. {
  205. if (NUM == 0)
  206. {
  207.   LED0^=1;
  208.   LED1^=1;
  209.   
  210.   return;
  211. }

  212. NUM--;

  213. if (NUM == 0)
  214. {
  215.   LED0^=1;
  216. }
  217. else if (NUM == 1)
  218. {
  219.   LED1^=1;
  220. }
  221.    
  222. }

  223. unsigned char  key,mode;
  224.    
  225. unsigned char tmp_buf[33];
  226. /**
  227.   * @brief  Main program.
  228.   * @param  None
  229.   * @retval : None
  230.   */
  231. int main(void)
  232. {
  233.   /* Setup STM32 system (clock, PLL and Flash configuration) */
  234.    //uint8_t i =0;

  235.   RCCINIT();   //  系统时钟初始化
  236. GPIOINIT();   //  端口初始化
  237. lcdinit(); //   液晶显示初始化

  238. lcdwrc4bit(0x00+0x80);

  239.   lcdwrd('A');

  240. SystemInit();
  241.   RCC_Configuration();
  242.   NVIC_Configuration();
  243.   GPIO_Configuration();
  244.   SysTick_init();         //延时初始化
  245.   SPI2_Init();           //初始化SPI硬件口
  246. P_RXD=RxBuffer;      //接收指针指向接收缓冲区
  247.   USART_Configuration();   //USART1配置
  248.   TIM2_Config();      //定时器初始化  
  249. LED0_ON();        //LED亮
  250.   LED0_OFF();        //LED灭
  251. LED1_ON();        //LED亮
  252.   LED1_OFF();        //LED灭
  253. NRF24L01_Init();       //初始化NRF24L01

  254.      while(1)
  255.    {      
  256.         if(KEY1==0)
  257.       {           
  258.        TX_Mode();
  259.        delay_ms(10);   
  260.       if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
  261.      {                     
  262.             tmp_buf[0]=4;
  263.         tmp_buf[1]=5;
  264.         LED1_ON();
  265.      delay_ms(5000);
  266.      LED1_OFF();
  267.      }
  268.      }
  269.    
  270.    }
  271.    }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330198 发表于 2018-5-31 09:37 | 只看该作者
把lcdwrd('A'); 这句移到if(KEY1==0)里面
回复

使用道具 举报

板凳
ID:312859 发表于 2018-5-31 11:41 | 只看该作者
zhanghyg 发表于 2018-5-31 09:37
把lcdwrd('A'); 这句移到if(KEY1==0)里面

移进去就不显示了,不管括号了写啥,都显示小写的g
回复

使用道具 举报

地板
ID:330198 发表于 2018-5-31 15:23 | 只看该作者
LCD的子程序你还少了一个,你初始化的命令也有点问题,建议对照51的程序修改
回复

使用道具 举报

5#
ID:342312 发表于 2018-5-31 17:05 | 只看该作者
没有lcd1602的手册,怎么看呢?
回复

使用道具 举报

6#
ID:342317 发表于 2018-5-31 17:11 | 只看该作者
very  good!
回复

使用道具 举报

7#
ID:342326 发表于 2018-5-31 17:22 | 只看该作者
初始化好像有点问题吧
回复

使用道具 举报

8#
ID:342370 发表于 2018-5-31 18:30 | 只看该作者
初始化的问题,会不会把显示关了
回复

使用道具 举报

9#
ID:342266 发表于 2018-5-31 22:35 | 只看该作者
初始化的问题
回复

使用道具 举报

10#
ID:312859 发表于 2018-6-1 09:39 | 只看该作者
zhanghyg 发表于 2018-5-31 15:23
LCD的子程序你还少了一个,你初始化的命令也有点问题,建议对照51的程序修改

好的,谢谢
回复

使用道具 举报

11#
ID:312859 发表于 2018-6-1 09:40 | 只看该作者

好的,谢谢
回复

使用道具 举报

12#
ID:342652 发表于 2018-6-1 09:43 | 只看该作者
你的初始化有问题,LCD里跳转也有问题
回复

使用道具 举报

13#
ID:342755 发表于 2018-6-1 11:15 | 只看该作者
大佬能给个lcd1602和ds1302芯片的源码吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表