第5组万年历实验报告_第1页
第5组万年历实验报告_第2页
第5组万年历实验报告_第3页
第5组万年历实验报告_第4页
第5组万年历实验报告_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京邮电大学

单片机小学期实验报告

2012年9月12日

目录

1硬件设计---------------------------------------3

1.1设计要求---------------------------------------------3

1.2硬件框图---------------------------------------------3

1.3硬件选择---------------------------------------------3

2软件设计----------------------------------------6

2.1编程环境及语言----------------------------------------6

2.2程序框图----------------------------------------------6

3电路设计---------------------------------------6

3.1DS1302电路--------------------------------------------6

3.2LCD1602电路------------------------------------------7

3.34*4键盘电路-------------------------------------------7

3.4蜂鸣器电路---------------------------------------------8

3.5综合电路-----------------------------------------------8

4程序设计---------------------------------------9

5操作方法---------------------------------------37

6运行结果---------------------------------------37

7实验过程排错------------------------------------38

8心得体会及建议---------------------------------38

8.1心得体会-----------------------------------------------38

8.2建议---------------------------------------------------38

9附录-------------------------------------------38

9.1组内分工-----------------------------------------------38

9.2参考文献-----------------------------------------------38

1硬件设计

1.1设计要求

实现年月日、时分秒、星期的显示功能,闹铃功能。用键盘来实现日期和时间的调整功

能,调整要求星期能自动更新,能实现位调,且闰年时2月份的天数自动变为29。显示格

式:四位年,两位月,两位日,星期显示数字,两位时,两位分,两位秒。比如:

YYYY-MM-DDX

HH:MM:SS

闹铃要求用键盘定时间,到时间后蜂鸣器响5s左右。

1.2硬件框图

日期时间由硬件软件结合产生;键盘完成当前日期时间的调整和闹铃定时功能。过程与

结果由控制芯片分别输出到显示器上,闹铃铃声设为蜂鸣器鸣叫。

1.3硬件选择

1).显示模块

由于八段数码管连线多且复杂,因此选择的是ds1602液晶显示屏。

八段数码管的优点:亮度高,显示大。驱动部份的软件简单;缺点:与液晶相比,耗电

及体积大。数码管只能单纯的显示数字,不能生动的表达各个参数的信息,消耗电力也比led

液晶显示器大。

LCD液晶显示器它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,在单

片机系统中应用晶液显示器作为输出器件有以下几个优点:

显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定

发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质

高且不会闪烁。

数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加

方便。

体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,

在重量上比相同显示面积的传统显示器要轻得多。

功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗

电量比其它显示器要少得多。Led液晶能一屏把本设计所要显示的信息表达完整。而且led

耗电小,体积小很适合与室内使用。

本设计的要求日期时间以数字表示、星期用3位英文字符表示共21个字符,lcd1602

能显示32个字符,足以完成显示功能。Lcdl602有16个引脚,各个引脚功能见下表:

引脚号引脚名电平输入/输出作用

1VSS电源地

2VDDVcc电源(+5v)

3VEE对比调整电压

4RS0/1输入0=输入指令,1=输入数据

5R/W0/1输入0=向led写入数据或指令

1=从led读取数据

6E1,1->0输入使能信号,1=读取信息

1->0(下降沿)执行指令

7DB00/1输入/输出数据总线lineO

8DB10/1输入/输出数据总线linel

9DB20/1输入/输出数据总线line2

10DB30/1输入/输出数据总线line3

11DB40/1输入/输出数据总线line4

12DB50/1输入/输出数据总线line5

13DB60/1输入/输出数据总线line6

14DB70/1输入/输出数据总线line7

15AVccLed背光正极

14KLed背光负极

表ITlcdl602引脚及功能

2).控制芯片

学校提供的Atmegal6芯片

高性能、低功耗的8位AVR微处理器

先进的RISC结构

131条指令

大多数指令执行时间为单个时钟周期

32个8位通用工作寄存器

全静态工作

工作于16MHz时性能高达16MIPS

只需两个时钟周期的硬件乘法器

非易失性程序和数据存储器

16K字节的系统内可编程Flash,擦写寿命:10,000次

具有独立锁定位的可选Boot代码区,通过片上Boot程序实现系统内编程,真正的同时读写操

512字节的EEPROM,擦写寿命:100,000次

