用的STC8H1K17芯片,用按鍵信號控制P1.2和P1.3端口輸出高低電平,結果始終都是低電平,不受按鍵控制。更換到P1.4/P1.5/P1.6端口都不行。更換到P1.7/P5.4端口就可以。摸索了半天還沒找到問題。在此請教各位大師幫忙看看。是不是端口配置沒有配置好。拜謝!單片機源代碼如下:
- #include "STC8H.H"
- #include "inerins.h"
- #define ADC_POWER 0X80 //ADC電源控制位
- #define ADC_FLAG 0X10 //ADC完成標志位
- #define ADC_START 0X08 //ADC啟動控制位
- #define ADC_SPEED0 0X00 //ADC轉換速度,一次轉換需要540個時鐘
- #define ADC_SPEED1 0X20 //ADC轉換速度,一次轉換需要360個時鐘
- #define ADC_SPEED2 0X40 //ADC轉換速度,一次轉換需要180個時鐘
- #define ADC_SPEED3 0X60 //ADC轉換速度,一次轉換需要90個時鐘
- #define N 8 //ADC采樣使用遞推平均濾波算法
- typedef unsigned int u16;
- typedef unsigned char u8; //對數據類型進行定義
- u16 press_delay = 0; //按下計數器標志位
- u16 release_delay = 0; //放開計數器標志位
- u8 key_val = 0; //按鍵標志位
- u8 click_count = 0; //按鍵的次數
- unsigned int temp_buf[N+1];
- unsigned int xdata BV_buf[N+1];
- unsigned int BGV=0;
- unsigned int temp=0;
- unsigned char num,ADCcount=0,ADCcount2=0,ADCcount3=0,ADCcount4=0; //ADC采樣次數變量
- unsigned char hour=0,minute=0,second=0,time_count=0,time_count2=0,time_count3;
- bit flag_400ms=1,flag_1s=1,flag_5s=1;
- bit flag_1ms = 0; //1ms標志位
- /******************************************************
- NTC電阻采用10K ;接線方式如下
- VCC---NTC(10K)---R10K---GND
- |
- |
- ADC
- NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
- *****************************************************/
- /*******************************
- NTC接VCC,固定電阻接GND,阻值ADC查詢表
- ************************************/
- unsigned int code NTCcode[] = {
- 0x3D3,
- 0x3D1,
- 0x3CE,
- 0x3CB,
- 0x3C8,
- 0x3C5,
- 0x3C2,
- 0x3BE,
- 0x3BB,
- 0x3B7,
- 0x3B3,
- 0x3AF,
- 0x3AB,
- 0x3A7,
- 0x3A2,
- 0x39E,
- 0x399,
- 0x394,
- 0x38F,
- 0x389,
- 0x384,
- 0x37E,
- 0x378,
- 0x372,
- 0x36C,
- 0x366,
- 0x35F,
- 0x358,
- 0x352,
- 0x34A,
- 0x343,
- 0x033C,
- 0x334,
- 0x32C,
- 0x324,
- 0x31C,
- 0x314,
- 0x30C,
- 0x303,
- 0x2FB,
- 0x2F2,
- 0x2E9,
- 0x2E0,
- 0x2D7,
- 0x2CD,
- 0x2C4,
- 0x2BB,
- 0x2B1,
- 0x2A7,
- 0x29E,
- 0x294,
- 0x28A,
- 0x280,
- 0x276,
- 0x26C,
- 0x263,
- 0x259,
- 0x24F,
- 0x245,
- 0x23B,
- 0x231,
- 0x21F,
- 0x21D,
- 0x213,
- 0x209,
- 0x200,
- 0x1F6,
- 0x1EC,
- 0x1E3,
- 0x1D9,
- 0x1D0,
- 0x1C6,
- 0x1BD,
- 0x1B4,
- 0x1AB,
- 0x1A2,
- 0x199,
- 0x191,
- 0x188,
- 0x180,
- 0x177,
- 0x16F,
- 0x167,
- 0x15F,
- 0x157,
- 0x150,
- 0x148,
- 0x141,
- 0x139,
- 0x132,
- 0x12B,
- 0x124,
- 0x11E,
- 0x117,
- 0x110,
- 0x10A,
- 0x103,
- 0xFE,
- 0xF8,
- 0xF2,
- 0xEC,
- 0xE7,
- 0xE1,
- 0xDC,
- 0xD7,
- 0xD1,
- 0xCC,
- 0xC8,
- 0xC3,
- 0xBE,
- 0xBA,
- 0xB5,
- 0xB1,
- 0xAD,
- 0xA9,
- 0xA5,
- 0xA1,
- 0x9D,
- 0x99,
- 0x95,
- 0x92,
- 0x8E,
- 0x8B,
- 0x88,
- 0x84,
- 0x81,
- 0x7E,
- 0x7B,
- 0x78,
- 0x75,
- 0x73,
- 0x70,
- 0x6D,
- 0x6B,
- 0x68,
- 0x66,
- 0x64,
- 0x61,
- 0x5F,
- 0x5D,
- 0x5B,
- 0x59,
- 0x57,
- 0x55,
- 0x53,
- 0x51,
- };
- sbit LED_5=P3^6; //電量20%亮燈指示
- sbit LED_6=P3^5; //電量40%亮燈指示
- sbit LED_3=P3^4; //電量60%亮燈指示
- sbit LED_4=P3^3; //電量100%亮燈指示
- sbit FAN=P3^7; //散熱風扇控制
- sbit FLK=P1^3; //高頻控制
- sbit key1=P3^2; //按鍵1控制端口
- sbit key2=P1^5; //按鍵2控制端口
- sbit EN = P1^7; /開機控制端口
- sbit HC = P1^2; //高低檔控制
- /********************************************************
- * 函數名: Timer0_Init()
- * 函數功能: 定時器技術功能
- *******************************************************/
- void Timer0_Init()
- {
- TMOD|=0x01; //選擇定時器0的工作模式為1,僅用TR0打開
- TH0 =0xfc; //給定時器賦初始值為1ms
- TL0 =0x18;
- ET0 = 1; //打開定時器0的中斷允許
- EA = 1; //打開總中斷
- TR0 = 1; //打開定時器
- }
- void Timer0()interrupt 1
- {
- TH0 = 0xfc; //給定時器賦初始值為1ms
- TL0 = 0x18;
- flag_1ms = 1; //1ms標志位
- }
- /***************************
- 初始化ADC寄存器子函數
- ***************************/
- void Init_ADC (void)
- {
- P1M1 = 0x7c;
- P1M0 = 0x8f;
- ADC_CONTR = 0XE2;
- ADC_CONTR = 0XE3;
- }
- /************************************************
- 按鍵控制子函數
- * 函數名: key_pros
- * 函數功能:實現key1按鍵長按開啟H的工作;
- ***************************************************/
- void key_pros()
- {
- if(flag_1ms==1)
- {
- flag_1ms = 0;
- if(key1==0) //判斷模式按鍵是否按下
- {
- if(press_delay<0xffff)press_delay++;
- if(press_delay==20) //20ms消抖處理
- {
- click_count++;
- }
- if(press_delay==3000)
- {
- key_val = 10;
- }
- release_delay = 0;
- }
- else
- {
- if(press_delay<0xff)release_delay++;
- if(release_delay==200)
- if(press_delay<3000)
- {
- key_val = click_count;
- click_count = 0;
- }
- press_delay = 0;
- }
- if(key_val > 0) //若有按鍵按下
- {
- if(key_val==10) //長按1.5s
- {
- EN = ~EN; //EN控制端狀態取反
- LED_4 = ~LED_4;
- }
- else if(key_val==1)
- {
- HC = ~HC; //HC控制端狀態取反
- LED_3 = ~LED_3;
- }
- else if(key_val==2)
- {
- FLK = ~FLK; //FLK控制端口狀態取反
- LED_6 = ~LED_6;
- }
- else if(key_val==3)
- {
- FAN = ~FAN; //手動開啟散熱風扇,連續按3次狀態取反關閉風扇。
- }
- key_val = 0;
- }
- }
- }
- /*************************************
- 程序主函數
- * 函數名: main
- * 函數功能:允許各子函數模塊并循環
- ****************************************/
- void main (void)
- {
- Timer0_Init(); //初始化定時器
- Init_ADC(); //初始化ADC
- P3M0 = 0xff;
- P3M1 = 0x7f;
- P5M0 = 0X00;
- P5M1 = 0x00;
- HC = 1;
- EN = 0;
- FLK = 1;
- FAN = 0;
- LED_4 = 0;
- LED_5 = 0;
- while(1)
- {
- key_pros(); //處理按鍵功能函數
- }
- }
復制代碼 |