简易万年历.docx
- 文档编号:12781704
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:25
- 大小:18.28KB
简易万年历.docx
《简易万年历.docx》由会员分享,可在线阅读,更多相关《简易万年历.docx(25页珍藏版)》请在冰点文库上搜索。
简易万年历
实验七设计性实验
一.实验题目:
简易万年历
二.功能说明:
2014年06月12日
12:
00:
0030ºC
液晶屏上显示即时的日期、时间和温度,且日期和时间可调节。
三.编程思想:
编程采用模块化思想,将程序分为几个模块,即液晶屏模块、数字温度传感器模块、定时器模块等。
定义端口,使日期和时间各位可调。
四.程序清单:
LCD.c文件
#include
#include
unsignedcharcodenumber_X[]=
{//宽x高=8x16,纵向字节倒序
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,//0
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,//1
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,//2
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,//3
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,//4
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,//5
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,//6
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,//7
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,//8
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,//9
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//.
0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,//-
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//nop
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,//:
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
};
/***********************************
*函数:
voidLCD_WriteCommandE1(unsignedcharcom)
*功能:
写指令代码子程序(E1)
***********************************/
voidLCD_WriteCommandE1(unsignedcharcom)
{
while(CRADD1&0x80);
CWADD1=com;
}
/***********************************
*函数:
voidLCD_WriteCommandE1(unsignedcharcom)
*功能:
写显示数据子程序(E1)
***********************************/
voidLCD_WriteDataE1(unsignedchardat)
{
while(CRADD1&0x80);
DWADD1=dat;
}
/***********************************
*函数:
voidWriteCommandE2(unsignedcharcom)
*功能:
写指令代码子程序(E2)
***********************************/
voidLCD_WriteCommandE2(unsignedcharcom)
{
while(CRADD2&0x80);
CWADD2=com;
}
/***********************************
*函数:
voidWriteCommandE2(unsignedcharcom)
*功能:
写显示数据子程序(E2)
***********************************/
voidLCD_WriteDataE2(unsignedchardat)
{
while(CRADD2&0x80);
DWADD2=dat;
}
/*********************************
*函数:
voidLCD_Init()
*功能:
LCD初始化程序
*********************************/
voidLCD_Init()
{
LCD_WriteCommandE1(0xe2);
LCD_WriteCommandE2(0xe2);
LCD_WriteCommandE1(0xa4);
LCD_WriteCommandE2(0xa4);
LCD_WriteCommandE1(0xa9);
LCD_WriteCommandE2(0xa9);
LCD_WriteCommandE1(0xa0);
LCD_WriteCommandE2(0xa0);
LCD_WriteCommandE1(0xc0);
LCD_WriteCommandE2(0xc0);
LCD_WriteCommandE1(0xaf);
LCD_WriteCommandE2(0xaf);
}
/*********************************
*函数:
voidLCD_Clear()
*功能:
清屏
*********************************/
voidLCD_Clear(void)
{
unsignedchari,j;
for(i=0;i<4;i++)
{
LCD_WriteCommandE1(i+0xb8);
LCD_WriteCommandE2(i+0xb8);
LCD_WriteCommandE1(0x00);
LCD_WriteCommandE2(0x00);
for(j=0;j<0x50;j++)
{
LCD_WriteDataE1(0x00);
LCD_WriteDataE2(0x00);
}
}
}
/*********************************************************
*函数:
voiddisplay_cn(unsignedcharlin,unsignedintcol,unsignedintlen,unsignedchar*p)
*功能:
显示汉字
**********************************************************/
voiddisplay_cn(unsignedcharlin,unsignedintcol,unsignedintlen,unsignedchar*p)
{
unsignedintseg,i,j;
unsignedchara,L,n;
switch(lin)
{
case0:
n=0xba;break;
case1:
n=0xb8;break;
}
for(i=0;i { for(j=0;j<2;j++) { L=col; LCD_WriteCommandE1(n+j); LCD_WriteCommandE2(n+j); for(seg=0;seg<16;seg++) { if(L<61)//为左半屏显示区域(E1) { a=L; LCD_WriteCommandE1(a); LCD_WriteDataE1(*p++); } else { a=L-61; LCD_WriteCommandE2(a); LCD_WriteDataE2(*p++); } L++; } } col=col+16; } } /********************************************************* *函数: voiddisplay_number() *功能: 显示数字 **********************************************************/ voiddisplay_number(unsignedcharlin,unsignedintcol,unsignedcharnum) { unsignedintseg,j; unsignedchara,L,n,k; switch(lin) { case0: n=0xba;break; case1: n=0xb8;break; } k=num*16; for(j=0;j<2;j++) { L=col; LCD_WriteCommandE1(n+j); LCD_WriteCommandE2(n+j); for(seg=0;seg<8;seg++) { if(L<61)//为左半屏显示区域(E1) { a=L; LCD_WriteCommandE1(a); LCD_WriteDataE1(number_X[k++]); } else { a=L-61; LCD_WriteCommandE2(a); LCD_WriteDataE2(number_X[k++]); } L++; } } } /********************************************************* *函数: voiddisplay_unsigned_int(unsignedcharlin,unsignedintcol,unsignedintdat) *功能: 显示显示无符号整型数 **********************************************************/ voiddisplay_unsigned_int(unsignedcharlin,unsignedintcol,unsignedintdat) { unsignedintseg; unsignedchark[4]; k[3]=dat%10; k[2]=((dat/10)%10); k[1]=((dat/100)%10); k[0]=((dat/1000)%10); if(k[0]==0){k[0]=12;} if((k[0]==12)&&(k[1]==0)){k[0]=12;k[1]=12;} if((k[0]==12)&&(k[1]==12)&&(k[2]==0)){k[0]=12;k[1]=12;k[2]=12;} for(seg=0;seg<4;seg++) { display_number(lin,col,k[seg]); col=col+10; } } /********************************************************* *函数: voiddisplay_signed_int(unsignedcharlin,unsignedintcol,signedintdat) *功能: 显示有符号整型数 **********************************************************/ voiddisplay_signed_int(unsignedcharlin,unsignedintcol,signedintdat) { unsignedintseg; unsignedchark[5],a; k[0]=12; if(dat<0) { dat=(~dat)+1; k[0]=11; } k[4]=dat%10; k[3]=((dat/10)%10); k[2]=((dat/100)%10); k[1]=((dat/1000)%10); a=k[0]; if(k[1]==0){k[0]=12;k[1]=a;} if((k[1]==a)&&(k[2]==0)){k[0]=12;k[1]=12;k[2]=a;} if((k[1]==12)&&(k[2]==a)&&(k[3]==0)){k[0]=12;k[1]=12;k[2]=12;k[3]=a;} for(seg=0;seg<5;seg++) { display_number(lin,col,k[seg]); col=col+10; } } /********************************************************* *函数: voiddisplay_unsigned_char(unsignedcharlin,unsignedintcol,unsignedintdat) *功能: 显示显示无符号2位数 **********************************************************/ voiddisplay_unsigned_char(unsignedcharlin,unsignedintcol,unsignedchardat) { unsignedintseg; unsignedchark[3]; k[1]=dat%10; k[0]=((dat/10)%10); for(seg=0;seg<2;seg++) { display_number(lin,col,k[seg]); col=col+10; } } LCD.h文件 #include #include #ifndef__LCD__ #define__LCD__ #defineCWADD1XBYTE[0x8000]//写指令代码地址(E1) #defineDWADD1XBYTE[0x8001]//写显示数据地址(E1) #defineCRADD1XBYTE[0x8002]//读状态字地址(E1) #defineDRADD1XBYTE[0x8003]//读显示数据地址(E1) #defineCWADD2XBYTE[0x8004]//写指令代码地址(E2) #defineDWADD2XBYTE[0x8005]//写显示数进地址(E2) #defineCRADD2XBYTE[0x8006]//读状态字地址(E2) #defineDRADD2XBYTE[0x8007]//读显示数据地址(E2) externvoidLCD_Init(); externvoiddisplay_cn(unsignedcharlin,unsignedintcol,unsignedintlen,unsignedchar*p); externvoiddisplay_signed_int(unsignedcharlin,unsignedintcol,signedintdat); externvoiddisplay_unsigned_int(unsignedcharlin,unsignedintcol,unsignedintdat); externvoiddisplay_unsigned_char(unsignedcharlin,unsignedintcol,unsignedchardat); externvoidLCD_Clear(void); #endif DS18B20.c文件 #include #include"string.h" #include"intrins.h" #include"DS18B20.h" sbitDQ=P3^0; /********************************************************* *函数: voiddelay(unsignedintuSeconds) *功能: 延时 **********************************************************/ voiddelay(unsignedintuSeconds) { for(;uSeconds>0;uSeconds--); } /********************************************************* *函数: unsignedcharow_reset(void) *功能: 复位 **********************************************************/ unsignedcharow_reset(void) { unsignedcharxdatapresence; DQ=0; delay(48); DQ=1; delay(7); presence=DQ; delay(48); return(presence); } /********************************************************* *函数: unsignedcharread_byte(void) *功能: 从1-wire总线上读取一个字节 **********************************************************/ unsignedcharread_byte(void) { unsignedchari; unsignedcharvalue=0; for(i=8;i>0;i--) { value>>=1; DQ=0; DQ=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(DQ) value|=0x80; delay(7); } return(value); //pullDQlowtostartreadtimeslot //thenrleaseDQ //readDQdataat1to15us,heredelay6us; //waitforrestoftimeslot,72us } /********************************************************* *函数: voidwrite_byte(charval) *功能: 向1-WIRE总线上写一个字节 **********************************************************/ voidwrite_byte(charval) { unsignedchari; for(i=8;i>0;i--)//writesbyte,onebitatatime { DQ=0;//pullDQlowtostarttimeslot DQ=val&0x01; delay(7);//holdvalueforremaindertimeslot,here72us DQ=1; val=val/2; } delay(5); } /********************************************************* *函数: floatRead_Temperature(void) *功能: 读取温度 **********************************************************/ floatRead_Temperature(void) { unsignedcharHdata,Ldata,b; inta; bitflag; floatx,y,z; ow_reset(); write_byte(0xCC);//SkipROM write_byte(0xBE);//ReadScratchPad delay(100); Ldata=read_byte();//Lowbytefirst Hdata=read_byte();//Highbyteafter ow_reset(); write_byte(0xCC);//SkipROM write_byte(0x44);//StartConversion a=Hdata*256+Ldata; x=(float)(Ldata&0x0f); x=x/16; if(a<0)flag=1; elseflag=0; b=a>>4; z=(float)(b); if(flag==1) { b=~b+1; z=(float)(b); z=0-z; } y=z+x; returny; } DS18B20.h文件 #ifndef__DS18B20__ #define__DS18B20__ externfloatRead_Temperature(void); #endif MCU.c文件 #include #include"MCU.h" /********************************************************* *函数: timer0_init(void)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 万年历