1K字节的片内SRAM

可以对锁定位进行编程以实现用户程序的加密

JTAG接口(与IEEE1149.1标准兼容)

符合JTAG标准的边界扫描功能

支持扩展的片内调试功能

通过JTAG接口实现对Flash、EEPROM、熔丝位和锁定位的编程

140

P1.0VCC

239

Pl.lPO.O(ADO)

338

Pl.2PO.l(ADl)

437

Pl.3P0.2(AD2)

536

Pl.4P0.3(AD3)

635

Pl.5P0.4(AD4)

734

Pl.6P().5(AD5)

833

Pl.7P0.6(AD6)

9八32

RSTP0J1AD7)

1031

P3.()(RXD)EA/VPP

1130

P3.KTXD)ALE/PROG

1229

P3.2(INT0)PSEN

1328

P3.3(INT1)P2.7(A15)

1427

P3.4(T0)P2.6(A14)

1526

P3.5(T1)P2.5(A13)

1625

P3.6(WR)P2.4(A12)

1724

P3.7(RD)P2.3(A11)

1823

XTAL2P2.2(A10)

1922

XTAL1P2.1(A9)

2021

GNDP2.0(A8)

ATMEGA16的管脚

3).日期时间生成模块

低功耗时钟芯片DS1302可以对年、月、日、时、分、秒进行计时,且具有闰年补偿等

多种功能。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现

数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析以及对异

常数据出现的原因的查找有重要意义。

采用DS1302作为记录测控系统中的数据记录,其软硬件设计简单,时间记录准确,既

避免了连续记录的大工作量,又避免了定时记录的盲目性,给连续长时间的测量、控制系统

的正常运行及检查都来了很大的方便,可广泛应用于长时间连续的测控系统中。在测量控制

系统中,特别是长时间无人职守的测控系统中,经常需要记录某些具有特殊意义的数据及其

出现的时间。记录及分析这些特殊意义的数据,对测控系统的性能分析及正常运行具有重要

的意义。传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此只能记录

数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件

资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不

允许。而在系统中采用DS1302则能很好地解决这个问题

图3-4DS1302内部结构图

2软件设计

2.1编程环境及语言

本设计是在ICCV7AVR中编程的,然后通过AVRstudio下载的。

2.2程序框图

3电路设计

3.1DS1302电路

PC5/TDIK

FC€OIMC1五4

PCr/TO9C2a

IDORXDu

PDVTXDU2

・D2HNm_!L-5—vcci工

IKMNT1r-2—VCC2

P0WC1I3

PD8OC1A-it|口X1

-a.L__冏

”7821___CTML

X2

AREF

AVCC

图3-1dsl302与单片机接口电路

3.2LCD1602电路

LCD1

U1016L

U1

2

PCDGCL

IC1G0A

-2-mi

IC2TCK

-2-XTA12

IC3T18

■C5g

JO

■心DO)EDI

亘M1ADC1FC</TO9C1

S_,心DC2FCI/TO9C2

437

至IA4AK4■DQRXD

35

IASADCSIDVTXD

Jl

,颔oce,询m

方IDHNT1

POifiCil

图3-21602液晶与单片机接口电路

3.34*4键盘电路

■^―FKmCK

》H1/T1

4lt2*WO1HT2

4—imiNtDCO

:“而

0网10*

IB&U6O

-2—»vra:K

ATBBDA16

图3-34*4key与单片机接口电路

3.4蜂鸣器电路

PD1ZFKD

POCOOIB

POSOOM

,Xdd

PDTJOC2

ARBF□Q

AMCC

图3-4蜂鸣器与单片机接口电路

3.5综合电路

4程序设计

代码分析

Yj1602函数:

voidLCD1602_sendbyte(ucharDatCmd,uchardByte)

{

if(DatCmd==iCmd)〃指令操作

LCDa_CLR_RS;

else

LCDa_SET_RS;

LCDa_CLR_RW;〃写操作

LCDa_SET_E;

LCDa_DO=dByte;〃写入数据

Delayms⑴;

LCDa_CLR_E;

)

函数名称:LCD1602_sendstr

功能:向1602液晶写入一个字符串

参数:ptSlring-字符串指针

返回值:无

voidLCD1602_sendstr(uchar*ptString)

while((*ptString)!='\0')〃字符串未结束

