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()
{
}
// 下面数用户函数实现区域-----------------------------------
|