OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8755|回复: 5

STM32F103C8T6核心板 + LCD12864 +矩阵键盘 实现汉字字符显示(暂停,继续,翻页,卷动)()

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2021-4-6
在线时间
17 小时
发表于 2021-4-14 11:23:19 | 显示全部楼层 |阅读模式
1金钱
有没有大神 帮我看看我的代码  ,目前实现卷动(看CSDN的讲解实现的),现在卡在了翻页功能上(自我感觉没问题,可下载到板子上,就按键不翻页了 )。我的思路是:先显示一个屏幕,然后收到来自外中断(PA.11)的信号(由GPIO口的读取该引脚的电平值),然后实现翻页。
  1. void  KEY_EXTI_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         EXTI_InitTypeDef EXTI_InitStructure;
  5.         NVIC_InitTypeDef NVIC_InitStructure;
  6.        
  7.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE ); //外部中断,需要使能AFIO时钟
  8.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );        //使能PA端口时钟
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        //端口配置
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入
  11.                                                                                                                                                                 //        按键可简单分为两种 接GND和接VCC,分别对用上拉输入和下拉输入
  12.                                                                                                                                                                 //        即:
  13.                                                                                                                                                                 //        上拉输入 默认为H,按键按下拉低 IO+按键+GND 下降沿触发
  14.                                                                                                                                                                 //        下拉输入 默认位L,按键按下拉高 IO+按键+VCC 上升沿触发
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);//根据设定参数初始化GPIOA
  16.        
  17.         EXTI_ClearITPendingBit(EXTI_Line11);                                         //清除 EXTI 11 线路挂起位
  18.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11); //选择 GPIO A .11管脚用作外部中断线路
  19.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //                设置 EXTI 线路为  中断请求
  20.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //        设置输入线路上升沿为中断请求
  21.         EXTI_InitStructure.EXTI_Line = EXTI_Line11 ; //                EXTI_Line 选择了待使能或者失能的外部线路
  22.         EXTI_InitStructure.EXTI_LineCmd = ENABLE; //               
  23.         EXTI_Init(&EXTI_InitStructure);                //初始化中断
  24.        
  25.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  26.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//使能外部中断通道
  27.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级2  因为为分组为2 这里可以设置为0-3
  28.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级0
  29.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  30.         NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  31. }


  32. void PageDown_12864(u8 *ser)
  33. {
  34.         u8 i,addr,over,*ptdat;
  35.         ptdat = ser; //获得字符串首地址
  36.         over = 0; //写入空字符串(写完字符串后)数目初始化为0

  37.         while(1){
  38.         write_com(0x80); //写第一行字符
  39.         for(i = 0; i < 16; i++)
  40.         {
  41.                 if(*ptdat != '\0')
  42.                         {
  43.                         write_data(*ptdat++);
  44.                         }
  45.                 else{
  46.                         SandByte(0x20);
  47.                         over++;
  48.                                 }
  49.         }
  50.        
  51.         write_com(0x90); //写第二行字符
  52.         for(i = 0; i < 16; i++)
  53.         {
  54.                 if(*ptdat != '\0')
  55.                         {
  56.                         write_data(*ptdat++);
  57.                         }
  58.                 else{
  59.                         SandByte(0x20);
  60.                         over++;
  61.                                 }
  62.         }
  63.        
  64.         write_com(0x88); //写第三行字符
  65.         for(i = 0; i < 16; i++)
  66.         {
  67.                 if(*ptdat != '\0')
  68.                         {
  69.                         write_data(*ptdat++);
  70.                         }
  71.                 else{
  72.                         SandByte(0x20);
  73.                         over++;
  74.                                 }
  75.         }
  76.        
  77.         write_com(0x98); //写第四行字符
  78.         for(i = 0; i < 16; i++)
  79.         {
  80.                 if(*ptdat != '\0')
  81.                         {
  82.                         write_data(*ptdat++);
  83.                         }
  84.                 else{
  85.                         SandByte(0x20);
  86.                         over++;
  87.                                 }
  88.         }       
  89.         if(Page_Down==0)           //  这里是宏定义   #define Page_Down  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)    且取得该引脚电平值
  90.         {
  91.                            ptdat = ptdat - 64; //     地址回到首地址
  92.                         delay_ms(8000);
  93.         }
  94.         else
  95.                 {
  96.                                 ptdat = ptdat + 64;
  97.                 }
  98.         }
  99. }
复制代码


temple2__V0.0.zip

5.7 MB, 下载次数: 264

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2021-4-6
在线时间
17 小时
 楼主| 发表于 2021-4-15 13:22:31 | 显示全部楼层
最后的这句代码注释掉,忘了注释掉  请大佬帮我看看
        else
                {
                                ptdat = ptdat + 64;
                }
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-4-15 13:27:28 | 显示全部楼层
楼主按键按下是低电平还是高电平?
楼主觉得 ptdat = ptdat - 64 不会溢出?
显示正常?
专治疑难杂症
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2021-4-6
在线时间
17 小时
 楼主| 发表于 2021-4-15 13:38:41 | 显示全部楼层
LcwSwust 发表于 2021-4-15 13:27
楼主按键按下是低电平还是高电平?
楼主觉得 ptdat = ptdat - 64 不会溢出?
显示正常?

感谢 你的帮助  我是 下拉输入 (默认位L,按键按下拉高 IO+按键+VCC 上升沿触发)高电平
这一句代码我想的是,前面的代码还会让 ptdat的地址增加64,如果没有按下Page_Down==0就成立,并且让ptdat地址回到首地址。
显示是正常显示的,不过就是按键按下去不会显示后面的字符。就一直没反应。
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-4-15 13:56:20 | 显示全部楼层
独自去偷崽 发表于 2021-4-15 13:38
感谢 你的帮助  我是 下拉输入 (默认位L,按键按下拉高 IO+按键+VCC 上升沿触发)高电平
这一句代码我 ...

千万不要说“没反应”,比如判断程序是否运行到某个位置就可以在里面加一条IO翻转或向串口发送一个数据,或直接发送ptdat 的值,串口调试助手查看数据。
再试一下把93行到101行的代码全注释掉。
专治疑难杂症
回复

使用道具 举报

5

主题

312

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2018-11-28
在线时间
226 小时
发表于 2022-11-8 15:06:49 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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