打印
[示例代码]

P0口电平变化中断实验

[复制链接]
1340|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序声明KF8F系列单片机开发板演示程序 标 题: P0口电平变化中断实验
项 目 名: 02-IO_Change_Interrupt_TEST
开发环境:ChipON IDE
作 者:上海芯旺微电子有限公司
功能简述: 配置P02口电平变化中断,在中断处理函数中改变LED的亮灭状态,使得LED闪烁。

使用特权

评论回复
沙发
家有两宝呀|  楼主 | 2020-11-29 12:43 | 只看该作者
硬件说明
使用杜邦线将单片机的P04口连接到单片机的P02口,改变P04口的输出电平,
使得P02口的电平发生变化,从而产生中断,在中断处理程序中改变LED的亮灭状
态,从而使得LED闪烁,接线图如图2.1所示。

使用特权

评论回复
板凳
家有两宝呀|  楼主 | 2020-11-29 12:44 | 只看该作者
程序设计说明 P0口每个引脚都具有电平变化中断功能,当引脚的当前电平与上次读P0寄存
器时的电平不匹配时将产生电平变化中断。

使用特权

评论回复
地板
家有两宝呀|  楼主 | 2020-11-29 12:45 | 只看该作者
IOCL为电平变化中断控制寄存器,将
IOCL某位置1将开启对应引脚的电平变化中断功能,如果该引脚电平发生变化,
不管电平变化中断是否使能,电平变化中断标志位(P0IF)都会置1,如果全局中
断使能位(AIE)和电平变化中断使能位(P0IE)都已置1,则会响应中断进入中断服
务子程序。除此之外,还需注意一下两点:

使用特权

评论回复
5
家有两宝呀|  楼主 | 2020-11-29 12:45 | 只看该作者
1、 使用P0口电平中断功能,首先将相应引脚设置为数字输入模式,如果将某引
脚设置为输出或者设置为模拟输入口时将会自动禁止该引脚的电平变化中断
功能。

使用特权

评论回复
6
家有两宝呀|  楼主 | 2020-11-29 12:46 | 只看该作者
2、 P0口各引脚的电平变化中断共用一个中断使能位P0IE和一个中断响应标志
位P0IF,所以同一时间只能判断一个端口的电平变化中断功能。

使用特权

评论回复
7
家有两宝呀|  楼主 | 2020-11-29 12:49 | 只看该作者
3、 使用电平变化中断功能,当中断产生并进入中断处理函数时,必须读取当前
P0口电平,如在中断处理函数中加上 MOV P0。

使用特权

评论回复
8
家有两宝呀|  楼主 | 2020-11-29 12:50 | 只看该作者
4、 除电平变化中断功能外,P0口还带有内部上拉功能(除P03口外),可通过
上拉功能控制寄存器PUR和OPTR寄存器中的PUPH来配置上拉功能是否打开。
同时只有将引脚设置为数字输入口时才可开启上拉电阻功能。例如,使能P02
口的上拉功能需作如下配置
ANS2 = 0; // 寄存器 ANSEL 配置为数字口
TR02 = 1; // 寄存器TR0 配置为输入口
PUPH = 0; // 寄存器OPTR 使能上拉功能总使能位
PUR2 = 1; // 寄存器PUR 使能P02上拉功能

使用特权

评论回复
9
家有两宝呀|  楼主 | 2020-11-29 12:50 | 只看该作者
C 程序代码
#include<kf8f312.h>
/*********************宏定义******************************/
#define uchar unsigned char
#define uint unsigned int
/*********************宏定义结束**************************/
/*********************全局变量****************************/
uchar const Arr_num[] = {0X3F,
0X06,
0X5B,
0X4F,
0X66,
0X6D,
0X7D,
0X07,
0X7F,
0X6F
}; //共阴接法
uchar Unit, Decade, Hundred, Thousand; //定义个十百千位
/*********************全局变量结束************************/
/******************函数声明*******************************/
void Init_fun();
void Display();
void Delay_200us();
/******************函数声明结束***************************/
/************************
* 函数名 :init_fun
* 函数功能:初始化函数
* 入口参数:无
* 返回 :无
************************/
void Init_fun()
{
OSCCTL = 0x60; //设置为8M
/*********端口初始化***********/
TR0 = 0x08; //设置P03端口为输入
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0;
P1 = 0;
P2 = 0xF0; //关闭数码管位选端
}
/************************
* 函数名 :display
* 函数功能:数码管显示
* 入口参数:显示数字
* 返回 :无
************************/
void Display()
{
uint i; // 控制显示时长,确定自增的速度
for(i = 0; i < 500; i++)
{
P2 = 0XE0; //打开数码管的 个位
P1 = Arr_num[Unit];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0XD0; //打开数码管的 十位
P1 = Arr_num[Decade];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0XB0; //打开数码管的 百位
P1 = Arr_num[Hundred];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0X70; //打开数码管的 千位
P1 = Arr_num[Thousand];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
}
}
/************************
* 函数名 :Delay_200us
* 函数功能:短时间延时
* 入口参数:无
* 返回 :无
************************/
void Delay_200us()
{
uchar i = 60;
while(--i);
}
/************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
************************/
void main()
{
Unit = Decade = Hundred = Thousand = 0;
Init_fun();
while(1)
{
Unit++; //个位加1
if(Unit == 10) //如果个位的值加到10,那么个位归零,
十位加1,以下以此类推
{
Unit = 0;
Decade++;
if(Decade == 10)
{
Decade = 0;
Hundred++;
if(Hundred == 10)
{
Hundred = 0;
Thousand++;
if(Thousand == 10)
{
Thousand = 0;
}
}
}
}
Display(); //显示函数调用
}
}
//中断函数
void int_fun() __interrupt
{
}

