OpenEdv-开源电子网

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

一个很奇怪的问题?12864程序,要加个EXTIX_Init();才好用,不然是乱七八糟的东西

[复制链接]

23

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-7
在线时间
0 小时
发表于 2014-2-26 14:32:32 | 显示全部楼层 |阅读模式
1.    我看了下EXTIX_Init();中的,好像没跟12864显示有关啊!不知道有谁知道?这个程序是网上下的,自己改过了的。2.   “//注意,此代码还是无法进行SWD仿真!因为使用了中断,没法用普通的方法来考虑间歇复用SWD口!”作者这句话怎么理解,那要怎么改才能仿真。
12864.c中的
#include "delay.h" 
#include "12864.h"
#define uchar unsigned char //为了可移植性好,对这两个 STM 32 已经定义过的变量,再定义一次。
#define uint  unsigned int

#define LCD_RS_0  GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define LCD_RW_0  GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define LCD_EN_0  GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define LCD_PSB_0  GPIO_ResetBits(GPIOB,GPIO_Pin_12)
#define LCD_PSB_1  GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define LCD_RS_1  GPIO_SetBits(GPIOB,GPIO_Pin_9)
#define LCD_RW_1  GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define LCD_EN_1  GPIO_SetBits(GPIOB,GPIO_Pin_11)

#define LCD_data(x) GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF);



/*******************************************************************/
/*                                                                 */
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
/*                                                                 */
/*******************************************************************/
u8 lcd_busy(void)
 {                          
    u8 result;
    LCD_RS_0;
    LCD_RW_1;
    LCD_EN_1;
    delay_ms(1);
//    result = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7); //只要位7的值,位7是忙标志位。
    result = (u8)(GPIOB->ODR&0xff00);
LCD_EN_0;
    return(result); 
 }
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS_0;
    LCD_RW_0;
    LCD_EN_0;
delay_ms(1); 
LCD_data(cmd);
    delay_ms(1);
    LCD_EN_1;
    delay_ms(1);
    LCD_EN_0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS_1;
    LCD_RW_0;
    LCD_EN_0;
LCD_data(dat);
delay_ms(1);
    LCD_EN_1;
    delay_ms(1);
    LCD_EN_0; 
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init(void)


GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);

    LCD_PSB_1;         //并口方式
    
    lcd_wcmd(0x34);      //扩充指令操作
    delay_us(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay_us(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delay_us(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay_us(5);
}


/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==1)
     {X=0x80;}
   else if (X==2)
     {X=0x90;}
   else if (X==3)
     {X=0x88;}
   else if (X==4)
     {X=0x98;}
   pos = X+Y ;  
   lcd_wcmd(pos);     //显示地址
}

/*********************************************************
*                                                        *
* 清屏函数                                               *
*                                                        *
*********************************************************/
void clr_screen(void)
{
   lcd_wcmd(0x34);      //扩充指令操作
   delay_ms(5);    
   lcd_wcmd(0x30);      //基本指令操作
   delay_ms(5); 
//   lcd_wcmd(0x0f);   //显示状态开关:整体显示关,光标显示关,光标显示反白关
//   delay_ms(2);
   lcd_wcmd(0x01);      //清屏 
   delay_ms(5);
//   lcd_wcmd(0x06);   //启始点设定:光标右移
//   delay_ms(2);
     
}

main.c中的
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "12864.h"
#include "exti.h"
#include "led.h"
//Mini STM32开发板范例代码4
//外部中断实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com  

//注意,此代码还是无法进行SWD仿真!因为使用了中断,没法用普通的方法来考虑间歇复用SWD口!

 int main(void)
 {
  uchar i;
    uchar dis1[] = {"南航            "};
uchar dis2[] = {"哲♂学"};
uchar dis3[] = {"我是一个12864"};
uchar dis4[] = {"(0.0)/"}; 
  SystemInit();
delay_init(72);     //延时初始化
NVIC_Configuration();
uart_init(9600);      //串口初始化
    LED_Init();  //LED端口初始化
EXTIX_Init(); //外部中断初始化
delay_us(10);                 //延时

    lcd_init();                //初始化LCD   
   
   
lcd_pos(1,0);             //设置显示位置为第一行的第1个字符
   i = 0;
delay_ms(10);
   while(dis1 != '\0')
    {                         //显示字符
      lcd_wdat(dis1);
      i++;
    }
   lcd_pos(2,0);             //设置显示位置为第二行的第1个字符
    i = 0;
   while(dis2 != '\0')
    {
      lcd_wdat(dis2);      //显示字符
      i++;
    }
lcd_pos(3,0);             //设置显示位置为第三行的第1个字符
    i = 0;
   while(dis3 != '\0')
    {
      lcd_wdat(dis3);      //显示字符
      i++;
    }
lcd_pos(4,0);             //设置显示位置为第四行的第1个字符
    i = 0;
   while(dis4 != '\0')
    {
      lcd_wdat(dis4);      //显示字符
      i++;
    }
     while(1);
// clr_screen(); //清屏函数,为下次刷新准备 
 }

exti.c中的
#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"

//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//外部中断 驱动代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/12/01  
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////  
 

//外部中断0服务程序
//初始化PA0,PA13,PA15为中断输入.
void EXTIX_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;


  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //关闭jtag

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  //初始化 KEY0-->GPIOA.13,KEY1-->GPIOA.15  上拉输入
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 // 初始化 WK_UP-->GPIOA.0  下拉输入
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  //GPIOA.13 中断线以及中断初始化配置
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);

  EXTI_InitStructure.EXTI_Line=EXTI_Line13;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

 //GPIOA.15  中断线以及中断初始化配置
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

  EXTI_InitStructure.EXTI_Line=EXTI_Line15;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);   //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  //GPIOA.0  中断线以及中断初始化配置
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

  EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure); 
  
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}

 
void EXTI0_IRQHandler(void)
{
    delay_ms(10);    //消抖
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)  //检查指定的EXTI0线路触发请求发生与否
{  
LED0=!LED0;
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
}
 
void EXTI15_10_IRQHandler(void)
{
  delay_ms(10);    //消抖  
 
    if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
LED0=!LED0;
}
 
     else if (EXTI_GetITStatus(EXTI_Line15) != RESET)
{
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line13);  //清除EXTI13线路挂起位
EXTI_ClearITPendingBit(EXTI_Line15);  //清除EXTI15线路挂起位
}

keil的全个程序在附件里。



12864.rar

4.86 MB, 下载次数: 224

激情创造梦想、创新缔造未来!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-2-26 15:08:56 | 显示全部楼层
PA13,PA15是按键中断,因为PA13是SWDIO的口,所有不能SWD仿真
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

23

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2014-2-26 17:35:37 | 显示全部楼层
回复【2楼】745021926:
---------------------------------
第一个问题,你知道吗
激情创造梦想、创新缔造未来!
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-2-26 18:12:23 | 显示全部楼层
这个应该是mini板的程序吧,PA0,PA13,PA15是按键,不初始化也没关系的
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

23

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2014-2-27 19:31:59 | 显示全部楼层
回复【4楼】745021926:
---------------------------------
这个不是mini的程序,mini没12864的程序的,反正如果把主函数中的“EXTIX_Init();  //外部中断初始化”这句注释掉,12864中出现了乱码

这问题很纠结!!!
激情创造梦想、创新缔造未来!
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-2-27 20:14:55 | 显示全部楼层
回复【5楼】zjr11:
---------------------------------
PB3和PB4影响的,你把EXTIX_Init()这一句屏蔽掉,加上GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);就好了
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

23

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2014-3-1 19:14:16 | 显示全部楼层
回复【6楼】745021926:
---------------------------------
为什么p3和p4有影响的?加上加上GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);会好。小弟刚学没多久,不是很清楚
激情创造梦想、创新缔造未来!
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-1 20:23:11 | 显示全部楼层
回复【7楼】zjr11:
---------------------------------
这两个引脚是连接JTAG的复用引脚,你可以在datasheet中查到的,这些引脚都要关闭JTAG才能作为正常IO口使用
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 20:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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