标题:
发一个中微的115X单片机的DEMO IO设置示例程序
[打印本页]
作者:
shenghai
时间:
2023-10-9 17:31
标题:
发一个中微的115X单片机的DEMO IO设置示例程序
给大家分享一个中微SC8P115X的DEMO程序
单片机源程序如下:
/*-------------------------------------------
程序名称:IO设置示例程序
1153的口线分为PORTA,PORTB;1152有PORTB
PORTA对应的寄存器有PORTA,TRISA(控制输入输出状态),UPDOWNA(控制上下拉电阻,高4位控制上拉,低4位控制下拉)
PORTB对应的寄存器有PORTB,TRISB(控制输入输出状态),WPUB(控制上拉电阻),PDCONB(控制下拉电阻),
ODCONB(控制开漏输出),IOCB(控制电平变化中断)
备注:PORTA0做上拉输入,PORTA1做输入口, PORTA2做下拉输入,
RORTB0做开漏输出,其余口全为输出
PORTA3根据PORTA1状态输出,为高:输出高,为低:输出低
PORTB0口根据PORTA0口状态,为高:
*本程序由 &应用支持部& 编写整理
-------------------------------------------*/
#include <sc.h> //芯片头文件,会根据工程选项自动寻找对应型号头文件
#include "TypeDef.h"
#include "main.h"
#include "global_variable.h"
#define _DEBUG
/*------------------------------------------
口线定义
***************************************************/
#define KEY_MODE PORTB3 //定义RORTB3口
#define KEY_SUB PORTB4 //定义PORTB4口
#define KEY_ADD PORTB5 //定义PORTB5口
/**************************************************
函数声明
**************************************************/
void Init_System();
void Refurbish_Sfr();
void Kscan();
void Maink();
void Set_PWM_Period(unsigned int Period);
void Set_PWM0(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
void Set_PWM1(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
void Set_PWM2(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
void Set_PWM3(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
void Set_PWM4(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
void Set_PWM_Off();
void DelayXms(unsigned char x);
/*********************************************************
全局变量定义
*********************************************************/
/*********************************************************
函数名称:DelayXms
函数功能:死循环延时
入口参数:X
出口参数:
备 注:
*********************************************************/
void DelayXms(unsigned char x)
{
unsigned char i,j;
for(i=x;i>0;i--)
asm("clrwdt");
for(j=153;j>0;j--);
}
/**********************************************************
函数名称:Init_System
函数功能:系统初始化
入口参数:无
出口参数:无
备 注:
**********************************************************/
//系统初始化
void Init_System()
{
asm("nop");
asm("clrwdt");
OPTION_REG =0; //预分频给TMR0 ,Timer0使用内部时钟Focs/4,预分频比为1:2
OSCCON = 0XF0; //内部振荡器8M,CONFIG关闭WDT时必须打开WDT,
UPDOWNA = 0B00000000; //配置PORTA上拉下拉情况
WPUB = 0B00111000; //配置PORTB上拉情况
PDCONB = 0B00000000; //配置PORTB下拉情况
ODCONB = 0B00000000; //配置PORTB开漏输出情况
IOCB = 0B00000000; //配置PORTB电平变化中断情况
PORTA = 0XFF;
PORTB = 0XFF;
TRISA = 0B00000000; //配置IO状态
TRISB = 0B00111000;
//设置口线状态
PORTA = 0XFF;
PORTB = 0XFF;
//---------------------------------------
//125us中断初始化
TMR0PRD = 124; //赋予初始值
INTCON = 0xA0; //允许所有未被屏蔽的中断、禁止外设中断,使能Timer0
OSCCON |= 0X01; //修改TMR0PRD需要先将OSCCON,0清零,赋值后再置1
}
/**********************************************************
函数名称:Refurbish_Sfr
函数功能:刷新LED模块配置以及一些特殊功能寄存器
入口参数:无
出口参数:无
备 注:每隔一定时间刷新一次SFR可增强抗干扰能力
**********************************************************/
void Refurbish_Sfr()
{
TRISA = 0X00; //
TRISB = 0B00111000; //
//按键口开上拉
UPDOWNA = 0X00;
WPUB = 0B00111000;
}
/**********************************************************
函数名称:main
函数功能:
入口参数:无
出口参数:无
备 注:无
**********************************************************/
void main(void)
{
Init_System();
DelayXms(200);
PWMCTR0 = 0;
PWMCTR1 = 0;
PWMCTR2 = 0;
Set_PWM_Period(0XE0FF); //PWM模式初始化,周期512us,所有PWM共用一个周期设置
//PWM周期的高两位放置与PWMCTR2的第6,7位,
//PWM周期时钟选择在PWMCTR2的第4,5位,目前选择4分频
Set_PWM0(0X02,0X00); //PWM占空比初始化
while(1)
{
if(flag_mainloop)
{
flag_mainloop = 0;
OPTION_REG = 0B00000000; //Timer0使用内部时钟,预分频为1:2
asm("clrwdt");
OSCCON |= 0X80; //打开WDT允许位
Refurbish_Sfr(); //刷新专用寄存器
Kscan(); //按键扫描
Maink(); //读取触摸扫描数据,处理按键功能
// SetTiming(); //定时处理
}
}
}
/***********************************************************
中断服务函数
函数名称:Isr_Timer()
函数功能:中断处理函数
入口参数:
出口参数:
备 注:125US定时2中断
***********************************************************/
void interrupt Isr_Timer()
{
if(T0IF) //若只使能了一个中断源,可以略去判断
{
T0IF = 0;
MainTime++;
if(MainTime > 16)
{
MainTime = 0;
flag_mainloop = 1; //2mS进一次主程序
}
}
}
/***********************************************************
函数名称:Kscan()
函数功能:按键扫描
入口参数:无
出口参数:i
备 注:
***********************************************************/
void Kscan()
{
static volatile unsigned char Keyc = 0;
volatile unsigned char Kcount, Keyflash;
Kcount = 1;
Keyflash = 0;
if( !(PORTB&0x8))
{
Keyflash = Kcount;
}
else if(!(PORTB&0x010))
{
++Kcount;
Keyflash = Kcount;
}
else if(!(PORTB&0x020))
{
++Kcount;
Keyflash = Kcount;
}
else
{
Keyc = 0;
Flag_Key_Rh = 0;
Flag_Key_En = 0;
Kold = 0;
}
if (Keyflash != 0)
{
if (Keyflash == Kold)
{
++Keyc;
if(Keyc > 16)
{
Keyc = 0;
if (!Flag_Key_Rh)
{
Flag_Key_Rh = 1;
Flag_Key_En = 1;
}
}
}
else
{
Keyc = 0;
Kold = Keyflash;
Flag_Key_Rh = 0;
Flag_Key_En = 0;
}
}
}
/************************************************************
函数名称:Maink_Mode()
函数功能:功能键处理函数
入口参数:无
出口参数:无
备 注:
************************************************************/
void Maink_Mode()
{
static volatile unsigned char Mode_C = 0;
Mode_C++;
if(Mode_C >= 6)
Mode_C = 0;
switch(Mode_C)
{
case 0x00: Set_PWM0(0X02,0X00);break;
case 0x01: Set_PWM1(0X02,0X00);break;
case 0x02: Set_PWM2(0X02,0X00);break;
case 0x03: Set_PWM3(0X02,0X00);break;
case 0x04: Set_PWM4(0X02,0X00);break;
case 0x05: Set_PWM_Off();break;
default:break;
}
}
/************************************************************
函数名称:Maink_Dec()
函数功能:减键处理函数
入口参数:无
出口参数:无
备 注:
************************************************************/
void Maink_Dec()
{
}
/************************************************************
函数名称:Maink_Add()
函数功能:加键处理函数
入口参数:无
出口参数:无
备 注:
************************************************************/
void Maink_Add()
{
}
/***************************************************
函数名称:Maink()
函数功能:按键处理函数
入口参数:Flag_Key_En
出口参数:无
备 注:
***************************************************/
void Maink()
{
if(Flag_Key_En)
{
Flag_Key_En=0;
switch(Kold)
{
case 0x01: Maink_Mode();break;
case 0x02: Maink_Dec();break;
case 0x03: Maink_Add();break;
default:break;
}
}
}
/***********************************************
函数名称:Set_PWM_Period
函数功能:PWM模式周期初始化
入口参数:Period低8位 - 周期寄存器值低8位(8M主频,时钟选择00,则间隔0.125us)
Period高8位 - 周期寄存器值高2位(输入00~11)及时钟选择位(输入00~11)
出口参数:无
备注: 占空比 = 占空比寄存器值/(周期寄存器值+1)
在PWM周期设置后,不能修改PWMCTR2的高四位
************************************************/
void Set_PWM_Period(unsigned int Period)//, unsigned char Period_L)
{
PWM_PRD = Period; //装载PWM_PRD寄存器设置PWM周期低8位
PWMCTR2 = Period >>8 ; //装载PWMCTR2寄存器设置PWM周期高2位及PWM时钟
}
/***********************************************
函数名称:Set_PWMX
函数功能:PWM模式占空比初始化
入口参数:DutyRatio_L - 占空比寄存器值低8位(输入PWMR)
DutyRatio_H - 占空比寄存器值高2位(输入00~11)(输入PWMCTR1或PWMCTR0)
出口参数:无
备注: 占空比 = 占空比寄存器值/(周期寄存器值+1)
在PWM周期设置后,不能修改PWMCTR2的高四位,
设置好占空比后,如要修改其余PWM的占空比,不要修改已设置的占空比高两位的值
************************************************/
void Set_PWM0(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
{
PWMCTR2 &= 0XF8; //选择PWM0,
PWMR = DutyRatio_L ; //装载PWMR寄存器设置PWM0占空比低8位
PWMCTR1 = (DutyRatio_H & 0X03) | (PWMCTR1&0xfc); //装载PWMCTR1寄存器设置PWM0占空比高2位
PWMCTR0 |= 0X01 ;
TRISB &= 0B11111110; //清零TRIB0位,使能PWM0引脚输出驱动器
}
void Set_PWM1(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
{
PWMCTR2 = PWMCTR2 &0XF8 | 0X01; //选择PWM1
//选择PWM0,
PWMR = DutyRatio_L ; //装载PWMR寄存器设置PWM1占空比低8位
PWMCTR1 = ((DutyRatio_H << 2)& 0X0C) | (PWMCTR1&0xf3);
//装载PWMCTR1寄存器设置PWM1占空比高2位,不改变其余已设置的数据
PWMCTR0 |= 0X02 ; //使能PWM1
TRISB &= 0B11111101; //清零TRIB1位,使能PWM1引脚输出驱动器
}
void Set_PWM2(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
{
PWMCTR2 = PWMCTR2 &0XF8 | 0X02; //选择PWM2
//选择PWM0,
PWMR = DutyRatio_L ; //装载PWMR寄存器设置PWM2占空比低8位
PWMCTR1 = ((DutyRatio_H << 4)& 0X30) | (PWMCTR1&0xcf);
PWMCTR0 |= 0X04 ; //使能PWM2
TRISB &= 0B11111011; //清零TRIB2位,使能PWM2引脚输出驱动器
}
void Set_PWM3(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
{
PWMCTR2 = PWMCTR2 &0XF8 | 0X03; //选择PWM3
//选择PWM0,
PWMR = DutyRatio_L ; //装载PWMR寄存器设置PWM2占空比低8位
PWMCTR1 = ((DutyRatio_H << 6)& 0XC0) | (PWMCTR1&0x3f); //装载PWMCTR1寄存器设置PWM3占空比高2位
PWMCTR0 |= 0X08 ; //使能PWM3
TRISA &= 0B11111011; //清零TRIA2位,使能PWM3引脚输出驱动器
}
void Set_PWM4(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
{
PWMCTR2 = PWMCTR2 &0XF8 | 0X04; //选择PWM4
//选择PWM0,
PWMR = DutyRatio_L ; //装载PWMR寄存器设置PWM2占空比低8位
PWMCTR0 = ((DutyRatio_H << 6)& 0XC0)| PWMCTR0; //装载PWMCTR0寄存器设置PW4占空比高2位
PWMCTR0 |= 0X010 ; //使能PWM4
TRISA &= 0B11110111; //清零TRIA3位,使能PWM4引脚输出驱动器
}
/***************************************************
函数名称:Set_PWM_Off()
函数功能:关闭PWM处理函数
入口参数:无
出口参数:无
备 注:
***************************************************/
void Set_PWM_Off()
{
PWMCTR0 = 0;
PORTB |= 0B00000111;
PORTA |= 0B11111100;
}
复制代码
原理图: 无
仿真: 无
代码:
SC8P115X-DEMOcc.rar
(74.9 KB, 下载次数: 14)
2023-10-9 17:29 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1