使用特权

评论回复
10
家有两宝呀|  楼主 | 2020-11-29 14:34 | 只看该作者
汇编程序代码

使用特权

评论回复
11
家有两宝呀|  楼主 | 2020-11-29 14:35 | 只看该作者
.INCLUDE "KF8F312.INC"
;;;;;;;;;;;;;;;;通用寄存器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY_NUM1    .EQU 0X81    ;延时用的临时变量
DELAY_NUM2    .EQU 0X82    ;延时用的临时变量
PSW_TEMP    .EQU 0X85    ;PSW的临时保存变量
PCH_TEMP    .EQU 0X86    ;PCH的临时保存变量
UNIT     .EQU 0X88    ;数码管个位
DECADE     .EQU 0X89    ;数码管十位
HUNDRED     .EQU 0X8A    ;数码管百位
THOUSAND    .EQU 0X8B    ;数码管千位
DIS_DEL     .EQU 0X8C    ;DIS_DEL是用来延时数值的递增用的,
数值越大,那么递增的速度就越慢
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ORG 0X0000
   NOP
   JMP MAIN                   ;入口
.ORG 0X0004
   JMP INTERRUPT
;*************************************************************
*****************
;* 函 数 名: DIG_DATA
;* 函数功能: 数码管显示数据编码
;* 入口参数: 无
;* 返    回: R0,数码管显示的编码值
;* 注  意 : 查表函数需在程序开头定义,避免编译后表中元素存在Flash的不
同页造成查表出错
;*************************************************************
*****************

使用特权

评论回复
12
家有两宝呀|  楼主 | 2020-11-29 14:36 | 只看该作者
DIG_DATA
    ADD PCL,R2
RRET R0 ,#0X3F    ;0
RRET R0 ,#0X06    ;1
RRET R0 ,#0X5B    ;2
RRET R0 ,#0X4F    ;3
RRET R0 ,#0X66    ;4
RRET R0 ,#0X6D    ;5
RRET R0 ,#0X7D    ;6
RRET R0 ,#0X07    ;7
RRET R0 ,#0X7F    ;8
RRET R0 ,#0X6F    ;9
RRET R0 ,#0X77    ;A
RRET R0 ,#0X7C    ;B
RRET R0 ,#0X39    ;C
RRET R0 ,#0X5E    ;D
RRET R0 ,#0X79    ;E
RRET R0 ,#0X71    ;F
RRET R0 ,#0X00    ;空
;;;;;;;;;;;;;;;中断部分;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

使用特权

评论回复
13
家有两宝呀|  楼主 | 2020-11-29 14:36 | 只看该作者
INTERRUPT
;保护现场作用,根据实际情况进行保存,中断内部和外部都使用的资源需要保
护,常规需要保护的内容有PSW PCH R0 R1
SWAPR R1 ,PSW
MOVPSW_TEMP, R1
MOVR1 , PCH
MOVPCH_TEMP, R1  
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;中断处理
;...
;...
;...
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;恢复现场作用
INT_END
MOVR1 , PCH_TEMP
MOVPCH, R1   
SWAPR R1 , PSW_TEMP
MOV PSW, R1
IRET
;;;;;;;;;;;;;;中断部分结
束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
   
   
;;;;;;;;;;;;;;入口函数,主程
序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN
CALL INIT_ALL     ;初始化寄存器
    CALL INIT_RAM           ;初始化RAM
LOOP   
INC UNIT       ;个位数字的递增
MOV R0 ,UNIT
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR UNIT
   
INC DECADE       ;十位数字的递增
MOV R0 ,DECADE
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR DECADE
   
INC HUNDRED       ;百位数字的递增
MOV R0 ,HUNDRED
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR HUNDRED
   
INC THOUSAND     ;千位数字的递增
MOV R0 ,THOUSAND
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS  
CLR THOUSAND
   
