標題:
發(fā)一個中微的115X單片機的DEMO IO設置示例程序
[打印本頁]
作者:
shenghai
時間:
2023-10-9 17:31
標題:
發(fā)一個中微的115X單片機的DEMO IO設置示例程序
給大家分享一個中微SC8P115X的DEMO程序
單片機源程序如下:
/*-------------------------------------------
程序名稱:IO設置示例程序
1153的口線分為PORTA,PORTB;1152有PORTB
PORTA對應的寄存器有PORTA,TRISA(控制輸入輸出狀態(tài)),UPDOWNA(控制上下拉電阻,高4位控制上拉,低4位控制下拉)
PORTB對應的寄存器有PORTB,TRISB(控制輸入輸出狀態(tài)),WPUB(控制上拉電阻),PDCONB(控制下拉電阻),
ODCONB(控制開漏輸出),IOCB(控制電平變化中斷)
備注:PORTA0做上拉輸入,PORTA1做輸入口, PORTA2做下拉輸入,
RORTB0做開漏輸出,其余口全為輸出
PORTA3根據(jù)PORTA1狀態(tài)輸出,為高:輸出高,為低:輸出低
PORTB0口根據(jù)PORTA0口狀態(tài),為高:
*本程序由 &應用支持部& 編寫整理
-------------------------------------------*/
#include <sc.h> //芯片頭文件,會根據(jù)工程選項自動尋找對應型號頭文件
#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口
/**************************************************
函數(shù)聲明
**************************************************/
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);
/*********************************************************
全局變量定義
*********************************************************/
/*********************************************************
函數(shù)名稱:DelayXms
函數(shù)功能:死循環(huán)延時
入口參數(shù):X
出口參數(shù):
備 注:
*********************************************************/
void DelayXms(unsigned char x)
{
unsigned char i,j;
for(i=x;i>0;i--)
asm("clrwdt");
for(j=153;j>0;j--);
}
/**********************************************************
函數(shù)名稱:Init_System
函數(shù)功能:系統(tǒng)初始化
入口參數(shù):無
出口參數(shù):無
備 注:
**********************************************************/
//系統(tǒng)初始化
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狀態(tài)
TRISB = 0B00111000;
//設置口線狀態(tài)
PORTA = 0XFF;
PORTB = 0XFF;
//---------------------------------------
//125us中斷初始化
TMR0PRD = 124; //賦予初始值
INTCON = 0xA0; //允許所有未被屏蔽的中斷、禁止外設中斷,使能Timer0
OSCCON |= 0X01; //修改TMR0PRD需要先將OSCCON,0清零,賦值后再置1
}
/**********************************************************
函數(shù)名稱:Refurbish_Sfr
函數(shù)功能:刷新LED模塊配置以及一些特殊功能寄存器
入口參數(shù):無
出口參數(shù):無
備 注:每隔一定時間刷新一次SFR可增強抗干擾能力
**********************************************************/
void Refurbish_Sfr()
{
TRISA = 0X00; //
TRISB = 0B00111000; //
//按鍵口開上拉
UPDOWNA = 0X00;
WPUB = 0B00111000;
}
/**********************************************************
函數(shù)名稱:main
函數(shù)功能:
入口參數(shù):無
出口參數(shù):無
備 注:無
**********************************************************/
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(); //讀取觸摸掃描數(shù)據(jù),處理按鍵功能
// SetTiming(); //定時處理
}
}
}
/***********************************************************
中斷服務函數(shù)
函數(shù)名稱:Isr_Timer()
函數(shù)功能:中斷處理函數(shù)
入口參數(shù):
出口參數(shù):
備 注:125US定時2中斷
***********************************************************/
void interrupt Isr_Timer()
{
if(T0IF) //若只使能了一個中斷源,可以略去判斷
{
T0IF = 0;
MainTime++;
if(MainTime > 16)
{
MainTime = 0;
flag_mainloop = 1; //2mS進一次主程序
}
}
}
/***********************************************************
函數(shù)名稱:Kscan()
函數(shù)功能:按鍵掃描
入口參數(shù):無
出口參數(shù):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;
}
}
}
/************************************************************
函數(shù)名稱:Maink_Mode()
函數(shù)功能:功能鍵處理函數(shù)
入口參數(shù):無
出口參數(shù):無
備 注:
************************************************************/
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;
}
}
/************************************************************
函數(shù)名稱:Maink_Dec()
函數(shù)功能:減鍵處理函數(shù)
入口參數(shù):無
出口參數(shù):無
備 注:
************************************************************/
void Maink_Dec()
{
}
/************************************************************
函數(shù)名稱:Maink_Add()
函數(shù)功能:加鍵處理函數(shù)
入口參數(shù):無
出口參數(shù):無
備 注:
************************************************************/
void Maink_Add()
{
}
/***************************************************
函數(shù)名稱:Maink()
函數(shù)功能:按鍵處理函數(shù)
入口參數(shù):Flag_Key_En
出口參數(shù):無
備 注:
***************************************************/
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;
}
}
}
/***********************************************
函數(shù)名稱:Set_PWM_Period
函數(shù)功能:PWM模式周期初始化
入口參數(shù):Period低8位 - 周期寄存器值低8位(8M主頻,時鐘選擇00,則間隔0.125us)
Period高8位 - 周期寄存器值高2位(輸入00~11)及時鐘選擇位(輸入00~11)
出口參數(shù):無
備注: 占空比 = 占空比寄存器值/(周期寄存器值+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時鐘
}
/***********************************************
函數(shù)名稱:Set_PWMX
函數(shù)功能:PWM模式占空比初始化
入口參數(shù):DutyRatio_L - 占空比寄存器值低8位(輸入PWMR)
DutyRatio_H - 占空比寄存器值高2位(輸入00~11)(輸入PWMCTR1或PWMCTR0)
出口參數(shù):無
備注: 占空比 = 占空比寄存器值/(周期寄存器值+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位,不改變其余已設置的數(shù)據(jù)
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引腳輸出驅動器
}
/***************************************************
函數(shù)名稱:Set_PWM_Off()
函數(shù)功能:關閉PWM處理函數(shù)
入口參數(shù):無
出口參數(shù):無
備 注:
***************************************************/
void Set_PWM_Off()
{
PWMCTR0 = 0;
PORTB |= 0B00000111;
PORTA |= 0B11111100;
}
復制代碼
原理圖: 無
仿真: 無
代碼:
SC8P115X-DEMOcc.rar
(74.9 KB, 下載次數(shù): 14)
2023-10-9 17:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1