时钟程序.docx
《时钟程序.docx》由会员分享,可在线阅读,更多相关《时钟程序.docx(32页珍藏版)》请在冰豆网上搜索。
时钟程序
时钟程序
目录
第二页***********************变量声明与定义
第三、第四页***********字符取模样本
第五页*****************DS1302时钟初始化、延时函数
第六、七页***********************液晶程序
第八页**************清除buffer数组数据、整数型转换为字符串型、汉字静态显示、汉字移动、
第九页**************计算字符串长度、求某月天数、星期
第十、页**********************显示年月日、显示闹钟时间、显示时间24进制
第十一页**********************显示时间12进制
第十二页*****************进制转化为16进制存入DS1302*、更改时间、显示更改时间
第十三页*****************选择调整时间的段、闪烁函数
第十四页**********************闹钟设置
第十五、十六页**********************时钟按键控制
第十七页********************切换到菜单界面、切换到工作界面、主函数
#include
#include"intrins.h"
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/**************液晶引脚定义**************************/
sbitLCD_SCLK=P1^6;//pin2header5
sbitLCD_SDIN=P1^5;//pin3header4
sbitLCD_DC=P1^4;//pin4header3
sbitLCD_CE=P1^2;//pin5header2
sbitLCD_RST=P1^3;//pin9header1
sbitLCD_LED=P1^7;//pin9header6
/************************************/
sbitBELL=P3^5;//pin9header6
sbitKey3=P3^7;
charg_boundary=0;//切换界面标志位
/************实时时钟引脚***************/
sbitT_CLK=P3^2;/*实时时钟时钟线引脚*/
sbitT_IO=P3^3;/*实时时钟数据线引脚*/
sbitT_RST=P3^4;/*实时时钟复位线引脚*/
sbitACC0=ACC^0;
sbitACC7=ACC^7;
/*************************计算器的标志位*******************************/
ucharnum=0;//记录下次输入的数据位置
ucharhang=0;//选择输入数据显示液晶时所属的行
ucharexpression=0;//表达式的长度
ucharExplength=0;//液晶上能够显示的表达式长度
longg_date=0;//记录输入的数据
ucharg_Length=0;//输入数据的长度
charg_count=0;//混合运算次数
charg_calculate=0;//避免连续按运算符出错
charg_Buffer[20];
charg_ExpBuffer[60]={'\0'};//表达式数组
longg_Expdata[20]={0};//表达式数据
longg_ExpBuf[30]={0};//校正后的表达式数组
charfirstcount=0;//防止第二个数据没输入而运行结果的错误操作
ucharOPRT[15]={'#',0};//操作符
longOPND[20]={0};//操作数据
ucharg_Error=0;//除数为0时的标志
ucharg_Input=0;//输入被除数为0时清楚,重新计算标志位
ucharg_RetValue=0;//返回上个界面标志符
ucharg_OPcount=0;//避免数据和ASCII值相等出错
longLastResult=0;//上次运算结果
codecharerror[]="Error:
inputexpressiontoolong!
";//输入数据超长
codecharerror1[]="Error:
inputdatatoolong!
";//
/*************************电梯的标志定义*************************/
ucharstop=0;//50ms定时器
ucharg_UpOrDown=0;//电梯上下标志位
ucharg_level=1;//上升到第几层
ucharstop_level=0;//停留在第几层
/************************时钟的标志位*********************************/
ucharTime=0;//12时间显示和24时间显示转换
ucharTimeToBoundary=1;//由时间显示到主界面之间转换
ucharclock_shi=0;//闹钟时显示
ucharclock_fen=0;//闹钟分显示
ucharg_ClockSign=0;//从设置闹钟界面退出
ucharg_ClockSet=0;//是否设置闹钟标志位
ucharg_ClockShi=0;//记录设置的闹钟时
ucharg_ClockFen=0;//记录设置的闹钟分
ucharg_ClockAlarm=0;//到达闹钟时间报警
ucharg_Glink=0;//闪烁标志位
ucharChoice=3;//选择修改的分,时,秒//初始时时'时'
ucharAdd=0;//选择是时间是增加还是减小
/***********************************调整时间时的X,Y*******************************/
charAdjustX=0;
charAdjustY=0;
charAdjustShi1=0;
charAdjustShi2=0;
charAdjustFen1=0;
charAdjustFen2=0;
charAdjustMiao1=0;
charAdjustMiao2=0;
ucharg_Adjustflag=0;//调整好时间结束标志
/*****************************************************取模程序*****************************************/
/*******************************************************************************************************/
Codeucharfont6x8[][6]={//ASCII码字模
{0x00,0x00,0x00,0x00,0x00,0x00},//sp
……};
codeucharshuzi[]={//0—9和(.:
)数字字模
0x00,0x3E,0x51,0x49,0x45,0x3E,//0
0x00,0x00,0x42,0x7F,0x40,0x00,//1
0x00,0x42,0x61,0x51,0x49,0x46,//2
0x00,0x21,0x41,0x45,0x4B,0x31,//3
0x00,0x18,0x14,0x12,0x7F,0x10,//4
0x00,0x27,0x45,0x45,0x45,0x39,//5
0x00,0x3C,0x4A,0x49,0x49,0x30,//6
0x00,0x01,0x71,0x09,0x05,0x03,//7
0x00,0x36,0x49,0x49,0x49,0x36,//8
0x00,0x06,0x49,0x49,0x29,0x1E,//9
0x00,0x00,0x60,0x60,0x00,0x00,//.
0x00,0x00,0x36,0x36,0x00,0x00,//:
};
/*******************************************************************************************/
/*******************************************液晶初始化取模************************************/
/*******************************************************************************************/
codeucharmove_chinese_string[][24]={//阜阳师范学院A队,参赛队员:
张渝、李志明
/*--文字:
阜--*/
/*--宋体9;此字体下对应的点阵为:
宽x高=12x12--*/
/*--高度不是8的倍数,现调整为:
宽度x高度=12x16--*/
{0x00,0x00,0xFE,0xAA,0xAA,0xAB,0xAA,0xAA,0xEE,0x00,0x00,0x00,0x02,0x02,0x02,0x02,
0x02,0x07,0x02,0x02,0x02,0x02,0x02,0x00},
……};
codeucharwrite_chinese[][32]={//阜阳师范学院3队张渝李志明
/*--文字:
阜--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
{0x00,0x00,0x00,0xFC,0x54,0x54,0x56,0x55,0x54,0x54,0x54,0xDC,0x00,0x00,0x00,0x00,
0x08,0x08,0x08,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x00},
……};
/*******************************************************************************************/
/*******************************************时钟的取模************************************/
/********************************************************************************************/
codeucharDate[][24]={//年、月、日
/*--文字:
年--*/
/*--宋体9;此字体下对应的点阵为:
宽x高=12x12--*/
/*--高度不是8的倍数,现调整为:
宽度x高度=12x16--*/
{0x88,0x84,0xF3,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00},
……};
codeucharinterface[][32]=/*1、时钟2、计算器3、电梯*/
{
/*--文字:
1--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=8x16--*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x08,0x18,0x30,0x00,0x00,0x00,0x00},
};
codeucharclock[][32]={//设置闹钟
/*--文字:
设--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
{0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,
0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00},
…………};
codeucharClock_Bmp[][32]={/'!
'/
/*--调入了一幅图像:
这是您新建的图像--*/
/*--宽度x高度=16x16--*/
{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
codeucharBigDigit24[][12]={//数字0123456789
/*--文字:
0--*/
/*--宋体9;(小五)此字体下对应的点阵为:
宽x高=6x12--*/
/*--高度不是8的倍数,现调整为:
宽度x高度=6x16--*/
{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},
……};
codeucharBigDigit32[][16]={//数字0123456789
/*--文字:
0--*/
/*--宋体12;(小四)此字体下对应的点阵为:
宽x高=8x16--*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},
……};
codeucharweek[][24]={//星期一二三四五六日
/*--文字:
星--*/
/*--宋体9;此字体下对应的点阵为:
宽x高=12x12--*/
/*--高度不是8的倍数,现调整为:
宽度x高度=12x16--*/
{0x00,0x80,0x7F,0x55,0x55,0xF5,0x55,0x55,0x55,0x5F,0x00,0x00,0x05,0x04,0x05,0x05,
0x05,0x07,0x05,0x05,0x05,0x05,0x04,0x00},
……};
/*******************************************************************************************/
/*****************************电梯的字模*****************************************/
/*******************************************************************************************/
codeucharBmp[]=//电梯
{
/*--宽度x高度=8x8--*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
codeucharBmpUp[]=
{
/*--调入了一幅图像:
这是您新建的图像--*/
/*--宽度x高度=8x8--*/
0x00,0x04,0x06,0xFF,0x06,0x04,0x00,0x00
};
codeucharBmpDown[]=
{
/*--调入了一幅图像:
这是您新建的图像--*/
/*--宽度x高度=8x8--*/
0x00,0x20,0x60,0xFF,0x60,0x20,0x00,0x00
};
codeucharBmpF[]=
{
/*--调入了一幅图像:
这是您新建的图像--*/
/*--宽度x高度=8x8--*/
0x00,0x00,0xFF,0xFF,0x1B,0x1B,0x00,0x00
};
voidRTInputByte(uchard){/**********************实时时钟的初始化************/
uchari;ACC=d;
for(i=8;i>0;i--){
T_IO=ACC0;/*相当于汇编中的RRC*/
T_CLK=1;T_CLK=0;ACC=ACC>>1;
}}
ucharRTOutputByte(void){
uchari;
for(i=8;i>0;i--){
ACC=ACC>>1;/*相当于汇编中的RRC*/
ACC7=T_IO;T_CLK=1;T_CLK=0;
}return(ACC);
}
voidW1302(ucharucAddr,ucharucDa){
T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/
RTInputByte(ucDa);/*写1Byte数据*/T_CLK=1;T_RST=0;
}
ucharR1302(ucharucAddr){
ucharucData;
T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/
ucData=RTOutputByte();/*读1Byte数据*/
T_CLK=1;T_RST=0;ucData=ucData%16+ucData/16*10;//十六进制转化为十进制
return(ucData);
}
/***************向DS1302写入一个字节***************/
voidWDS1302(ucharaddr,uchardate){
W1302(0x8e,0x00);//控制命令,WP=0,写操作
T_RST=0;T_CLK=0;T_RST=1;RTInputByte(addr);/*地址,命令*/
RTInputByte(date);/*写1Byte数据*/T_CLK=1;T_RST=0;W1302(0x8e,0x80);
}
voidInit1302(void){
W1302(0x8e,0x00);//控制写入WP=0W1302(0x90,0xa5);
W1302(0x80,0x50);//秒W1302(0x82,0x50);//分
W1302(0x84,0x19);//时W1302(0x86,0x01);//日
W1302(0x88,0x01);//月W1302(0x8a,0x06);//星期
W1302(0x8c,0x11);//年W1302(0x8e,0x80);
}/*************DS1302初始化结束*****************/
/*************延时函数************************/
voiddelay_1us(void){//1us延时函数
uinti;for(i=0;i<1000;i++);}
voiddelay_1ms(void){//1ms延时函数
uinti;for(i=0;i<1140;i++);}
voiddelay_nms(uintn){//Nms延时函数
uinti=0;for(i=0;ivoidLCD_write_byte(uchardat,ucharcommand){/********************液晶程序**************************/
uchari;LCD_CE=0;
if(command==0)LCD_DC=0;
elseLCD_DC=1;
for(i=0;i<8;i++){
if(dat&0x80)LCD_SDIN=1;
elseLCD_SDIN=0;LCD_SCLK=0;dat=dat<<1;LCD_SCLK=1;
}LCD_CE=1;
}
voidLCD_set_XY(ucharX,ucharY){/***************设置LCD坐标函数****************/
LCD_write_byte(0x40|Y,0);//columnLCD_write_byte(0x80|X,0);//row
}
voidLCD_clear(void){/***************LCD清屏函数******************/
uinti;LCD_write_byte(0x0c,0);LCD_write_byte(0x80,0);
for(i=0;i<504;i++)LCD_write_byte(0,1);
}
voidClearhang(ucharx,uchary,ucharlength){/*****************指定位置删除***********************/
uinti;LCD_set_XY(x,y);
for(i=0;i}
voidLCD_write_char(ucharc){/**************显示英文字符*******************/