📄 led(20071020).c
字号:
else{
cBtnValPre=cBtnVal;
cBtnVal=cButton;
return(vBtnAct_Push);
}
}
}
}
/**************************************************************************
* 函数原型: bit ButtonKeep(uint iTime);
* 功 能: 检测按钮按下是否保持了指定的时间,单位为毫秒
返 回 值: 在指定时间内,按钮弹起,则返回0
否则返回1
*************************************************************************/
/*
bit keyKeep(uint iTime){
uint iNum;
for(iNum=0;iNum<iTime/50;iNum++){
delay_ms(50);
if(keyAction()==vBtnAct_Pop){
return(0);
}
}
return(1);
}
/***********************************************************************************
函数名:void keyhandle(void)
功能:按键处理
返回值:
***********************************************************************************/
void keyhandle(void){
uchar cKeyType;
// 按键单按时取值
cKeyType=keyAction();
if(cKeyType==vKeyAct_Push){
cDY_KeyKeep=0xff;
switch(cBtnVal){
case vBtnVal_ST:
eeprom_eares(UseAddr);
eeprom_write(UseAddr, 0x01);
b_Run=!b_Run;
// cDY_KeyKeep=50;
break;
case vBtnVal_Up:
eeprom_eares(UseAddr);
eeprom_write(UseAddr, 0x02);
// cDY_KeyKeep=50;
break;
case vBtnVal_Down:
eeprom_eares(UseAddr);
eeprom_write(UseAddr, 0x03);
// cDY_KeyKeep=50;
break;
default:
break;
}
}
}
/***********************************************************************************
函数名:void DisplayNum(uchar cNumber)
功能:显示子程序
返回值:
***********************************************************************************/
/*
void DisplayNum(uchar cNumber){
Led_Data[cNumber];
}
/***********************************************************************************
函数名:uchar getcode(uchar i)
功能:根据共阴极字型编码表获取0~9,A~B字型代码
返回值:
***********************************************************************************/
/*
uchar getcode(uchar i){
uchar cTemp;
switch (i){
case 0: cTemp=0x05; break; //
case 1: cTemp=0xDD; break; //
case 2: cTemp=0x46; break; //
case 3: cTemp=0x54; break; //
case 4: cTemp=0x9C; break; //
case 5: cTemp=0x34; break; //
case 6: cTemp=0x24; break; //
case 7: cTemp=0x5D; break; //
case 8: cTemp=0x04; break; //
case 9: cTemp=0x14; break; //
default: break;
}
return(cTemp);
}
/***********************************************************************************
函数名:void display(void)
功能:显示函数
返回值:
***********************************************************************************/
void display(void){
uchar i;
wordbuf[3] = vSecond%10;
wordbuf[2] = vSecond/10;
wordbuf[1] = vMinute%10;
wordbuf[0] = vMinute/10;
switch (digbit){
case 1: i=0;break;
case 2: i=1;break;
case 4: i=2;break;
case 8: i=3;break;
default: break;
}
// DIGPORT = 0; // 关闭显示
// WORDPORT = getcode(wordbuf[i]); // 送字型码
WORDPORT = Led_Data[wordbuf[i]]; // 送字型码
DIGPORT = ~ digbit; // 送字位码
if (digbit < 0x09){
digbit <<= 1;
}
else{
digbit = 0x01;
}
DogReset();
}
/***********************************************************************************
函数名:void timeRead(void)
功能:保存参数
返回值:
***********************************************************************************/
void timeRead(void){
vSecond=eeprom_read(vSecondAddr);
vMinute=eeprom_read(vMinuteAddr);
vHour=eeprom_read(vHourAddr);
}
/***********************************************************************************
函数名:void timeSave(void)
功能:保存参数
返回值:
***********************************************************************************/
void timeSave(void){
eeprom_eares(UseAddr);
eeprom_write(vSecondAddr, vSecond);
eeprom_write(vMinuteAddr, vMinute);
eeprom_write(vHourAddr, vHour);
}
/***********************************************************************************
函数名:void Display(uchar cBit, uchar cNumber)
功能:显示子程序
返回值:
***********************************************************************************/
/*
void Display(uchar cBit, uchar cNumber){
// uchar i;
uchar cTemp;
switch(cBit){
case 0:
cTemp=~0x08;
break;
case 1:
cTemp=~0x04;
break;
case 2:
cTemp=~0x02;
break;
case 3:
cTemp=~0x01;
break;
}
// for(i=0;i<4;i++){
P1&=cTemp;
P0=Led_Data[cNumber];
delay_ms(5);
// }
}
/**************************************************************************
* 函数原型: void IO_Init(void);
* 功 能: 对扩展IO口的状态进行初始化
**************************************************************************/
void IO_Init(void){
P0=0x00;
P1=0xFF;
P2=0xff;
P3=0x00;
}
/**************************************************************************
* 函数原型: void ChipInit(void);
* 功 能: 对CPU及外部的硬件资源进行初始化
**************************************************************************/
void ChipInit(void){
IE=0;
// 使用外部扩展RAM,允许ALE输出
#if STC89C58
// AUXR=0x02; // 使用外部扩展RAM,允许ALE输出
AUXR=0x00; //使用内部扩展RAM(===========开始为0x02,结果一直出错)
#elif W77E58
CKCON=0xc1; // CKCON.2-0 = 100, MOVX指令用6个机器周期;CKCON.2-0 = 001, MOVX指令用3个机器周期
#endif
// 定时器控制字初始化
TMOD=0x21; // 定时器1为方式2,定时器0为方式1
TCON=0x05; // 设置外部中断类型
T2CON=0x0d; // 选择定时器1为波特率发生器,T2为捕获工作方式
// ET2=1;
ET0=1; // 允许定时器0、定时器2中断
// 外部中断设置
EX0=0; // FFSK中断初始时关闭,有载波时再开启
EX1=0;
IT1=1; // 外部中断0、1均为下降沿触发
IT0=1;
// 启动定时器0
TH0=vT0HVal; // 启动定时器0
TL0=vT0LVal;
TR0=1;
// UART全双工串口的初始化
SCON = 0x50; // 串口模式1,8位UART,接收使能
/*
PCON|=0x80;
TH1 = 0xfa;//19200
TH1 = 0xfd;//38400
TH1 = 0xfe;//57600实际上11.0592M的晶振达不到
TH1 = 0xff;//115200实际上11.0592M的晶振达不到
*/
// PCON|=0x80;
// TH1 = 0xfd; //SMOD=1,波特率为38400
TH1 = vBaudTime; // 波特率目前为9600Hz
PCON&=0x7f; // 串口通信速率倍数为1
// TR1=1; // 启动波特率发生器
// ES=1; // 允许串口中断
// 优先级设置
// PX0 = 1;
// PT2 = 1; // 解信令及接收FFSK为最高优先级,二者间不会引起冲突
IP=0x02; //PT2=1
IPH=0x02; //PT2H=1,PT0H=1
EA=1;
/*
TCON=0x50;
IE=0xb2;
*/
// 系统看门狗设定
Dog_Init();
// 外部芯片初始化
IO_Init();
// FK_RxEnable(); // CMX469初始化为接收
delay_ms(10); // 延时是为了避免定时器0无法产生中断的问题
}
/***********************************************************************************
函数名:void initial(void)
功能:初始化
返回值:
***********************************************************************************/
void SystemInitial(void){
b_Run=0;
digbit=0x01;
timeRead();
IO_Init();
ChipInit();
}
/***********************************************************************************
函数名:void main(void)
功能:主程序
返回值:
***********************************************************************************/
void main(void){
SystemInitial();
while(1){
DogReset();
keyhandle();
vEEprom=eeprom_read(UseAddr);
/* if(vEEprom==0x01){
Display(0,1);
}
else if(vEEprom==0x02){
Display(0,2);
}
else{
Display(0,3);
}*/
// Display(1,vSecond/10);
}
}
/**************************************************************************
* 函数原型: void Trint0(void) interrupt 1 using 1;
* 功 能: 全局定时
**************************************************************************/
void Trint0(void) interrupt 1 using 1{
/*
// 2ms 定时设置
time0_tmp = 65536-time0*fosc/12;
TH0 = (time0_tmp/256);
TL0 = (time0_tmp%256);
*/
TR0=0; // 时基500uS
TH0=vT0HVal;
TL0=vT0LVal;
TR0=1;
TF0=0;
if(!(--cT01ms)){
cT01ms=vT01MS;
display();
if(iDY_Timer!=0xffff){ // 定时器标准定时
if(iDY_Timer!=0x0000){
--iDY_Timer;
}
else{
iDY_Timer=0xffff;
}
}
if(!(--cT010ms)){
cT010ms=vT010MS;
if(cDY_LedFlash!=0xff){ // 灯闪烁控制启动
if(cDY_LedFlash!=0x00){
--cDY_LedFlash;
}
else{
cDY_LedFlash=vLedFlashTimeVal;
}
}
if(cDY_KeyKeep!=0xff){ // 键盘扫描延时
if(cDY_KeyKeep!=0x00){
--cDY_KeyKeep;
}
}
if(!(--cT01s)){
cT01s=vT01S;
timeSave();
// if(b_Run){
if(vSecond++>59){
vSecond=0;
if(vMinute++>59){
vMinute=0;
if(vHour++>23){
vHour=0;
}
}
}
// }
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -