|
最近搞了一个时钟程序但是感觉在程序构架方面很不尽人意不知道该怎么搞还有就是显示时间时显示闪不正常(飞思卡尔单片机)程序
#include <hidef.h> /* for EnableInterrupts macro */
#include "at7022.h"
#include "derivative.h" /* include peripheral declarations */
#include "main_asm.h"
const char add@0xffbd=0Xce; //程序保护地址;
//const unsigned char add1@0xC000=10;
//参数初始化
const unsigned char add2@0xC001=48;//iFnumber[0] //分
const unsigned char add3@0xC002=23;//iFnumber[1] //时
const unsigned char add4@0xC003=40;//iFnumber[2] //分
const unsigned char add5@0xc004=20; //时
const unsigned char add6@0xc005=39; //分
const unsigned char add7@0xc006=19;//iFnumber[5] //时
//按键
#define FUWEI PTFD_PTFD4
#define GONGNENG PTDD_PTDD1
#define ZENGJIA PTAD_PTAD0
#define JIANSHAO PTDD_PTDD0 //低有效
//指示灯
#define guozai PTED_PTED6
#define run PTFD_PTFD0
#define duanxiang PTGD_PTGD1 //低有效
//继电器
#define JDQ PTAD_PTAD1 //高有效
//数码管位选
#define gong1 PTCD_PTCD0
#define gong2 PTCD_PTCD1
#define shu1 PTED_PTED3
#define shu2 PTED_PTED4
#define shu3 PTED_PTED5
//数码管段选
#define seg_a PTCD_PTCD5
#define seg_b PTFD_PTFD5
#define seg_c PTED_PTED0
#define seg_d PTED_PTED2
#define seg_e PTED_PTED1
#define seg_f PTCD_PTCD4
#define seg_g PTCD_PTCD2
#define seg_dp PTCD_PTCD3
/////DS1302定义
//引脚连接
#define ds_1302_clk PTGD_PTGD0//kong
#define ds_1302_dat PTGD_PTGD2//
#define ds_1302_rst PTAD_PTAD1//kong
//函数说明
//数码管前两位段码对应口
// PTC5_A PTF5_B PTE0_C PTE2_D PTE1_E PTC4_F PTC2_G PTC3_DP
//显示 A 1110 1110 238 0111 0111 77
// b 0011 1110 62 0111 1100 7C
// C 1001 1100 156 0011 1001 39
// d 0111 1010 122 0101 1110 5E
// E 1001 1110 158 0111 1001 79
// F 1000 1110 142 0111 0001 71
// S 1011 0110 182 0110 1101 6D
// P 1100 1110 206 0111 0011 73
// I 0000 1100 12 0011 0000 30
//数码管后三位段码对应IO
// PTC2_A PTC5_B PTE1_C PTF5_D PTC4_E PTC3_F PTE2_G PTE0_DP
// __A___
// F| |B
// |__G___|
// | |C
// E|__D___|
//
//显示 0 PTC2 PTC5 PTE1 PTF5 PTC4 PTC3 / 0001 1111 F3 31
// 1 PTC5 PTE1 / 0000 0110 06 6
// 2 PTC2 PTC5 PTF5 PTC4 PTE2 / 0101 1011 5B 91
// 3 PTC2 PTC5 PTE1 PTF5 PTE2 / 0100 1111 4F 79
// 4 PTC5 PTE1 PTC3 PTE2 / 0110 0110 66 102
// 5 PTC2 PTE1 PTF5 PTC3 PTE2 / 0110 1101 6D 109
// 6 PTC2 PTE1 PTF5 PTC4 PTC3 PTE2 / 0111 1101 7D 125
// 7 PTC2 PTC5 PTE1 / 0000 0111 07 7
// 8 PTC2 PTC5 PTE1 PTF5 PTC4 PTC3 PTE2 / 0111 1111 7F 127
// 9 PTC2 PTC5 PTE1 PTF5 PTC3 PTE2 / 0110 1111 6F 111
// 全黑 / 0000 0000 00 0
//位变量采用位域结构体的类型定义
//各种标志位
struct{
unsigned Ft2ms :1; //4ms标志
unsigned Ft10ms :1; //10ms标志
unsigned Ft0d1s :1; //0.1s标志
unsigned Ft1s :1; //1s标志
unsigned Fdaca :1; //数据已改变标志
unsigned Fnc10 :1; //改变量为10
unsigned Ferr :1; //故障标志
unsigned Frun :1; //运行标志
unsigned Faurd :1; //间隔时间标志
unsigned Fstao :1; // 启动结束标志
unsigned bGlitterLight :1; //闪烁亮标志位
unsigned bValueGlitter :1; // 功能项值闪烁标志位
}myFlag;
////////////////////////////////////////键盘扫描控制变量
byte cScanKey; //扫描键盘的键位编码
byte cScanNum; //连续键盘扫描次数
byte iStakeout; //切换监视状态延时计数
byte cGlitterNum; //闪烁控制计数值
//bit bGlitterLight; //闪烁亮标志位
//bit bValueGlitter; //功能项值闪烁标志位
word count; //定时器计数值
byte RLEDIX; //数码管显示指针
word iStakeoutValue; //数码管显示值
word cInteger;//整数部分
byte iResidue;//余数部分
byte cHex1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
byte cHex[10]={0xF3,0x11,0x6B,0x5B,0x99,0xDA,0xFA,0x51,0xFB,0xDB}; //显示数对应的十六进制数 后三位
//,0,,,,1,,,,2,,,,3,,,,4,,,,5,,,,6,,,,7,,,,8,,,,9
byte cDisplayNumHex[5]; //数码管显示对应的十六进制数值
byte cDisplayId[5]={0x01,0x01,0x01,0x01,0x01}; //选通数码管当前列的控制值
byte ErrorId[12]={0x00,0xED,0xB9,0xB8,0xBE,0xDC,0xF3,0xF6,0x6F,0x4F,0x54,0x79}; //故障指示代码
//,,数码管显示为黑,,,S.=0xED,,C.=0xB9,,,L.=0xB8,,U.=0xBE,,o.=0xDC,,P.=0xF3,,H.=0xF6,,9=0x6F
//,,3=0x4F,,n=0x54,,E=0x79,,
//显示 0
// 1 0x11
byte iFnumber[6]={10,20,10,20,10,20}; //功能项设定值
byte Fmin[6]={0,0,0,0,0,0}; //功能最小值
byte Fmax[6]={59,23,59,23,59,23}; //功能项最大值
word Ia,Ib,Ic;
byte frun;
//min = iFnumber[0];
//////////////////////定义变量和声明函数/////////////////////
//秒,分,时,日,月,星期,年
//
unsigned char Curtime[7];
unsigned char wdata[7]={0x30,0x30,0x16,0x14,0x08,0x02,0x07};
unsigned char rdata[7];
Bool bScanEmpty;
word RARTCS; //自动延时计数值
word Rlcia; //显示电流累加单元 A
word Rlcib; //显示电流累加单元 B
word Rlcic; //显示电流累加单元 C
byte Rlcix; //显示累加计次单元
word Rcia; //显示 A
word Rcib; //显示 B
word Rcic; //显示 C
byte Rlbix; //保护电流累计次单元
word Rlbia; //保护电流累加单元A
word Rlbib; //保护电流累加单元B
word Rlbic; //保护电流累加单元 C
word Rimax; //保护电流最大值
word Rimin; //保护电流最小值
byte Rcsat; //启动计时单元
byte Rovlc; //过载指示闪烁单元
word Rdov1; //过载延时时间
word Riov1; //过载电流最大值
byte Roulc; //清闪烁控制单元
byte Rksp1; //按键速率恐控制单元
byte Rksp2;
byte KSSIX; //功能按键指针
byte KSIX;
byte Rdsas; //数据保存延时单元
word STSDC; //自启动延时计数
byte Rsiop; //电流最小相
byte ad_h; //ADC转换结果的高2位
byte ad_l; //ADC转换结果的低8位
byte ch_s; //通道选择
//函数声明
void scjcn(void);//继电器控制子程序
void sadcn(void);//AD转换控制子程序
void ssccn(void); //显示更新子程序
void smdsc1(word iStakeoutValue);//显示转换子程序
void skey(void);//按键处理子程序
//void kadmin(void);
//void kadhour(void);
//=========================
//函数名:Init_KBI()
//功能:初始化按键
//=========================
void Init_KBI(void)
{
PTFD_PTFD4 = 1;//端口A数据寄存器初始化为1
PTAD_PTAD0 = 1;
PTDD_PTDD0 = 1;
PTDD_PTDD1 = 1;//数据寄存器初始化为高 低有效
PTFDD_PTFDD4 = 0;
PTADD_PTADD0 = 0;
PTDDD_PTDDD0 = 0;
PTDDD_PTDDD1 = 0;
PTFPE_PTFPE4=1;
PTAPE_PTAPE0=1;
PTDPE_PTDPE1=1;
PTDPE_PTDPE0=1;
cScanKey=0; //清扫描键盘的键位编码
cScanNum=0; //清连续键盘扫描次数
bScanEmpty=1; //上次扫描为空
}
//====================================================================//
//
//================================================================//
void IO_PortsInit(void)
{
PTFD_PTFD0 = 1; //端口A数据寄存器初始化为1 指示灯LRUN
PTFDD_PTFDD0 = 1; //引脚PTG0作为输出引脚
PTED_PTED6 = 1;
PTEDD_PTEDD6 = 1; //引脚PTD2作为输出引脚 指示灯LOVL
PTGD_PTGD1 = 1; //指示灯LLOP
PTGDD_PTGDD1 = 1;
PTBD_PTBD3 = 0; //继电器控制 高有效
PTBDD_PTBDD3=1; //输出
PTCD_PTCD0 = 0;
PTCDD_PTCDD0=1; //功能1
PTCD_PTCD1 = 0;
PTCDD_PTCDD1=1; //功能2
PTED_PTED3 = 0;
PTEDD_PTEDD3=1; //数据3
PTED_PTED4 = 0;
PTEDD_PTEDD4=1; //数据2
PTED_PTED5 = 0;
PTEDD_PTEDD5=1; //数据1
PTCD_PTCD5 = 0;
PTCDD_PTCDD5=1; //SEG_A
PTFD_PTFD5 = 0;
PTFDD_PTFDD5=1; //SEG_B
PTED_PTED0 = 0;
PTEDD_PTEDD0=1; //SEG_C
PTED_PTED2 = 0;
PTEDD_PTEDD2=1; //SEG_D
PTED_PTED1 = 0;
PTEDD_PTEDD1=1; //SEG_E
PTCD_PTCD4 = 0;
PTCDD_PTCDD4=1; //SEG_F
PTCD_PTCD2 = 0; //数据寄存器 高有效 初始化为低
PTCDD_PTCDD2=1; //SEG_G 方向寄存器 输出
PTCD_PTCD3 = 0;
PTCDD_PTCDD3=1; //SEG_DP
}
//================================================================================================================
//函数名:Init_ADC
//作用:初始化ADC
//================================================================================================================
void Init_ADC(void)
{
ADC1CFG=0xF8;//低功耗模式,10位精度,ADCK=总线频率
ADC1SC1=0x1f;//
ADC1SC2=0x00;//0x00:软件触发,比较功能禁止;0x40:RTI触发,比较功能禁止
APCTL1=0x01;//通道引脚使能:0x01:AD0;0x02:AD1;0x04:AD2依此类推
// ch_s=0;//选择0通道
}
//===================================//
//显示初始化
//==================================//
void Init_display()
{
RLEDIX=0;
KSSIX=0;
frun=0;
}
//=======================================================
//函数名:Init_mclk//作用:MCLK引脚输出总线时钟的二分之一,系统时钟的四分之一
//=======================================================
void Init_mclk(void)
{
SMCLK_MPE=1;
SMCLK_MCSEL=1; //输出为5M
}
//===========================
//函数名:void SysInit(void)
//作用:设置ICG;外接晶振10M
//===========================
void SysInit(void)
{
ICGC1 = 0x78;//P=1 FLL使能外部参考模式 振荡器配置为高频范围,FLL 环系数P=1
ICGC2 = 0x00;//N=4,R=1,系统时钟=Fext*P*N/R Fext为晶振频率 20总线
SOPT = 0x00; //看门狗关闭
}
//==============================================================
//函数名:Init_SPI
//作者:KLY
//日期:2007-11-8 10:34
//功能:初始化SPI,波特率500K
//输入参数:无
//返回值:无
//修改记录:无
//===============================================================
void Init_SPI(void)
{
SPI1C1=0X50;//使能SPI模块为主模式
SPI1C2=0X00;
SPI1BR=0X21; //设置通讯波特率=20M/3/4=500K
}
///延时子程序
void delay(word x)
{
word y;
for(y=0;y<x;y++);
}
/*******************************************
函数名称:Reset_DS1302
功 能:对DS1302进行复位操作
参 数:无
返回值 :无
********************************************/
void Reset_DS1302(void)
{
PTADD_PTADD1=1; //RST对应的IO设置为输出状态 //ds_1302_rst=0 ds_1302_clk=1; ds_1302_dat=0
PTGDD_PTGDD0=1; //SCLK对应的IO设置为输出状态
ds_1302_clk=0; //SCLK=0
ds_1302_rst=0; //RST=0
delay(10);
ds_1302_clk=1; //SCLK=1
}
/*******************************************
函数名称:Write1Byte
功 能:对DS1302写入1个字节的数据
参 数:wdata--写入的数据
返回值 :无
********************************************/
void Write1Byte(uchar wdata)
{
uchar i;
PTGDD_PTGDD2=1; //SDA对应的IO设置为输出状态
ds_1302_rst=1; //REST=1;
for(i = 8; i> 0; i--)
{
if(wdata&0x01) ds_1302_dat=1;
else ds_1302_dat=0;
ds_1302_clk=0;
delay(10);
ds_1302_clk=1;
delay(10);
wdata>>= 1;
}
}
/*******************************************
函数名称:Read1Byte
功 能:从DS1302读出1个字节的数据
参 数:无
返回值 :读出的一个字节数据
********************************************/
uchar Read1Byte(void)
{
uchar i;
uchar rdata = 0X00;
PTGDD_PTGDD2=0; //SDA对应的IO设置为输入状态
ds_1302_rst=1; //REST=1;
for(i = 8; i> 0; i--)
{
ds_1302_clk=1;
delay(10);
ds_1302_clk=0;
delay(10);
rdata>>= 1;
if(ds_1302_dat&0x01) rdata |= 0x80;
}
return(rdata);
}
/*******************************************
函数名称:W_Data
功 能:向某个寄存器写入一个字节数据
参 数:addr--寄存器地址
wdata--写入的数据
返回值 :无
********************************************/
void W_Data(uchar addr, uchar wdata)
{
ds_1302_rst=0;
ds_1302_clk=0;
asm nop;
ds_1302_rst=1;
Write1Byte(addr); //写入地址
Write1Byte(wdata); //写入数据
ds_1302_clk=1;
ds_1302_rst=0;
}
/*******************************************
函数名称:R_Data
功 能:从某个寄存器读出一个字节数据
参 数:addr--寄存器地址
返回值 :读出的数据
********************************************/
uchar R_Data(uchar addr)
{
uchar rdata;
ds_1302_rst=0;
ds_1302_clk=0;
asm nop;
ds_1302_rst=1;
Write1Byte(addr); //写入地址
rdata = Read1Byte(); //读出数据
ds_1302_clk=1;
ds_1302_rst=0;;
return(rdata);
}
/*******************************************
函数名称:BurstWrite1302
功 能:以burst方式向DS1302写入批量时间数据
参 数:ptr--指向时间数据存放地址的指针
返回值 :读出的数据
说 明:时间数据的存放格式是:
秒,分,时,日,月,星期,年,控制
【7个数据(BCD格式)+1个控制】
********************************************/
void BurstWrite1302(uchar *ptr)
{
uchar i;
W_Data(0x8e,0x00); //允许写入
ds_1302_rst=0;
ds_1302_clk=0;
asm nop;
ds_1302_rst=1;
Write1Byte(0xbe); // 0xbe:时钟多字节写入命令
for (i = 8; i> 0; i--)
{
Write1Byte(*ptr++);
}
ds_1302_clk=1;
ds_1302_rst=0;
W_Data(0x8e,0x80); // 禁止写入
}
/*******************************************
函数名称:BurstRead1302
功 能:以burst方式从DS1302读出批量时间数据
参 数:ptr--指向存放时间数据地址的指针
返回值 :无
说 明:时间数据的存放格式是:
秒,分,时,日,月,星期,年,控制
【7个数据(BCD格式)+1个控制】
********************************************/
void BurstRead1302(uchar *ptr)
{
uchar i;
ds_1302_rst=0;
ds_1302_clk=0;
asm nop;
ds_1302_rst=1;
Write1Byte(0xbf); //0xbf:时钟多字节读命令
for (i = 8; i> 0; i--)
{
*ptr++ = Read1Byte();
}
ds_1302_clk=1;
ds_1302_rst=0;;
}
/*******************************************
函数名称:BurstWriteRAM
功 能:以burst方式向DS1302的RAM中写入批量数据
参 数:ptr--指向存放数据地址的指针
返回值 :无
说明 :共写入31个字节的数据
********************************************/
void BurstWriteRAM(uchar *ptr)
{
uchar i;
W_Data(0x8e,0x00); //允许写入
ds_1302_rst=0;
ds_1302_clk=0;
asm nop;
ds_1302_rst=1;
Write1Byte(0xfe); //0xfe:RAM多字节写命令
for (i = 31; i>0; i--) //RAM共有31个字节
{
Write1Byte(*ptr++);
}
ds_1302_clk=1;
ds_1302_rst=0;
W_Data(0x8e,0x80); //禁止写入
}
/*******************************************
函数名称:BurstReadRAM
功 能:以burst方式从DS1302的RAM中读出批量数据
参 数:ptr--指向数据存放地址的指针
返回值 :无
说明 :共读出31个字节的数据
********************************************/
void BurstReadRAM(uchar *ptr)
{
uchar i;
ds_1302_rst=0;
ds_1302_clk=0;;
asm nop;
ds_1302_rst=1;
Write1Byte(0xff); //0xff:RAM的多字节读命令
for (i = 31; i> 0; i--)
{
*ptr++ = Read1Byte();
}
ds_1302_clk=1;
ds_1302_rst=0;
}
/*******************************************
函数名称:Set_DS1302
功 能:设置DS1302内部的时间
参 数:ptr--指向存放数据地址的指针
返回值 :无
说明 :写入数据的格式:
秒 分 时 日 月 星期 年 【共7个字节】
********************************************/
void Set_DS1302(uchar *ptr)
{
uchar i;
uchar addr = 0x80;
W_Data(0x8e,0x00); //允许写入
for(i = 7;i> 0;i--)
{
W_Data(addr,*ptr++);
addr += 2;
}
W_Data(0x8e,0x80); //禁止
}
/*******************************************
函数名称:Get_DS1302
功 能:读取DS1302内部的时间
参 数:ptr--指向数据存放地址的指针
返回值 :无
说明 :读出数据的格式:
秒 分 时 日 月 星期 年 【共7个字节】
********************************************/
void Get_DS1302(uchar *ptr)
{
uchar i;
uchar addr = 0x81;
for(i = 0;i < 7;i++)
{
ptr = R_Data(addr);
addr += 2;
}
}
//=============================
//函数名:void TPM1Init(void)
//作用:初始化TPM
//=============================
void TPM1Init(void)
{
TPM1SC=0x48;//TPM时钟源为总线时钟,分频系数=1;使能定时器溢出中断
TPM1MOD=0X2710; //模寄存器 10000*0.2
TPM1CNTH=0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零)
}
//============================
// void PeripheralInit(void)
//
//=============================
void PeripheralInit(void)
{
SysInit();
IO_PortsInit();
Init_ADC();
Init_display();
Init_KBI();
TPM1Init();
}
//*************************************//
//显示转换子程序
//*************************************//
void smdsc1(word iStakeoutValue)
{
if(iStakeoutValue<1000)
{
cInteger=iStakeoutValue/100; //求百位数
iResidue=iStakeoutValue%100;
if(cInteger==0)
cDisplayNumHex[2]=0x00; //百位数为零,不显示
else
cDisplayNumHex[2]=cHex[cInteger]; //百位数不为零,显示其数值
////////显示十位数
cInteger=iResidue/10; //求十位数
iResidue=iResidue%10;
if((cInteger==0)&&(cDisplayNumHex[2]==0x00))
cDisplayNumHex[3]=0x00;
else
cDisplayNumHex[3]=cHex[cInteger];
///////显示个位数
cDisplayNumHex[4]=cHex[iResidue]; //显示个位数值
}
}
//*************************************//
//AD转换
//*************************************//
void sadcn(void)
{
ADC1SC1=0x00;
while(!ADC1SC1_COCO);//单次转换需加此句
Rlcix++;
Rlcia=Rlcia+Ia;
if(Rlcix>63)
{
Rlcix=0;
Rcia = Rlcia>>6;
Rcia=Rcia*54;
Rcia=Rcia>>8;
Rlcia=0;
}
}
//*****************************************************************//
// Flash 擦程序
//*****************************************************************//
void Flashca(void)
{
byte i,flag0,flag1;
unsigned char *P_d; //注意:这里int如改为char则变量也能接受(unsinged int*)(0xXXXX)的赋值,但观察不到地址值,用int:可以观察到地址值*/
FCDIV = 0x13;
RAMCodeInit();
P_d=( unsigned char *)(0xc000);
flag0=ErasePage(P_d);
for(i=0;i<6;i++)
{
P_d++;
flag1=PGMByte(iFnumber,P_d);
}
}
//*************************************************************//
// Flash读数据
//************************************************************//
void Flashdu(void)
{
byte *a;
byte b;
a=(byte *)0xc000;
for(b=0;b<6;b++)
{
a++;
iFnumber=*a;
}
}
/*************************************************************************************************
进制转换
************************************************************************************************/
unsigned char BcdToBin(unsigned char val)
{
val = (val>> 4) * 10 + (val & 0x0f); //将BCD码转换为10进制数
return val; //返回10进制数
}
unsigned char BinToBcd(unsigned char val) //十进制转换为BCD
{
return((val/10)*16+val%10);
}
/**************************************************************/
/* 增加按键 */
/**************************************************************/
void KeyBoard2(void)
{
if(frun)
{
}
else
{
myFlag.Fdaca=1; //数据更改标志
switch(KSSIX)
{
case 0: //
if(iFnumber[0]<Fmax[0])
iFnumber[0]++;
else
iFnumber[0]=Fmin[0];
break;
case 1: //
if(iFnumber[1]<Fmax[1])
iFnumber[1]++;
else
iFnumber[1]=Fmin[1];
break;
case 2:
if(iFnumber[2]<Fmax[2])
iFnumber[2]++;
else
iFnumber[2]=Fmin[2];
break;
case 3:
if(iFnumber[3]<Fmax[3])
iFnumber[3]++;
else
iFnumber[3]=Fmin[3];
break;
case 4:
if(iFnumber[4]<Fmax[4])
iFnumber[4]++;
else
iFnumber[4]=Fmin[4];
break;
case 5:
if(iFnumber[5]<Fmax[5])
iFnumber[5]++;
else
iFnumber[5]=Fmin[5];
break;
default:
break;
}
Curtime[1]=BinToBcd(iFnumber[0]);
Curtime[2]=BinToBcd(iFnumber[1]);
Set_DS1302(Curtime);
}
}
//
/**************************************************************/
/* 减少按键 */
/**************************************************************/
void KeyBoard3(void)
{
if(frun)
{
}
else
{
myFlag.Fdaca=1; //数据更改标志
switch(KSSIX)
{
case 0:
if(iFnumber[0]>Fmin[0])
iFnumber[0]--;
else
iFnumber[0]=Fmax[0];
break;
case 1:
if(iFnumber[1]>Fmin[1])
iFnumber[1]--;
else
iFnumber[1]=Fmax[1];
break;
case 2:
if(iFnumber[2]>Fmin[2])
iFnumber[2]--;
else
iFnumber[2]=Fmax[2];
break;
case 3:
if(iFnumber[3]>Fmin[3])
iFnumber[3]--;
else
iFnumber[3]=Fmax[3];
break;
case 4:
if(iFnumber[4]>Fmin[4])
iFnumber[4]--;
else
iFnumber[4]=Fmax[4];
break;
case 5:
if(iFnumber[5]>Fmin[5])
iFnumber[5]--;
else
iFnumber[5]=Fmax[5];
break;
default:
break;
}
Curtime[1]=BinToBcd(iFnumber[0]);
Curtime[2]=BinToBcd(iFnumber[1]);
Set_DS1302(Curtime);
}
}
/**************************************************************/
/* 功能按键 */
/**************************************************************/
void KeyBoard4(void)
{
// PTFD_PTFD0=0;
frun=0;
KSSIX++;
if(KSSIX>6)
KSSIX=0;
}
/**************************************************************/
/* 复位按键 */
/**************************************************************/
void KeyBoard1(void)
{
frun=1;
// PTFD_PTFD0=1;
// KSSIX++;
// myFlag.Frun=1;
//
// unsigned char i;
// KSSIX=0;
// myFlag.Frun=0;
}
void shaokey(void)
{
if((PTDD_PTDD0==1)&&(PTAD_PTAD0==1)&&(PTFD_PTFD4==1)&&(PTDD_PTDD1==1)) //////本次键盘扫描为空
{
bScanEmpty=1; //设定本次扫描为空标志位
cScanNum=0; //清除扫描计数值,从新开始计数
}
else //////本次键盘扫描不为空
{
bScanEmpty=0; //设定本次扫描不为空标志位
// iStakeout=0; //清监视计数值
}
if(PTFD_PTFD4==0) //复位键盘按下
cScanKey+=1;
else if(PTAD_PTAD0==0) //增加键盘按下
cScanKey+=2;
else if(PTDD_PTDD0==0) //减少键盘按下
cScanKey+=4;
else if(PTDD_PTDD1==0) //功能键盘按下
cScanKey+=8;
switch(cScanKey) //////判断哪个键按下,并作相应的处理
{
case 1: //复位键盘按下
KeyBoard1();
break;
case 2: //增加键盘按下
KeyBoard2();
break;
case 4: //减少键盘按下
KeyBoard3();
break;
case 8: //功能键盘按下
KeyBoard4();
break;
default: & |
|