I/O口作为输入输出实验 【转】
KF8F系列单片机开发板演示程序 项目名: 01-Input_Output_TEST 开发环境:ChipON IDE作者:上海芯旺微电子有限公司 功能简述: I/O作为输入输出控制功能时,当有按键按下,则改变相应LED显示状态。S3控制LED1,S4控制LED2。D3发光二极管的正极接地,负极接KF8F312单片机的P16端口,所以要点亮D3
发光二极管,只需配置P16端口为输出口,并让其输出低电平即可。连接按键的
端口配置为输入状态,当检测到按键按下时分别改变相应LED的显示状态。 J13、
J14要跳上跳线帽,如图。 程序设计说明
程序设计的重点为把单片机的P16口配置为输出口,然后让其输出低电平。
根据芯片手册,把方向控制寄存器TR1的相应位写入0,即可把对应的IO口配置为
输出口, 把状态寄存器P1的相应位置0,即可让其输出低电平。 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
{
} 汇编程序代码.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 ;保护现场作用,根据实际情况进行保存,中断内部和外部都使用的资源需要保
护,常规需要保护的内容有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
;* 函数功能: 初始化函数,对各种寄存器的初始化
;* 入口参数: 无
;* 返 回: 无
;*************************************************************
*****************
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 这个开发板在哪里申请的?
写的详细啊,感谢分享。
页:
[1]