C_DIS   
MOV R0,#0x33
MOV DIS_DEL,R0     ;DIS_DEL是用来延时数值的递增用的,数值越
大,那么递增的速度就越慢
CALL LED_DISPLAY    ;数码管显示当前数值
DECJZ DIS_DEL   
JMP $‐2         ;调整地址以当前地址减2的位置
JMP LOOP
   
CRET
;*************************************************************
*****************
;* 函 数 名: INIT_ALL
;* 函数功能: 初始化函数,对各种寄存器的初始化
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************

使用特权

评论回复
14
家有两宝呀|  楼主 | 2020-11-29 14:37 | 只看该作者
INIT_ALL
;调入校准信息到控制寄存器
CALL #0xFFF
MOV OSCCAL0, R0    ;晶振校准0
NOP
NOP
CALL #0xFFE
MOV OSCCAL1, R0    ;晶振校准1
NOP
NOP
;选择工作频率
MOV R0 ,#0x60   
MOV OSCCTL, R0    ;设置为8M
;端口初始化
;***端口初始化********
MOV R0 ,#0x08
MOV TR0, R0      ;设置P0端口为输入
MOV R0 ,#0x00
MOV TR1, R0      ;设置P1端口为输出
MOV R0 ,#0X00
MOV TR2, R0      ;设置P2端口为输出
   
CLR P0
CLR P1
MOV R0 ,#0XF0       ;关闭数码管位选端
MOV P2, R0      
CRET
;*************************************************************
*****************
;* 函 数 名: LED_DISPLAY
;* 函数功能: 数码管显示函数,由4个8位LED灯显示
;* 入口参数: THOUSAND 千位 ,HUNDRED 百位 ,SMQ_S 十位, UNIT 个位  ,
每个数的范围 0~f
;* 返    回: 无
;*************************************************************
*****************

使用特权

评论回复
15
家有两宝呀|  楼主 | 2020-11-29 14:37 | 只看该作者
LED_DISPLAY
MOV R0 , #0XE0
MOV P2 , R0        ;打开数码管的 个位
MOV R2 , UNIT
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消隐
MOV R0 ,#0XF0
MOV P2 , R0
   
MOV R0 ,#0XD0
MOV P2 , R0        ;打开数码管的 十位
MOV R2 , DECADE
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消隐
MOV R0 ,#0XF0
MOV P2 , R0
MOV R0 , #0XB0   
MOV P2 , R0        ;打开数码管的 百位
MOV R2 , HUNDRED
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消隐
MOV R0 ,#0XF0
MOV P2 , R0   
MOV R0 , #0X70   
MOV P2 , R0        ;打开数码管的 千位
MOV R2 , THOUSAND
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消隐
MOV R0 ,#0XF0
MOV P2 , R0   
CRET
;*************************************************************
*****************
;* 函 数 名: DELAY
;* 函数功能: 延时函数,时间为1ms
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************

使用特权

评论回复
16
家有两宝呀|  楼主 | 2020-11-29 14:38 | 只看该作者
DELAY
MOV R0,#0x12
MOV DELAY_NUM1, R0
LP0
MOV R0,#0X12
MOV DELAY_NUM2, R0
LP1
DECJZ DELAY_NUM2    ;DELAY_NUM2自减1,若为0,则跳过
JMP LP1
DECJZ DELAY_NUM1    ;DELAY_NUM1自减1,若为0,则跳过
JMP LP0      
CRET         ;子程序返回
;/************************************************************
******************
;* 函 数 名: init_RAM
;* 函数功能: 初始化RAM
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************/

使用特权

评论回复
17
家有两宝呀|  楼主 | 2020-11-29 14:38 | 只看该作者
INIT_RAM     
CLR   R2       ;传递默认RAM值
; CLR RAM SET 0  BANK0
CLR   PSW ,RP0   
MOV   R0 ,#0X80   ;起始地址0x80
MOV   R1 ,#0X20   ;操作个数
CALL    INIT_RAM_0
; CLR RAM SET 0  BANK1
SET   PSW ,RP0   
MOV   R0 ,#0X80   ;起始地址0x80
MOV   R1 ,#0X01   ;操作个数
CALL    INIT_RAM_0
; 默认工作区域设定   BANK0
CLR   PSW ,RP0
; 其他变量的数值操作
   
   
   
CRET
;;;;;;;;;;;;;;;;;;执行默认数值装载到RAM区
INIT_RAM_0   
ST [R0],R2
INC R0
DECJZ R1
JMP  INIT_RAM_0
CRET  
   
.end

使用特权

评论回复
18
嵌入小菜菜| | 2020-12-8 21:58 | 只看该作者
代码写的很整齐,不错,不错。

使用特权

评论回复
19
里面有晴雨| | 2020-12-11 18:03 | 只看该作者
这里面很多汇编语言是怎么回事呢?

使用特权

评论回复
20
幸福小强| | 2021-1-12 22:38 | 只看该作者
学习代码。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

583

帖子

0

粉丝