打印
[示例代码]

I/O口作为输入输出实验 【转】

[复制链接]
862|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
KF8F系列单片机开发板演示程序 项目名: 01-Input_Output_TEST 开发环境:ChipON IDE作者:上海芯旺微电子有限公司 功能简述: I/O作为输入输出控制功能时,当有按键按下,则改变相应LED显示状态。S3控制LED1,S4控制LED2。





使用特权

评论回复
沙发
家有两宝呀|  楼主 | 2020-11-29 12:35 | 只看该作者
D3发光二极管的正极接地,负极接KF8F312单片机的P16端口,所以要点亮D3
发光二极管,只需配置P16端口为输出口,并让其输出低电平即可。连接按键的
端口配置为输入状态,当检测到按键按下时分别改变相应LED的显示状态。 J13、
J14要跳上跳线帽,如图。

使用特权

评论回复
板凳
家有两宝呀|  楼主 | 2020-11-29 12:36 | 只看该作者

使用特权

评论回复
地板
家有两宝呀|  楼主 | 2020-11-29 12:37 | 只看该作者

使用特权

评论回复
5
家有两宝呀|  楼主 | 2020-11-29 12:37 | 只看该作者
程序设计说明
程序设计的重点为把单片机的P16口配置为输出口,然后让其输出低电平。
根据芯片手册,把方向控制寄存器TR1的相应位写入0,即可把对应的IO口配置为
输出口, 把状态寄存器P1的相应位置0,即可让其输出低电平。

使用特权

评论回复
6
家有两宝呀|  楼主 | 2020-11-29 12:38 | 只看该作者
C程序代码
#include<KF8F312.h>
/*********************宏定义******************************/
#define uchar unsigned char
#define uint unsigned int
#define LED1 P16 // 对应Demo板上的D3
#define LED2 P17 // 对应Demo板上的D4
#define S3 P04
#define S4 P02
/*********************宏定义结束**************************/
/************************
* 函数名 :init_fun
* 函数功能:初始化函数
* 入口参数:无
* 返回 :无
************************/
void Init_fun()
{
OSCCTL = 0x60; //设置系统时钟为8M/*********端口初始化***********/
TR0 = 0x1c; //设置P03端口只能设置为输入,按
键接口P02、P04需配置为输入口
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0;
P1 = 0;
P2 = 0XF0; //关闭数码管位选端
}
/************************
* 函数名 :Delay_ms
* 函数功能:长时间延时
* 入口参数: 延时时长
* 返回 :无
************************/
void Delay_ms(uchar ms_data)
{
uchar i;
while(ms_data--)
{
i = 200; // 根据晶振的选择设定合适的值
while(i--);
}
}
/************************
* 函数名 :main
* 函数功能:主函数
* 入口参数:
* 返回 :
************************/
void main()
{
Init_fun(); // 端口初始化
while (1)
{
if (!S3)
{
Delay_ms(10); // 消抖延时
if (!S3)
{
LED1 = !LED1; // LED1状态取反while (!S3); // 等待按键释放
}
}
if (!S4)
{
Delay_ms(10); // 消抖延时
if (!S4)
{
LED2 = !LED2; // LED2状态取反
while (!S4); // 等待按键释放
}
}
}
}
/************************
* 函数名 :int_fun
* 函数功能:__interrupt
* 入口参数:
* 返回 :
************************/
void int_fun() __interrupt
{
}

使用特权

评论回复
7
家有两宝呀|  楼主 | 2020-11-29 12:39 | 只看该作者
汇编程序代码
.INCLUDE "KF8F312.INC"
DELAY_NUM0       .EQU     0x80     ;延时用的临时变量
DELAY_NUM1       .EQU     0x81    ;延时用的临时变量
PSW_TEMP          .EQU     0X85    ;PSW的临时保存变量
PCH_TEMP       .EQU     0X86    ;PCH的临时保存变量
.ORG 0X0000
NOP
JMP MAIN
.ORG 0X0004
JMP INTERRUPT   
INTERRUPT

使用特权

评论回复
8
家有两宝呀|  楼主 | 2020-11-29 12:41 | 只看该作者
;保护现场作用,根据实际情况进行保存,中断内部和外部都使用的资源需要保
护,常规需要保护的内容有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                            ; S3
JNB P0,P04
JMP LOOP3
CALL DELAY_MS                 ; 消抖延时  
JNB P0,P04
JMP LOOP3
MOV R0,#0X40                  ; LED1状态取反
XOR P1,R0
LOOP2
JB P0,P04                     ; 等待按键释放
JMP LOOP2
LOOP3                            ; S4
JNB P0,P02
JMP LOOP
CALL DELAY_MS                 ; 消抖延时  
JNB P0,P02
JMP LOOP
MOV R0,#0X80                  ; LED1状态取反
XOR P1,R0
LOOP4
JB P0,P02                     ; 等待按键释放
JMP LOOP4
   
JMP LOOP     
CRET
;*************************************************************
*****************
;* 函 数 名: INIT_ALL
;* 函数功能: 初始化函数,对各种寄存器的初始化
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************

使用特权

评论回复
9
家有两宝呀|  楼主 | 2020-11-29 12:42 | 只看该作者
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,#0x1c         ;配置按键P02 P04 IO口未输入模式
MOV TR0,R0
MOV R0,#0X00
MOV TR1,R0
MOV R0,#0X00        ;设置P2端口为输出,数码管位选设置为输入,关闭
数码管显示
MOV TR2,R0
   
CLR P0
CLR P1
MOV R0,#0XF0        ;关闭数码管位选端
MOV P2,R0
CRET  
   
;/************************************************************
******************
;* 函 数 名: init_RAM
;* 函数功能: 根据数据使用情况,默认RAM数值
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************/
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  
;*************************************************************
*****************
;* 函 数 名: DELAY
;* 函数功能: 延时函数,时间为1ms
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************
DELAY_MS
MOV   R0 ,#0xC8
MOV   DELAY_NUM0, R0
LP0
CWDT
MOV   R0 ,#0XC8
MOV   DELAY_NUM1, R0
LP1
DECJZ  DELAY_NUM1    ;DELAY_NUM2自减1,若为0,则跳过
JMP   LP1
DECJZ  DELAY_NUM0    ;DELAY_NUM1自减1,若为0,则跳过
JMP   LP0
CRET
.END

使用特权

评论回复
10
名字是啥样| | 2020-12-12 17:09 | 只看该作者
这个开发板在哪里申请的?

使用特权

评论回复
11
fuqinyyy| | 2020-12-13 17:35 | 只看该作者
写的详细啊,感谢分享。

使用特权

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

本版积分规则

60

主题

583

帖子

0

粉丝