標(biāo)題:
晟矽微MC30P6270C單片機(jī)LED的呼吸與漸變程序
[打印本頁]
作者:
十三丶dream
時間:
2020-12-3 18:42
標(biāo)題:
晟矽微MC30P6270C單片機(jī)LED的呼吸與漸變程序
/******************************************************************************
; * @Create Date : 2020.12.03
; * @Author/Corporation : 有趣的金魚
; *----------------------Abstract Description---------------------------------
本程序采用晟矽微6270單片機(jī)底層,適用于晟矽微6270系列單片機(jī)
******************************************************************************/
#include "user.h"
/************************************************
; * @Function Name : CLR_RAM
; * @Description : 初始化RAM
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void CLR_RAM(void)
{
__asm
movai 0x40
movra FSR
movai 48
movra 0x07
decr FSR
clrr INDF
djzr 0x07
goto $-3
clrr 0x07
clrr 0x05
__endasm;
}
/************************************************
; * @Function Name : ConfigSet
; * @Description : 初設(shè)置io pwm 定時器等
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void ConfigSet(void)
{
P1 = 0x00;
DDR1 = 0x18; //1:input 0:output
PUCON = 0xf7; //0:Effective 1:invalid
PDCON = 0xff; //0:Effective 1:invalid
ODCON = 0x00; //0:推挽輸出 1:開漏輸出
/*****************定時器0**************************************/
//T0CR = 0x84; //時鐘為CPU時鐘 定時器64分頻 1ms
//T0CNT = 256 - 125;
//T0IE = 1;
T0CR=0x00; //時鐘為CPU時鐘 定時器2分頻
T0CNT=256-96; //50us 進(jìn)一次中斷
T0IE=1;
/*****************定時器1**************************************/
//T1CR=0x80; //時鐘為CPU時鐘 定時器2分頻
//T1CNT=36; //125=31KHz
//T1LOAD=36; //用于設(shè)置 T1 的計數(shù)周期
//T1DATA=18; //用于設(shè)置 PWM1 的占空比
//PWM1EC=0;
/****************鍵盤中斷**************************************/
P1KBCR=0x08; //使能鍵盤中斷IO口
/****************鍵盤中斷**************************************/
LVDCR1=0x23; //LVD電壓檢測量值選擇
LVDEN=1; //低電壓檢測 LVD使能位 0:關(guān)閉LVD; 1:開啟LVD
LVDIE=0; //LVD 中斷使能位 0:屏蔽LVD中斷; 1:使能LVD中斷;
LVDIF=0; //LVD 中斷標(biāo)志位 0:未觸發(fā)LVD中斷; 1:已觸發(fā)LVD中斷,需軟件清 0;
/****************變量初始化************************************/
sys_power_flag = 0;
sys_sleep_flag = 0;
sys_work_flag = 0;
sys_led_breathe_direction = 0;
time1s_flag = 0;
time10ms_flag = 0;
timer_count0 = 0;
timer_count1 = 0;
timer_count2 = 0;
function_mode = 0;
led_choice = 0;
led_pwm_red_value = 0;
led_pwm_green_value = 0;
led_pwm_blue_value = 0;
led_breathe_ratio = 0;
led_breathe_period = 0;
led_breathe_frequency = 0;
}
/************************************************
; * @Function Name : Key_Scan();
; * @Description : 按鍵掃描檢測
; * @IN_Parameter : void
; * @Return parameter : 確認(rèn)的按鍵信息
; ***********************************************/
char Key_Scan(void)
{
char signal; //用于得到按鍵信號的值
char KeyValue; //用于返回按鍵穩(wěn)定的值
char i;
KeyValue = NO_KEY_MSG;
signal = 0;
if(!PIN_KEY_ON_OFF) //低有效
{
signal |= 0x01;
}
for(i=0;i<KEY_NUMBER;i++) //確認(rèn)按鍵的狀態(tài)
{
if((signal & 0x01) == 1) //有按鍵按下
{
if(KeySignalCount[i] <= KEY_LONG_TIMES)
KeySignalCount[i]++;
if(KeySignalCount[i] == KEY_LONG_TIMES)
{
KeyValue = (0x01 | KEY_LONG);//長按按下
}
}
else
{
if((KeySignalCount[i] > KEY_SHORT_TIMES)
&&(KeySignalCount[i] < KEY_LONG_TIMES))
{
KeyValue = 0x01;//短按抬起
}
KeySignalCount[i] = 0;
}
signal>>=1;
}
if(KeyValue != NO_KEY_MSG) //有按鍵
{
return KeyValue;
}
return NO_KEY_MSG;
}
/************************************************
; * @Function Name : Key_Message_Dispose();
; * @Description : 按鍵消息處理
; * @IN_Parameter : void
; * @Return parameter : void
; ***********************************************/
void Key_Message_Dispose(void)
{
if(KEY_LAMP == key_msg)
{
switch(function_mode)
{
case 0:led_white;sys_work_flag=1;function_mode++;break;
case 1:led_red;function_mode++;break;
case 2:led_green;function_mode++;break;
case 3:led_blue;function_mode++;break;
case 4:led_green;function_mode++;break;
case 5:led_black;sys_work_flag=0;function_mode=0;break;
}
}
}
/************************************************
; * @Function Name : LED_Detection();
; * @Description :
; * @IN_Parameter : void
; * @Return parameter : void
; ***********************************************/
void LED_Detection(void)
{
//第五個模式
if(5 == function_mode)
{
//呼吸燈
led_breathe_period++;
if(LAMP_PERIOD_VALUE <= led_breathe_period)
{
led_breathe_period=0;
led_breathe_frequency++;
if(LAMP_PERIOD_VALUE <= led_breathe_frequency)//周期時間*頻率時間*2=總變化時間
{
led_breathe_frequency=0;
if(sys_led_breathe_direction)
{
//亮
if(LAMP_PERIOD_VALUE >= led_breathe_ratio)
led_breathe_ratio++;
else
sys_led_breathe_direction=0;
}
else
{
//滅
if(1 <= led_breathe_ratio)
led_breathe_ratio--;
else
sys_led_breathe_direction=1;
}
}
}
if(led_breathe_ratio <= led_breathe_period)//亮滅
{
PIN_LED_RED=0;
PIN_LED_GREEN=0;
PIN_LED_BLUE=0;
}
else
{
PIN_LED_RED=1;
PIN_LED_GREEN=1;
PIN_LED_BLUE=1;
}
/*
//漸變燈
led_breathe_period++;
if(LAMP_PERIOD_VALUE <= led_breathe_period)
{
led_breathe_period=0;
led_breathe_frequency++;
if(LAMP_PERIOD_VALUE <= led_breathe_frequency)
{
led_breathe_frequency=0;
switch(led_choice)
{
case 0:led_pwm_red_value++;if(LAMP_PERIOD_VALUE <= led_pwm_red_value){led_choice++;}break;
case 1:led_pwm_blue_value--;if(0 >= led_pwm_blue_value){led_choice++;}break;
case 2:led_pwm_green_value++;if(LAMP_PERIOD_VALUE <= led_pwm_green_value){led_choice++;}break;
case 3:led_pwm_red_value--;if(0 >= led_pwm_red_value){led_choice++;}break;
case 4:led_pwm_blue_value++;if(LAMP_PERIOD_VALUE <= led_pwm_blue_value){led_choice++;}break;
case 5:led_pwm_green_value--;if(0 >= led_pwm_green_value){led_choice=0;}break;
default:led_choice=0;break;
}
}
}
if(led_pwm_red_value <= led_breathe_period)
PIN_LED_RED=0;
else
PIN_LED_RED=1;
if(led_pwm_green_value <= led_breathe_period)
PIN_LED_GREEN=0;
else
PIN_LED_GREEN=1;
if(led_pwm_blue_value <= led_breathe_period)
PIN_LED_BLUE=0;
else
PIN_LED_BLUE=1;
*/
}
}
/************************************************
; * @Function Name : Sleep_Mode();
; * @Description : 低功耗模式檢測
; * @IN_Parameter : void
; * @Return parameter : void
; ***********************************************/
void Sleep_Mode(void)
{
if(0 == sys_work_flag)//沒有在工作
{
sys_sleep_flag=1;
PIN_LED_RED=0;
PIN_LED_GREEN=0;
PIN_LED_BLUE=0;
PIN_LED_WHITE=0;
}
if(1 == sys_sleep_flag)
{
sys_sleep_flag=0;
GIE=0; //總中斷使能位
KBIF=0; //鍵盤中斷位清零
KBIE=1; //鍵盤中斷使能位
T0IE=0; //定時器 T0 中斷使能位
T1EN=0; //定時器 T1 中斷使能位
WDTEN=0; //看門狗使能位
ClrWdt();
Nop();
Nop();
Stop(); //程序運行到低功耗模式,只有發(fā)生中斷請求或者復(fù)位才能退出該模式
Nop();
Nop();
Nop();
ClrWdt();
KBIE=0;
T0IE=1;
T1EN=1;
WDTEN=1;
GIE=1;
}
}
/************************************************
; * @Function Name : Sys_Init
; * @Description : 系統(tǒng)初始化
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void Sys_Init(void)
{
GIE = 0;
CLR_RAM();
ConfigSet();
GIE = 1;
}
/************************************************
; * @Function Name : main
; * @Description :
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void main (void)
{
Sys_Init();
while(1)
{
ClrWdt();
if(time10ms_flag)
{
time10ms_flag=0;
key_msg = Key_Scan();//按鍵掃描
Key_Message_Dispose();//按鍵處理
}
if(time1s_flag)
{
time1s_flag=0;
Sleep_Mode(); //低功耗模式
}
}
}
/************************************************
; * @Function Name : Interrupt
; * @Description : The interrupt function
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void int_isr(void)__interrupt
{
__asm
movra _abuf
swapar _STATUS
movra _statusbuf
__endasm;
if((T0IF)&&(T0IE))
{
T0CNT=256-96;//50us
T0IF = 0;
timer_count0++;
timer_count1++;
if(20000 <= timer_count0)//1s
{
timer_count0=0;
time1s_flag=1;
}
if(200 <= timer_count1)//10ms
{
timer_count1=0;
time10ms_flag=1;
}
LED_Detection();
}
__asm
swapar _statusbuf
movra _STATUS
swapr _abuf
swapar _abuf
__endasm;
}
/**************************** end of file *********************************************/
復(fù)制代碼
全部資料51hei下載地址:
MC30P6270C.zip
(42.33 KB, 下載次數(shù): 54)
2020-12-3 18:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
nahaishinima
時間:
2021-3-31 22:13
你好,請問這個芯片能寫低電壓檢測的嗎?在3.3V與3V實現(xiàn)燈閃爍,3 V關(guān)機(jī),如果可以的話,能說一下大致思路嗎?我理解的是只能實現(xiàn)一種電壓檢測,像這種的,我就不知道了
作者:
stonenth
時間:
2021-4-8 08:42
很不錯,看看低功耗的設(shè)計
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1