完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
说明:这好似测板实例程序,单片机可以直接用他的.C文件直接烧录,但我发现它程序在keilc中不正确。
/**************************************************************** 程序名称: LCD1602显示时间 *****************************************************************/ /*头文件*/ #include #include #define uint unsigned int #define uchar unsigned char #define nop() _nop_() ***it lcd_rs_port = P3^5; /*定义LCD控制端口*/ ***it lcd_rw_port = P3^6; ***it lcd_en_port = P3^4; #define lcd_data_port P0 /////////////////////////////////////// ***it dula=P2^6;//数码管的段选信号 ***it wela=P2^7; //数码管的位选信号 void delay1 (void)//关闭数码管延时程序 { int k; for (k=0; k<1000; k++); } ////////////////////////////////////// ***it T_CLK = P3^2; /*实时时钟时钟线引脚 */ ***it T_IO = P2^4; /*实时时钟数据线引脚 */ ***it T_RST = P3^3; /*实时时钟复位线引脚 */ ***it ACC0 = ACC^0; ***it ACC7 = ACC^7; uchar code mun_to_char[] = {"0123456789ABCDEF"}; /*定义数字跟ASCII码的关系*/ uchar data time_data_buff[7]={0x00,0x00,0x09,0x01,0x01,0x04,0x09};/*格式为: 秒 分 时 日 月 星期 年 */ uchar data lcd1602_line1[]={" 2000/00/00 000"}; uchar data lcd1602_line2[]={" 00:00:00 "}; uchar code Weeks[][3]={{"SUN"},{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}}; /******************************************************************** 函 数 名:RTInputByte() 功 能:实时时钟写入一字节 说 明:往DS1302写入1Byte数据 (内部函数) 入口参数:d 写入的数据 返 回 值:无 设 计:zhaojunjie 日 期:2002-03-19 修 改: 日 期: ***********************************************************************/ void RTInputByte(uchar d) { uchar i; ACC = d; for(i=8; i>0; i--) { T_IO = ACC0; /*相当于汇编中的 RRC */ T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** 函 数 名:RTOutputByte() 功 能:实时时钟读取一字节 说 明:从DS1302读取1Byte数据 (内部函数) 入口参数:无 返 回 值:ACC 设 计:zhaojunjie 日 期:2002-03-19 修 改: 日 期: ***********************************************************************/ uchar RTOutputByte(void) { uchar i; for(i=8; i>0; i--) { ACC = CC >>1; /*相当于汇编中的 RRC */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /******************************************************************** 函 数 名:W1302() 功 能:往DS1302写入数据 说 明:先写地址,后写命令/数据 (内部函数) 调 用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址, ucData: 要写的数据 返 回 值:无 设 计:zhaojunjie 日 期:2002-03-19 修 改: 日 期: ***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr); /* 地址,命令 */ RTInputByte(ucDa); /* 写1Byte数据*/ T_CLK = 1; T_RST = 0; } /******************************************************************** 函 数 名:R1302() 功 能:读取DS1302某地址的数据 说 明:先写地址,后读命令/数据 (内部函数) 调 用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址 返 回 值:ucData :读取的数据 设 计:zhaojunjie 日 期:2002-03-19 修 改: 日 期: ***********************************************************************/ uchar R1302(uchar ucAddr) { uchar ucData; T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr); /* 地址,命令 */ ucData = RTOutputByte(); /* 读1Byte数据 */ T_CLK = 1; T_RST = 0; return(ucData); } /******************************************************************** 函 数 名:Set1302() 功 能:设置初始时间 说 明:先写地址,后读命令/数据(寄存器多字节方式) 调 用:W1302() 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 返 回 值:无 设 计:zhaojunjie 日 期:2002-03-19 修 改: 日 期: ***********************************************************************/ void Set1302(uchar *pClock) { uchar i; uchar ucAddr = 0x80; EA = 0; W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ for(i =7; i>0; i--) { W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */ pClock++; ucAddr +=2; } W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/ EA = 1; } /******************************************************************** 函 数 名:Get1302() 功 能:读取DS1302当前时间 说 明: 调 用:R1302() 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 返 回 值:无 设 计:zhaojunjie 日 期:2002-03-19 修 改: 日 期: ***********************************************************************/ void Get1302(uchar ucCurtime[]) { uchar i; uchar ucAddr = 0x81; EA = 0; for (i=0; i<7; i++) { ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr += 2; } EA = 1; } //--------------------------------------------- void lcd_delay(uchar ms) /*LCD1602 延时*/ { uchar j; while(ms--){ for(j=0;j<250;j++) {;} } } void lcd_busy_wait() /*LCD1602 忙等待*/ { lcd_rs_port = 0; lcd_rw_port = 1; lcd_en_port = 1; lcd_data_port = 0xff; while (lcd_data_port&0x80); lcd_en_port = 0; } void lcd_command_write(uchar command) /*LCD1602 命令字写入*/ { lcd_busy_wait(); lcd_rs_port = 0; lcd_rw_port = 0; lcd_en_port = 0; lcd_data_port = command; lcd_en_port = 1; lcd_en_port = 0; } void lcd_system_reset() /*LCD1602 初始化*/ { lcd_delay(20); lcd_command_write(0x38); lcd_delay(100); lcd_command_write(0x38); lcd_delay(50); lcd_command_write(0x38); lcd_delay(10); lcd_command_write(0x08); lcd_command_write(0x01); lcd_command_write(0x06); lcd_command_write(0x0c); lcd_data_port = 0xff; /*释放数据端口*/ } void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /*LCD1602 字符写入*/ { x_pos &= 0x0f; /* X位置范围 0~15 */ y_pos &= 0x01; /* Y位置范围 0~ 1 */ if(y_pos==1) x_pos += 0x40; x_pos += 0x80; lcd_command_write(x_pos); lcd_busy_wait(); lcd_rs_port = 1; lcd_rw_port = 0; lcd_en_port = 0; lcd_data_port = lcd_dat; lcd_en_port = 1; lcd_en_port = 0; lcd_data_port = 0xff; /*释放数据端口*/ } void main() { uchar i; lcd_system_reset(); /*LCD1602 初始化*/ ///////////////////////////////////////////////////////////////// P0=0X00;//关掉数码管的信号。阻止数码管受到P0口信号的影响。 dula=1; wela=0; delay1(); dula=0; wela=0; delay1(); //////////////////////////////////////////////////////////////// lcd_data_port = 0xff; /*释放P0端口*/ Set1302(time_data_buff); /*设置时间*/ while(1){ Get1302(time_data_buff); /*读取当前时间*/ /*刷新显示*/ lcd1602_line1[3] = mun_to_char[time_data_buff[6]/0x10]; lcd1602_line1[4] = mun_to_char[time_data_buff[6]%0x10]; /*年*/ lcd1602_line1[6] = mun_to_char[time_data_buff[4]/0x10]; lcd1602_line1[7] = mun_to_char[time_data_buff[4]%0x10]; /*月*/ lcd1602_line1[9] = mun_to_char[time_data_buff[3]/0x10]; lcd1602_line1[10] = mun_to_char[time_data_buff[3]%0x10]; /*日*/ for(i=0;i<3;i++) lcd1602_line1[i+13]=Weeks[time_data_buff[5]&0x07][i]; /*星期*/ lcd1602_line2[4] = mun_to_char[time_data_buff[2]/0x10]; lcd1602_line2[5] = mun_to_char[time_data_buff[2]%0x10]; /*时*/ lcd1602_line2[7] = mun_to_char[time_data_buff[1]/0x10]; lcd1602_line2[8] = mun_to_char[time_data_buff[1]%0x10]; /*分*/ lcd1602_line2[10] = mun_to_char[time_data_buff[0]/0x10]; lcd1602_line2[11] = mun_to_char[time_data_buff[0]%0x10]; for(i=0;i<16;i++) lcd_char_write(i,0,lcd1602_line1[i]); for(i=0;i<16;i++) lcd_char_write(i,1,lcd1602_line2[i]); } } 程序运行结果
|
|
相关推荐
5个回答
|
|
{:soso_e113:}
|
|
|
|
{:soso_e113:}
|
|
|
|
嗯,可以了,谢谢
|
|
|
|
楼主,程序调好了么?
|
|
|
|
1602有木有汇编的?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard EL 1板卡-i2c与从设备通讯编程示例之i2c-tools工具使用
652 浏览 0 评论
stc15f2k60s2利用串口传输字模存储到eeprom并进行点阵显示
696 浏览 1 评论
1264 浏览 0 评论
588 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-串口通讯编程示例之串口编写程序
1190 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11597 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-2 22:22 , Processed in 0.803929 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号