找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 173|回复: 0

普通 I/O 口均可中断

[复制链接]

3711

主题

1

回帖

1万

积分

管理员

积分
11937
发表于 2023-3-22 09:59:33 | 显示全部楼层 |阅读模式
STC32G 系列支持所有的 I/O 中断,且支持 4 种中断模式:下降沿中断、上升沿中断、低电平中断、
高电平中断。每组 I/O 口都有独立的中断入口地址,且每个 I/O 可独立设置中断模式。
注:STC32G12K128-Beta 版芯片的普通 I/O 口下降沿中断和上升沿中断暂时不要使用













config.h
[C] 纯文本查看 复制代码
//--------------------------------------------------------------
/*本代码严格遵循微软代码风格约定
//---------------------------------------------------------------
代码风格约定:
局部变量:   小写可(加下划线)
    float sum = 0.0f;
    float sum_count = 0;


全局变量:  g_开头加小驼峰(可加下划线)
    int g_maxStudents = 100;
    float g_averageScore = 0.0f;


函数:    大驼峰(可加下划线)
int CalculateSum(int x, int y);
int Calculate_Sum(int x, int y);


宏定义:  全大写
#define PI 3.14159265358979323846

*/

/*
*----------------------------------------------------------------------------------------------
* 作者:t176
* 邮箱:t176@qq.com
* 程序功能:普通IO_P35口低电平中断测试
* 备注:
*        引脚定义:P35
* 当前版本: Ver1.0
* 最后维护时间:2023/03/22 09:58:50
-----------------------------------------------------------------------------------------------
*/

#ifndef __CONFIG_H__
#define __CONFIG_H__
#include <STC32G.H>

/*定义无符号整数类型*/ #define ULONG unsigned long

extern ULONG g_num; // 修饰一个全局变量g_mun

// 编程框架函数声明

void Sys_Init();
void Sys_Draw();
void User_Updata();
void Sys_Updata();

// 用户函数声明

#endif


display.h
[C] 纯文本查看 复制代码
#ifndef __DISPLAY_H__
#define __DISPLAY_H__
#include "config.h"


#define SEGPORT P0

void Seg_Scan(ULONG val);
void Show_Duan(char wei, char val);
void Delay1ms();
#endif


ioexit.h
[C] 纯文本查看 复制代码
#ifndef __IOEXIT_H__
#define __IOEXIT_H__
#include "config.h"

extern ULONG g_num; //修饰一个全局变量g_mun
void Io_Init();
void Io_Break_Fun();
#endif





display.c
[C] 纯文本查看 复制代码
#include "display.h"

sbit g_duan = P2 ^ 6; // 定义段引脚
sbit g_wei = P2 ^ 7;  // 定义位引脚

unsigned char code g_duan_Data[] = {

    0x3F, //"0"
    0x06, //"1"
    0x5B, //"2"
    0x4F, //"3"
    0x66, //"4"
    0x6D, //"5"
    0x7D, //"6"
    0x07, //"7"
    0x7F, //"8"
    0x6F, //"9"
    0x77, //"A"
    0x7C, //"B"
    0x39, //"C"
    0x5E, //"D"
    0x79, //"E"
    0x71, //"F"
    0x76, //"H"
    0x38, //"L"
    0x37, //"n"
    0x3E, //"u"
    0x73, //"P"
    0x5C, //"o"
    0x40, //"-"
    0x00, // 熄灭
    0x00  // 自定义

};
/*数码管位表*/
unsigned char code g_wei_Data[] = {
    0xfe, // 1111 1110        b
    0xfd, // 1111 1101        b
    0xfb, // 1111 1011        b
    0xf7, // 1111 0111        b
    0xef, // 1110 1111        b
    0xdf, // 1101 1111        b
    0xbf, // 1011 1111        b
    0x7f  // 0111 1111        b
};

/*显示一个段值到数码管上
 *参数1,duan 需要显示到哪一个段上0-7
 *参数2,val 需要显示什么值0-9
 */