LCD1602_sendbyte(iDat,*ptString++);

)

)

函数名称:LCD1602_clear

功能:1602液晶清屏

参数:无

返回值:无

voidLCD1602_clear(void)

LCD1602_sendbyte(iCmd,LCDa_CLS);

Delayms⑵;〃清屏指令写入后,2ms的延时是很必要的!!!

函数名称:LCD1602_readBF

功能:1602液晶清屏

参数:无

返回值:busy-为1时忙,为0时可以接收指令

ucharLCD1602_readBF(void)

ucharbusy;

busy=LCD1602_rcadbyte(iCnid);//读回BF标志和地址

if(busy&0x80)〃忙

busy=l;

else//不忙,可以写入

busy=0;

returnbusy;

函数名称:LCD1602_gotoXY

功能:移动到指定位置

参数:Row-指定的行

Col--指定的列

返回值:无

voidLCD1602_gotoXY(ucharRow,ucharCol)

{

switch(Row)〃选择行

(

case2:

LCD1602_sendbyte(iCmd,LCDa_L2+Col);break;〃写入第2行的指定列

default:

LCD1602_sendbyte(iCmd,LCDa_Ll+Col);break;〃写入第1行的指定列

)

)

函数名称:LCD1602_initial

功能:1602液晶初始化

参数:无

返回值:无

voidLCD1602_initial(void)

Delayms(lOO);//等待内部复位

LCD1602_portini();〃端口初始化

LCD1602_sendbyte(iCmd,LCDa_FUNCTION);//功能、模式设定

while(LCDl602_readBF());

LCD1602_sendbyte(iCmd,LCDa_ON);〃打开显示

while(LCD1602_readBF());

LCD1602_clear();〃清屏

while(LCDl602_readBF());

LCD1602_sendbyte(iCmd,LCDa.ENTRY);//输入模式设定

)

Dsl302函数:

#defineRTC_CLKPD7//PCOPB7

#defineRTC_DATAPDO//PCIPB5

#defineRTC_CSPC7

#defineRTC_DDRDDRD//DDRB

#defineRTC.PORTPORTD//PORTB

#defineRTC.PINPIND//PINB

#defineRTC_CS_DDRDDRC

#defineRTC_CS_PORTPORTC

#defineRTC_CS_PINPINC

#defineLCDg_DDR_ONDDRDl=BIT(l);//LCD背光设置

#defineLCDg.ONPORTDl=BIT(l);〃LCD背光开启

#defineLCDg_OFFPORTD&=~BIT(1);//LCD背光关闭

〃命令

#defineRD0x01

#defineWR0x00

#defineC_SEC0x80〃秒

#defineC_MIN0x82〃分

#defineC_HR0x84〃时

#dcfineC_DAY0x86〃日

#defineC_MTH0x88〃月

#dcfineC_WK0x8A//星期DATE

#defineC_YR0x8C//年

#defineC_WP0x8E〃控制(写保护)

#defineC_CHARGE0x90〃涓流充电

#defineC_BURSTOxBE//时钟多字节

〃配置

#defineCLK_HALT0x80〃停止时钟控制位SECONDbit7

#defineCLK_START0x00〃启动时钟

#dcfineM12_240x80〃12/24小时值选择位HOURbit7

#definePROTECT0x80〃写保护控制位CONTROLbit7

#defineUPROTECT0x00〃写保护控制位CONTROLbit7

〃涓流充电控制常量

#defineTC_DlR20xA5//high1Diode+2KResistors

#defineTC_D2R8OxAB//low2Diodes+8KResistors

#defineTC_DISABLED0x00//Disabled(TCS<>1010orDS=00orRS=00)

//RAM命令

#defineC_RAMBASE0xC0//RAM0-RAM30«1地址需左移一位

函数名称:DS1302_init

功能:初始化DS1302的数据接口

参数:无

返回值:无

voidDS1302_portinit(void)

RTC_DDRI=BIT(RTC_CLK)IBIT(RTC_DATA)IBIT(RTC_CS);〃将时钟端(RTC_CLK)数据端

(RTJDATA)片选端(RTC_CS)设置为输出

//RTC_CS_DDRI=BIT(RTC_CS);

)

函数名称:DS1302_writeB

功能:向DS13()2写入一个字节数据(没有RST操作)

参数:byte-要写入的数据

