给大家分享一个中微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)
|