家有两宝呀 发表于 2020-11-29 12:35

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

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

家有两宝呀 发表于 2020-11-29 12:37

程序设计说明
程序设计的重点为把单片机的P16口配置为输出口,然后让其输出低电平。
根据芯片手册,把方向控制寄存器TR1的相应位写入0,即可把对应的IO口配置为
输出口, 把状态寄存器P1的相应位置0,即可让其输出低电平。

家有两宝呀 发表于 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
{
}

家有两宝呀 发表于 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

家有两宝呀 发表于 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
;* 函数功能: 初始化函数,对各种寄存器的初始化
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************

家有两宝呀 发表于 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 0BANK0
CLR   PSW ,RP0   
MOV   R0 ,#0X80   ;起始地址0x80
MOV   R1 ,#0X20   ;操作个数
CALL    INIT_RAM_0
; CLR RAM SET 0BANK1
SET   PSW ,RP0   
MOV   R0 ,#0X80   ;起始地址0x80
MOV   R1 ,#0X01   ;操作个数
CALL    INIT_RAM_0
; 默认工作区域设定   BANK0
CLR   PSW ,RP0
; 其他变量的数值操作
   
   
CRET
;;;;;;;;;;;;;;;;;;执行默认数值装载到RAM区
INIT_RAM_0   
ST ,R2
INC R0
DECJZ R1
JMPINIT_RAM_0
CRET
;*************************************************************
*****************
;* 函 数 名: DELAY
;* 函数功能: 延时函数,时间为1ms
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************
DELAY_MS
MOV   R0 ,#0xC8
MOV   DELAY_NUM0, R0
LP0
CWDT
MOV   R0 ,#0XC8
MOV   DELAY_NUM1, R0
LP1
DECJZDELAY_NUM1    ;DELAY_NUM2自减1,若为0,则跳过
JMP   LP1
DECJZDELAY_NUM0    ;DELAY_NUM1自减1,若为0,则跳过
JMP   LP0
CRET
.END

名字是啥样 发表于 2020-12-12 17:09

这个开发板在哪里申请的?

fuqinyyy 发表于 2020-12-13 17:35

写的详细啊,感谢分享。
页: [1]
查看完整版本: I/O口作为输入输出实验 【转】