m12232a.c
来自「DS1302显示时钟」· C语言 代码 · 共 1,809 行 · 第 1/4 页
C
1,809 行
break;
case vKeyVal_8:
SBUF=0x08;
// lcdfill(0); //清屏
break;
default:
break;
}
}
}
/**************************************************************************
* 函数原型: uchar BcdToHex(uchar cCh);
* 功 能: 一个BCD码转化为十六进制数
**************************************************************************/
/*
uchar BcdToHex(uchar cCh){
if((cCh&0xf0)<0xa0){
if((cCh&0x0f)<0x0a){
return((cCh>>4)*10+(cCh&0x0f));
}
else{
return(cCh>>4);
}
}
else{
if((cCh&0x0f)<0x0a){
return(cCh&0x0f);
}
else{
return(0);
}
}
}
/**************************************************************************
* 函数原型: uchar HexToChar(uchar cCh);
* 功 能: 一个HEX字节转化为字符
**************************************************************************/
/*
uchar HexToChar(uchar cCh){
if(cCh>=0&&cCh<10){
return(0x30+cCh);
}
else{
return(0x57+cCh);
}
}
/**************************************************************************
* 函数原型: void CursorFlash(void);
* 功 能: 光标闪动
**************************************************************************/
/*
void CursorFlash(void){
if(bFlash){
WriteString(1, 0, "_");
}
else{
WriteString(1, 0, " ");
}
}
/**************************************************************************
* 函数原型: void Sector_Erase(uint addres)
* 功 能: 扇区擦除
**************************************************************************/
void Sector_Erase(uint addres){
// uchar i;
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR|=0x80; //设时间与充ISP操作。
ISP_CMD=0x03; //扇区命命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
_nop_();
// for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
/**************************************************************************
* 函数原型: void Byte_Write(uint addres,uchar write_data)
* 功 能: 单字节写数据
**************************************************************************/
void Byte_Write(uint addres,uchar write_data){
// uchar i;
ISP_DATA=write_data; //要写入的数据。
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR|=0x80; //设时间与充ISP操作。
ISP_CMD=0x02; //写命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
_nop_();
// for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
/**************************************************************************
* 函数原型: void Byte_Read(uint addres)
* 功 能: 单字节读数据
**************************************************************************/
uchar Byte_Read(uint addres){
// uchar i;
uchar caData;
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR|=0x80; //设时间与充ISP操作。
ISP_CMD=0x01; //写命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
_nop_();
// for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
caData=ISP_DATA;
return(caData);
}
/***********************************************************************************
函数名:void timeRead(void)
功能:保存参数
返回值:
***********************************************************************************/
void timeRead(void){
vSecond=Byte_Read(vSecondAddr)+1;
vMinute=Byte_Read(vMinuteAddr);
vHour=Byte_Read(vHourAddr);
}
/***********************************************************************************
函数名:void TimeSave(void)
功能:保存参数
返回值:
***********************************************************************************/
/*
void TimeSave(void){
Sector_Erase(UseAddr);
Byte_Write(vSecondAddr, vSecond);
Byte_Write(vMinuteAddr, vMinute);
Byte_Write(vHourAddr, vHour);
}
/***********************************************************************************
函数名:void CountRead(void)
功能:保存参数
返回值:
***********************************************************************************/
/*
void CountRead(void){
Count=Byte_Read(CountAddr);
}
/***********************************************************************************
函数名:void CountSave(void)
功能:保存参数
返回值:
***********************************************************************************/
/*
void CountSave(void){
CountRead();
Sector_Erase(CountAddr);
if(Count++>50){
Count=0;
}
Byte_Write(CountAddr, Count);
}
/**************************************************************************
* 函数原型: void DisplayTime(void);
* 功 能: 时间显示
**************************************************************************/
void DisplayTime(void){
uchar cTemp[9];
uchar ReadValue;
ReadValue = ReadDs(SEC_READ);
ReadValue = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
cTemp[0] = ReadValue/10 + '0';
cTemp[1] = ReadValue%10 + '0';
cTemp[2]=0x3a;
ReadValue = ReadDs(MIN_READ);
ReadValue = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
cTemp[3] = ReadValue/10 + '0';
cTemp[4] = ReadValue%10 + '0';
cTemp[5]=0x3a;
ReadValue = ReadDs(HR_READ);
ReadValue = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
cTemp[6] = ReadValue/10 + '0';
cTemp[7] = ReadValue%10 + '0';
cTemp[8]='\n';
put_str_xy(40, 0, cTemp);
}
/**************************************************************************
* 函数原型: void DisplayCount(void);
* 功 能: 时间显示
**************************************************************************/
/*
void DisplayCount(void){
uchar cTemp[3];
cTemp[0]=HexToChar(Count/10);
cTemp[1]=HexToChar(Count%10);
cTemp[2]=0x0a;
put_str_xy(40, 16, cTemp);
}
/***********************************************************************************
函数名:void RecordSave(uchar number)
功能:保存每次具体参数
返回值:
***********************************************************************************/
/*
void RecordSave(void){
uchar cTemp[3];
cTemp[0]=vSecondST;
cTemp[1]=vMinuteST;
cTemp[2]=vHourST;
Sector_Erase(RecordBaseAddr+0x1ff*Count);
Byte_Write(RecordBaseAddr+0+0x1ff*Count, cTemp[0]);
Byte_Write(RecordBaseAddr+1+0x1ff*Count, cTemp[1]);
Byte_Write(RecordBaseAddr+2+0x1ff*Count, cTemp[2]);
}
/***********************************************************************************
函数名:void DisplayRecord(uchar number)
功能:显示每次具体参数
返回值:
***********************************************************************************//*
void DisplayRecord(uchar number){
uchar cTemp[9];
uchar i;
uchar cNum[3];
for(i=0;i<3;i++){
cNum[i]=Byte_Read(RecordBaseAddr+i+0x1ff*number);
}
cTemp[0]=HexToChar(cNum[2]/10);
cTemp[1]=HexToChar(cNum[2]%10);
cTemp[2]=0x3a;
cTemp[3]=HexToChar(cNum[1]/10);
cTemp[4]=HexToChar(cNum[1]%10);
cTemp[5]=0x3a;
cTemp[6]=HexToChar(cNum[0]/10);
cTemp[7]=HexToChar(cNum[0]%10);
cTemp[8]=0x0a;
put_str_xy(40, 0, cTemp);
}
/**************************************************************************
* 函数原型: void ChipInit(void);
* 功 能: 对CPU及外部的硬件资源进行初始化
**************************************************************************/
void ChipInit(void){
IE=0;
// 使用外部扩展RAM,允许ALE输出
AUXR=0x00; // 禁止使用外部扩展RAM,允许ALE输出
// 定时器控制字初始化
TMOD=0x21; // 定时器1为方式1,定时器0为方式1
T2CON=0x0d; // 选择定时器1为波特率发生器,T2为捕获工作方式
ET0=1;
TH0=vT0HVal; // 启动定时器0
TL0=vT0LVal;
TR0=1;
// UART全双工串口的初始化
SCON = 0x50; // 串口模式1,8位UART,接收使能
TH1 = vBaudTime; // 波特率目前为19200
PCON&=0x7f; // 串口通信速率倍数为1
TR1=1; // 启动波特率发生器
ES=1; // 允许串口中断
// 优先级设置
IPH = 0x02;
IP = 0x02;
EA=1;
// 系统看门狗设定
// Dog_Init();
// lcdreset();
}
/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void systeminitial(void){
ChipInit();
/* lcdfill(0xff); //整屏显示
delay_ms(100);
lcdfill(0); //清屏
delay_ms(100);
*/
vSecond=0;
vMinute=0;
vHour=0;
vSecondST=0;
vMinuteST=0;
vHourST=0;
FlashTime=250;
DsInit();
lcdreset();
}
/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void main(void){
systeminitial();
while(1){
DogReset();
KeyHandle();
DisplayTime();
}
}
/**************************************************************************
* 函数原型: void Trint0(void) interrupt 1 using 1;
* 功 能: 全局定时
**************************************************************************/
void Trint0(void) interrupt 1 using 1{
TR0=0; // 时基1MS
TH0=vT0HVal;
TL0=vT0LVal;
TR0=1;
TF0=0;
if(!(--cT01ms)){
cT01ms=vT01MS;
if(iDY_Timer!=0xffff){ // 定时器标准定时
if(iDY_Timer!=0x0000){
--iDY_Timer;
}
else{
iDY_Timer=0xffff;
}
}
if(!(--cT010ms)){
cT010ms=vT010MS;
vCurTime= ReadDs(SEC_READ);
if(vPreTime!= vCurTime){
vPreTime= vCurTime;
SBUF= ReadDs(SEC_READ);
}
if(FlashTime!=0xff){ // 定时器标准定时
if(FlashTime!=0x00){
--FlashTime;
}
else{
bFlash=!bFlash;
}
}
if(!(--cT01s)){
cT01s=vT01S;
b_1Min=1;
if(++vSecondST>59){
vSecondST=0;
if(++vMinuteST>59){
vMinuteST=0;
if(++vHourST>99){
vHourST=0;
}
}
}
if(++vSecond>59){
vSecond=0;
// b_1Min=1;
if(++vMinute>59){
vMinute=0;
if(++vHour>99){
vHour=0;
}
}
}
}
}
}
}
/************************************************************************
END
************************************************************************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?