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的全个程序在附件里。
|