void Show_Duan(char wei, char val)
{

    SEGPORT = 0xff;            // 清断码
    g_wei = 1;                 // 打开位选
    SEGPORT = g_wei_Data[wei]; // 选择位
    g_wei = 0;                 // 关闭位选

    SEGPORT = 0xff;             // 清断码
    g_duan = 1;                 // 打开段选
    SEGPORT = g_duan_Data[val]; // 选择段
    g_duan = 0;                 // 关闭段选
}
/*数码管扫描函数
 *参数1:数码管需要显示的函数
 */

void Seg_Scan(ULONG val)
{
    char i;
    char VAL_arr[8];
    char count = 0;
    if (val == 0)
    {
        Show_Duan((char)(7), 0);
    }

    while (val != 0)
    {
        VAL_arr[count] = val % 10;
        val = val / 10;
        count++;

        for (i = 0; i < count; i++)
        {
            Delay1ms();
            Show_Duan((char)(7 - i), VAL_arr[i]);
        }
    }
}

void Delay1ms() //@11.0592MHz
{
    unsigned long i;

    _nop_();
    _nop_();
    _nop_();
    i = 551UL;
    while (i)
        i--;
}


ioinit.c


[C] 纯文本查看 复制代码
#include "ioexit.h"
#include <STC32G.H>
/*
*----------------------------------------------------------------------------------------------
* 函数名称:Io_Init
* 函数功能:IO口配置初始化
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/22 10:01:47
* 作者:t176@qq.com
* 创建时间:2023/03/22 10:01:47
-----------------------------------------------------------------------------------------------
*/
void Io_Init()
{
    EAXFR = 1; // 使能访问 XFR

    CKCON = 0x00; // 设置外部数据总线速度为最快

    WTST = 0x00; // 设置程序代码等待参数,赋值为 0 可将 CPU 执行程序的速度设置为最快

    P0M0 = 0x00; // P0 端口设置为普通 IO 口,不启用其他特殊功能

    P0M1 = 0x00;

    P1M0 = 0x00; // P1-P5 端口同理

    P1M1 = 0x00;

    P2M0 = 0x00;

    P2M1 = 0x00;

    P3M0 = 0x00;

    P3M1 = 0x00;

    P4M0 = 0x00;

    P4M1 = 0x00;

    P5M0 = 0x00;

    P5M1 = 0x00;

    P3IM0 = 0x00;

    P3IM1 = 0xFF; // 设置 P3 端口为低电平触发中断

    P3INTE = 0x20; // 使能 P3 口中断(0010 0000 b)

    EA = 1; // 使能总中断
}
/*
*----------------------------------------------------------------------------------------------
* 函数名称:Io_Break_Fun
* 函数功能:中断函数
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/22 10:19:51
* 作者:t176@qq.com
* 创建时间:2023/03/22 10:19:51
-----------------------------------------------------------------------------------------------
*/
void Io_Break_Fun() interrupt 40
{ // 中断号为40,可查询手册STC32G 311页

    g_num++;
}


main.c

[C] 纯文本查看 复制代码
#include "config.h"
#include "display.h"
#include "ioexit.h"

ULONG g_num=0;


void main()

{

	// 采用框架式编程
	//  1.定义数据
	//  2.系统初始化数据
	Sys_Init(); // 初始化
	while (1)
	{
		// 3.系统数据绘制
		Sys_Draw();
		// ----------------------------------------4.数据更新
		// 4.1用户干预更新数据
		User_Updata();
		// 4.2 系统自动更新数据
		Sys_Updata();
	}
}
// 系统式编程框架-----------------------------------------------

/*框架初始化函数*/
void Sys_Init()
{
/*--初始化IO口参数--*/Io_Init();
}
/*绘制处理数据*/
void Sys_Draw()

{
	Seg_Scan(g_num);

}

/*用户干预更新数据*/
void User_Updata()
{

}
/*系统更新数据*/
void Sys_Updata()
{
}
// 下面数用户函数实现区域-----------------------------------






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

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

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-7-4 14:08 , Processed in 0.087490 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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