返回值:无

voidDS1302_writeB(ucharbyte)

uchari;

for(i=0;i<8;i++)〃8位数据计数

(

RTC_PORT&=~BIT(RTC_CLK);〃拉低时钟端

if(byte&0x01)//当前位是否是1

(

RTC_PORTI=BIT(RTC_DATA);//当前位是1,拉高数据端

1

else

(

RTC_PORT&=~BIT(RTC_DATA);〃当前位是0,拉低数据端

)

Delayus(lO);〃调整时钟和脉冲宽度

RTC_PORTI=BIT(RTC_CLK);//时钟上升沿(DS1302采样数据)

byte»=l;〃数据右移1位,为送出新数据位做准备

函数名称:DS1302_readB

功能:从DS1302读出一个字节数据(没有RST操作)

参数:无

返回值:byte--读出的数据

ucharDS1302_readB(void)

{

uchari,byte=O;

RTC_DDR&=~BIT(RTC_DATA);〃将数据端口设置为输入

RTC_PORT&=~BIT(RTC_DATA);〃无上拉电阻

for(i=0;i<8;i++)〃8位数据计数

(

byte»=l;//保存读入的数据位

RTC_PORTI=BIT(RTC_CLK);//时钟上升沿

Delayus(lO);〃延时,调整时钟脉冲宽度

RTC_PORT&=~BIT(RTC_CLK);〃时钟下降沿,DS1302输出数据位

Delayus(lO);//等待数据变化(MEGA16太快,必须等待DS1302的数据位

输出,否则不能正确读出)

if(RTC_PIN&BIT(RTC_DATA))//当前位是否是高电平

(

bytel=BIT(RTC_CLK);〃是高电平就将返回数据的当前位置1

)

else

byte&=­BIT(RTC_CLK);〃是低电平就将返回数据的当前位置0

I

RTC_DDRI=BIT(RTC_DATA);〃最后将数据端口设置为输出

returnbyte;〃返回读出的数据

函数名称:DS1302_writeD

功能:向DS1302的某个地址写入一个字节数据

参数:addi地址值(寄存器或RAM)

data-要写入的地址

返回值:无

voidDS1302_writeD(ucharaddr.uchardata)

RTC_CS_PORT&=~BIT(RTC_CS);〃拉低片选端

RTC_PORT&=~BIT(RTC_CLK);〃拉低时钟端

Delayus(lO);

RTC_CS_PORT1=BIT(RTC_CS);〃拉高片选端

Delayus(lO);〃调整片选脉冲

DS1302_writeB(addr);〃写入操作命令(地址:)

Delayus(lO);

RTC_PORT&=~BIT(RTC_CLK);〃拉低时钟端

Delayus(lO);

DS1302_writeB(data);〃写入数据

RTC_PORT&=~BIT(RTC_CLK);〃拉低时钟端

Delayus(lO);〃调整片选脉冲

RTC_CS_PORT&=~BIT(RTC_CS);//拉低片选端

)

函数名称:DS1302_readD

功能:从DS1302的某个地址读出一个字节数据

参数:addr-地址值(寄存器或RAM)

返回值:data--读出的数据

ucharDS1302_readD(ucharaddr)

(

uchardata;

RTC_CS_PORT&=~BIT(RTC_CS);〃拉低片•选端

RTC_PORT&=~BIT(RTC_CLK);//拉低时钟端

Dclayus(lO);

RTC_CS_PORTI=BIT(RTC_CS);//拉高片选端

Delayus(lO);〃调整片选脉冲

DS1302_writeB(addr);〃写入操作命令(地址)

Delayus(lO);

data=DS1302_readB();〃读出数据

Delayus(lO);

RTC_PORT&=~BIT(RTC_CLK);//拉低时钟端

RTC_CS_PORT&=~BIT(RTC_CS);〃拉低片选端

returndata;〃返回读111的数据

}

函数名称:DS13O2_setT

功能:设置DS1302的时间

参数:ptTimeD-设置时间数组指针

返回值:无

voidDS1302_setT(ucharptTimeD[])

(

uchari;

ucharaddr=0x80;//写入地址从秒寄存器开始

DS1302_writeD(C_WPlWR,UPROTECT);〃控制命令,WP位为0,允许写操作

Delayms⑸;

for(i=0;i<7;i++)

(

DS1302_writeD(addrlWR,ptTimeD[i]);//秒分时日月星期年

addr+=2;

Delayms(l);

)

DS1302_writeD(C_WPIWR,PROTECT);〃控制命令,WP位为1,不允许写操作

}

函数名称:DS1302_getT

功能:读取DS1302的当前时间

参数:time口-读取的时间数组

返回值:无

voidDS1302_getT(uchartime口)

{

uchari;

/〃〃〃/下面的是单次读写///〃〃〃//〃/〃///〃〃///

/*ucharaddr=0x80;〃读取地址从秒寄存器开始

for(i=();i<7;i++)

(

time[i]=DS1302_readD(addrlRD);〃秒分时日月星期年

addr+=2;

}*/

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

/////////卜.而是多字节读取///////〃////〃

RTC_CS_PORT&=~BIT(RTC_CS);//拉低片选端

Delayus(lO);

RTC_CS_PORTI=BIT(RTC_CS);//拉高片选端

Delayus(lO);〃调整片选脉冲

DS1302_writeB(0xbf);//Oxbf:时钟多字节读取命令

for(i=0;i<8;i++)//时间数据的存放格式是:

//秒,分,时,日,月,星期,年,控制

time[il=DS1302_readB();//【7个数据(BCD格式)+1个控制】

RTC_CS_PORT&=-B1T(RTC_CS);〃拉彳氐片选端

RTC_PORT&=~B1T(RTC_CLK);//拉低时钟端(时钟端在不操作时为

低)

函数名称:DS1302_check

功能:检测DS1302是否正常工作

参数:无

返回值:exist-为TRUE为检测到DS1302,为FALSE为没检测到

ucharDS1302_check(void)

ucharexist;

DS1302_writeD(C_WPIWR,UPROTECT);〃写入写允许命令

DS1302_writeD(C_RAMBASEIWR,0xA5);//RAM0写入0xA5

exist=DS1302_readD(C_RAMBASEIRD);〃读取RAM0

if(exist==0xA5)

exist=TRUE;〃如果读取值与写入值相等,返回TRUE

)

else

exist=FALSE;〃如果读取值与写入值不相等,返回FALSE

)

returnexist;

)

