HolTek單片機的問題?
可是新的問題又來了
/*=======================================
* Project Name: Power_Display
* Program Name: PowDly
* Author: Tao Shan Biao
* Copyright: Tao Shan Biao
* CPU: ht46r064
* Virsion: 1.0
* Project Start Time: 2011-07-24
* Modify Comment: Non
=======================================*/
#include "HT46R064.h"
#define S1 _pb5
#define S2 _pa6
#define S3 _pb4
#define DCUP _pa1
#define ExtPowConnect _pa3
#define iPadConnect _pa2
#define Open_AN0 _adcr = 0x20
#define Open_AN1 _adcr = 0x21
#define Open_AN2 _adcr = 0x22
#define Open_AN3 _adcr = 0x23
#define UseTimerPoll 1 //1:使用定時器輪詢 0:使用變量查詢輪詢
#define P_count0Value 0x0F51
#define P_count1Value 0xFF
#define P_count2Value 0x12
#define halt_count0Value 0x4000
#define halt_count1Value 0x05
#define charge_count0Value 0
#define charge_count1Value 0
#define LowPowS_Mode _adonb = 1; _halt() //低功耗模式
#define Nor_Mode _adonb = 0 //正常模式
#define Full_Pow 0x0FF0 //>4.2V 滿電
#define Nor_Pow 0x0D05 //>3.6V 正常
#define Low_Pow 0x0D05 //<3.6V 嚴重缺電
unsigned char P_count0;
unsigned char P_count1;
unsigned char P_count2;
unsigned int halt_count0;
unsigned char halt_count1;
unsigned char LED_DisplayBuffer;
unsigned char Pow_grade;
unsigned char charge_count1;
unsigned char charge_count2;
unsigned int AD_Temp;
unsigned int AD_result0;
unsigned int AD_result1;
unsigned char Temp0;
//-------------------------------------------------------------------------
#pragma vector INT @ 0x04 //外部中斷
#pragma vector Timer @ 0x08 //定時/計數(shù)器0溢出中斷
#pragma vector ADIT @ 0x0c //A/D轉(zhuǎn)換完成中斷
#pragma vector OverF @ 0x10 //時基溢出中斷
void INT()
{
}
void Timer()
{
if(++P_count0 > 30) {P_count0 = 0; P_count1++;}
}
void ADIT(){}
void OverF(){}
//-------------------------------------------------------------------------
void init_MCU(void)
{
_ctrl1 = 0xCA; //INT外部中斷觸發(fā)方式:雙邊沿,時基最小,WDT關閉
_wdts = 0x07; //設置定時器最大周期
_clkmod = 0; //振蕩器低功耗模
_qosc = 1; //使用HIRC作為系統(tǒng)時
_pbc = 0; //設置B端口為輸
_pac = 0xBF; //設置除PA6為輸出的其他A端口為輸
_papu = 0xBF; //設置除PA6端口其他A端口若上
_pawk = 0x1C; //設置PA.4,3,2為下降沿喚
Open_AN0; //設置PA.0為AD通
_acsr = 0x01; //開啟AD模塊電源,選擇AD時鐘源為系統(tǒng)時
_start = 0; //啟動AD
_start = 1;
_start = 0;
//----------------------------------------------------------------------
#if UseTimerPoll //使用了定時器作為輪詢
_tmr0c = 0x97;
_intc0 = 0x07; //定時器,外部中斷使能
#else //
_intc0 = 0x03; //外部中斷使能
#endif
}
//----------------------------------------------------------------------
void init_Device(void)
{
S1 = 0;
S2 = 1;
DCUP = 1;
S3 = 1;
Pow_grade = 0;
charge_count1 = 0;
charge_count2 = 0;
halt_count0 = 0;
halt_count1 = 0;
LED_DisplayBuffer = 0;
}
void Updata_Powgrade(void)
{
AD_result0 = 0;
Open_AN0;
_acsr = 0x01; //開啟AD模塊電源,選擇AD時鐘源為系統(tǒng)時
_start = 0;
_start = 1;
while(_eocb);
AD_result0 = (unsigned int)_adrh*0x10 + (unsigned int)_adrl/0x10;
Pow_grade = (char)(AD_result0 / 0x0333);
_adcr = 0;
}
void ExtPow_Detect(void)
{
unsigned char i = 5;
AD_result1 = 0;
Open_AN3;
_acsr = 0x01; //開啟AD模塊電源,選擇AD時鐘源為系統(tǒng)時
_start = 0;
_start = 1;
while(_eocb);
AD_result1 = (unsigned int)_adrh*0x10 + (unsigned int)_adrl/0x10;
Pow_grade = (char)(AD_result1 / 0x0333);
_adcr = 0;
}
void Updata_ledbuff(void)
{
LED_DisplayBuffer = 0xFF << Pow_grade;
}
void warn_Display(void)
{
}
void Pow_Display(void)
{
Updata_ledbuff();
_pb = (LED_DisplayBuffer & 0x0F) | (_pb & 0xF0);;
}
void charge_Display(void)
{
if(charge_count1 >= (5 - Pow_grade))
{
charge_count1 = 0;
Updata_ledbuff();
}
else
{
LED_DisplayBuffer <<= 1;
charge_count1++;
}
_pb = (LED_DisplayBuffer & 0x0F) | (_pb & 0xF0);;
}
//----------------------------------------------------------------------
#if UseTimerPoll //使用了定時器作為輪詢
void poll_count(void)
{
if(P_count1 > 2)
{
if(P_count2 > 18)
{
if(!S2){S2 = 1; Temp0 = 1;} //如果在充電,關閉充電一段時間再開啟AD
}
if(P_count2 > 20)
{
P_count2 = 0;
Updata_Powgrade();
if(Temp0){S2 = 0;} //如果在充電,在AD轉(zhuǎn)化過后開啟充電
}
if(S2)
{
Pow_Display(); //顯示電量
}
else
{
charge_Display(); //顯示充電
}
P_count1 = 0;
P_count2++;
}
}
#else
void poll_count(void)
{
if(P_count0 > P_count0Value)
{
if(P_count1 > P_count1Value)
{
if(P_count2 > P_count2Value-3)
{
if(!S2) {S2 = 1; Temp0 = 1;} //如果在充電,關閉充電一段時間再開啟AD
}
if(P_count2 > P_count2Value)
{
P_count2 = 0;
Updata_Powgrade();
if(Temp0){S2 = 0;} //如果在充電,在AD轉(zhuǎn)化過后開啟充電
}
P_count1 = 0;
P_count2++;
if(S2)
{
Pow_Display(); //顯示電量
}
else
{
charge_Display(); //顯示充電
}
}
P_count0 = 0;
P_count1++;
}
P_count0++;
}
#endif
//----------------------------------------------------------------------
void Core_proc(void)
{
ExtPow_Detect(); //獲得AD_result1值
if(AD_result1 > 0x0FFF)
{
if(iPadConnect)
{
S1 = 0; //給電池充電
S2 = 1;
DCUP = 0; //此地是開還是不開?
S3 = 1;
}
else
{
S2 = 1; //連入外部電源
DCUP = 1;
S3 = 1;
S1 = 1;
}
halt_count0 = 0;
halt_count1 = 0;
}
else
{
if(iPadConnect)
{
if(halt_count0 > halt_count0Value)
{
halt_count0 = 0;
if(halt_count1 > halt_count1Value)
{
halt_count1 = 0;
LowPowS_Mode; //休眠
Nor_Mode;
}
halt_count1++;
}
halt_count0++;
}
else
{
if(AD_result0 > Nor_Pow)
{
S1 = 0; //用電池供電
S2 = 1;
DCUP = 1;
S3 = 0;
}
else
{
//顯示缺電警告
}
halt_count0 = 0;
halt_count1 = 0;
}
}
}
//-------------------------------------------------------------------------
void main()
{
init_MCU();
init_Device();
do
{
poll_count();
Core_proc();
}
while(1);
}
發(fā)現(xiàn)程序進入不了
poll_count()函數(shù)