給大家分享一個中微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
|