函数名称:DS1302_init

功能:初始化DS1302

参数:无

返回值:无

voidDS1302_init(void)

DS1302_writeD(C_WPIWR,UPROTECT);〃写入写允许命令

DS1302_writeD(C_SECIWR,CLK_START);〃启动振荡器,DS1302开始工作

DS1302_writeD(C_WPIWR,PROTECT);〃控制命令,WP位为1,不允许写操作

函数名称:BCD_ASCI1

功能:将压缩BCD码转换成ascii码

参数:BCD-将要转换的压缩BCD码

ptasc-转换后的ASCH码数组指针

返回值:无

voidBCD_ASCII(ucharBCD.ucharptasc[])

ptasc[O]=BCD/16IOx3O;//0X583538〃转换十位

ptasc[1]=BCD&0x0FI0x30;〃转换个位

函数名称:ASCILBCD

功能:将ascii码转换成压缩BCD码

参数:

返回值:无

ucharASCII_BCD(ucharLCDstrh,ucharLCDstrl)

ucharLCDstr=(LCDstrh*16)1(LCDstrl&OxOf);

returnLCDstr;

)

函数名称:Get_change

功能:将输入的时间数据匹配成getlime数组中的形式

参数:LCDstr,gettime

返回值:无

voidGet_change(uchar*time,uchar*LCDstr)

(

uchari,asc[2];

for(i=();i<3;i++)

(

BCD_ASCII(time[2-i],asc);

LCDstr(7+i*2]=asc[0];

LCDstr[8+i*2]=asc[l];

)

BCD_ASCII(time[6],asc);

LCDstr[0]=ascf01;

LCDstr[l]=asc[l];

BCD_ASCII(time[4],asc);

LCDstr[2]=asc[0];

LCDstr[3]=asc[l];

BCD_ASCII(time[3],asc);

LCDstr[4]=asc[0];

LCDstr[5]=asc[l];

BCD_ASCH(time[5],asc);

LCDstr[6]=asc[l];

)

函数名称:Input_change(LCDstr,gettime)

功能:将输入的时间数据匹配成gettime数组中的形式

参数:LCDstr,gettime

返回值:无

voidInput_change(uchar*LCDstr,uchar*gettime)

(

uchari,week;

uintday,month,year;

for(i=0;i<13;i++)

(

switch(LCDstr[i])

(

caseT:

LCDstr[i]=0x01;

break;

case2:

LCDstrli]=0x02;

break;

case3':

LCDslr[i]=0x03;

break;

case'4':

LCDstr[iJ=0x04;

break;

case5:

LCDstrfi]=0x05;

break;

case6:

LCDstrli]=0x06;

break;

case7:

LCDstrfi]=0x07;

break;

case8:

LCDstr[i]=0x08;

break;

case'9":

LCDstr[i]=0x09;

break;

caseO:

LCDstr[i]=0x00;

break;

)

)

gettime[0]=ASCII_BCD(LCDstr[11],LCDstr[12]);

gettime[l]=ASCII_BCD(LCDstr[9],LCDstr[10]);

gettime[2]=ASCII_BCD(LCDstr[7],LCDstr[8]);

geltime[3]=ASCII_BCD(LCDstr[4],LCDstr[5]);

gettime[4]=ASCII_BCD(LCDstr[2],LCDstr[3]);

gettime[5]=LCDstr[6];

gettime[6]=ASCII_BCD(LCDstr[()],LCDstr[1]);

day=(gettime[3]&0xF0)/16*10+(gettime[3]&()x()F);

month=(gettime[4]&0xF0)/l6*10+(gettime[4]&0x0F);

year=(gettime[6]&0xF0)/16*10+(gettime[6]&0x0F);

week=(day+2*month+3*(month+1)/5+year+

year/4-year/100+year/400)%7+1;

gettime[51=(week%10)&0x0F;

)

函数名称:Noisein_change

功能:将输入的时间数据匹配成gellime数组中的形式

参数:LCDstr,gettime

返回值:无

voidNoisein_change(uchar*LCDstr,uchar*time)

(

uchari;

for(i=();i<13;i++)

(

switch(LCDstr[i])

(

case*r:

LCDstr[i]=0x01;

break;

case'2':

LCDstr[i]=0x02;

break;

case3:

LCDstr[i]=0x03;

break;

case4:

LCDstr[i]=0x04;

break;

case'5':

LCDstr[i]=0x05;

break;

case6:

LCDstr[i]=0x06;

break;

case7':

LCDslr[i]=0x07;

break;

case8:

LCDstr[i]=0x08;

break;

case9:

LCDstr[i]=0x09;

break;

caseO:

LCDstr[iJ=0x00;

break;

time[0]=ASCII_BCD(LCDstr[4],LCDstr[5]);

=ASCII_BCD(LCDstr[2],LCDstr[3]);

time[2J=ASCII_BCD(LCDstr[O],LCDstrl1J);

函数名称:Disp_time

功能:在1602液晶上显示当前时间(第】行格式:年-月一日星期;第2行格式:时-分-秒)

参数:time口-时间数组

返回值:无

//#defineLCDa_RSPCO〃定义三个控制引脚

//#defineLCDa_RWPCI

//#defineLCDa_EPC6

voidwrite_com(ucharcom)

PORTC&=-BIT(0);

PORTC&=­BIT(1);

PORTA=com;

PORTCI=BIT(6);

Delayus(lO);

PORTC&=­BIT(6);

voidwrite_date(uchardate)

(

PORTCI=BIT(0);

PORTC&=­BIT(1);

PORTA=dale;

PORTCI=B1T(6);

Delayus(lO);

PORTC&二〜BIT(6);

voidDisp_time(ucharlime[])

(

uchari,asc[2];

ucharlinel[]={O,O,'-',O,O,'-',O,O;V';';显示第1行的字符数组

ucharline2[9]={0,0;:1,0,0,':',0,0,1\0'};〃显示第2行的字符数组

write_com(()x4());〃自定义字符写ACGRAM

BCD_ASClI(timel6],asc);〃为第1行的年赋值

linel[O]=asc[()];

linel[l]=asc[l];

BCD_ASCII(time[4],asc);〃为第1行的月赋值

linelf3]=asc[O];

linel[4]=ascllj;

BCD_ASCII(time[3],asc);〃为第1行的日赋值

linel[6]=asc[0];

linel[7]=asc[ll;

s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论