<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[全民电子普及网]]></title>
	  <link>http://wujieflash.blog.163.com</link>
	  <description><![CDATA[让更多的人熟悉电子知识,热爱电子,并充分的投入到电子应用中去 ]]></description>
	  <language>zh-CN</language>
	  <pubDate>Fri, 25 Jul 2008 20:09:56 +0800</pubDate>
	  <lastBuildDate>Fri, 25 Jul 2008 20:09:56 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[wujieflash]]></managingEditor>
	  <webMaster><![CDATA[wujieflash]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[全民电子普及网]]></title>
	  	<url>http://ava.blog.163.com/photo/cF3f-Ux48OHjkPKW7UMFdQ==/3383329220062356060.jpg</url>
	  	<link>http://wujieflash.blog.163.com</link>
	  </image>
  <item>
  	<title><![CDATA[经典电路二:可控硅调速直流电机]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/50247519200862572334307</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp; 最近工作需要,要控制直流电机的转速,以前没有做过类似的项目,查了好多东西,终于鼓捣出一个,实际效果还可以,现在仿真出来,供大家参考,如有更好的建议也可以告诉我.</P>
<P>原理图如下</P>
<P><A href="http://img.blog.163.com/photo/5YjJ86pu8SlQP631CRGJGg==/284852676431690166.jpg" target=_blank><IMG style="WIDTH: 646px; HEIGHT: 438px" height=360 src="http://img.blog.163.com/photo/5YjJ86pu8SlQP631CRGJGg==/284852676431690166.jpg" width=624></A></P>
<P>我简要说明一下</P>
<P>1.电源部分:</P>
<P>220伏交流经整流,再经过R3的降压和D10的稳压,提供一个和电网电压频率一样的同步信号.这一路再经过7815,提供控制电路部分的直流电源+15V.</P>
<P>2.电机控制部分</P>
<P>AC220V经整流出来经过一个可控硅和电机串联接入回路,通过控制可控硅的通断频率来控制电机的通断,从而控制了转速,这里D7的主要作用就是在电机线圈不通电的时候,把多余的能量释放掉.</P>
<P>3.控制部分</P>
<P>主要通过控制程控管Q3的通断,来产生一定平率的脉冲,通过光偶加到可控硅的门极,从而控制电机速度.</P>
<P>控制程控管的信号主要有三个:1.电压给定信号,通过调节R4,R5,R6三个电位器给定一个电压信号,中间一个也是一个调速的旋钮.2.同步信号,当电网电压过零点时,5处会产生一个0电压信号,使C7通过Q1放电,等待下一个周期来临.</P>
<P>3.反馈信号,从电机线圈端采样反馈到程控管的控制极,使输出信号更加平稳.程控管开通的长短有C7决定.</P>
<P>仿真输出波形图1:</P>
<P><A href="http://img.blog.163.com/photo/SRJlBua8N0Ud9vwBivVbTQ==/613052499276604190.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/SRJlBua8N0Ud9vwBivVbTQ==/613052499276604190.jpg"></A></P>
<P>调速旋钮R5改变一以后:</P>
<P><A href="http://img.blog.163.com/photo/FlupLdnc8jjLaOcQz8KYbQ==/613052499276604191.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/FlupLdnc8jjLaOcQz8KYbQ==/613052499276604191.jpg"></A></P>
<P>&nbsp;红色为电机线圈端的波形,绿色为程控管正极的波形.</P>
<P>从波形来看,调速效果还可以,达到预想的效果</P>
<P>以下为自己做的实验板:</P>
<P><A href="http://img.blog.163.com/photo/gZPR0OH7sVKkIM9O3RUlow==/1182194902185195821.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/gZPR0OH7sVKkIM9O3RUlow==/1182194902185195821.jpg"></A></P>
<P>&nbsp;</P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/50247519200862572334307</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/50247519200862572334307</guid>
    <pubDate>Fri, 25 Jul 2008 19:23:34 +0800</pubDate>
    <dcterms:modified>2008-07-25T19:30:57+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[教你申请免费样片]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/50247519200852910132536</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em"></P>
<P style="TEXT-INDENT: 2em">因为最近自己想开发一款产品,但芯片比较贵,我就试着去免费申请,结果真的拿到了.现在我把可以申请免费样片的网址都罗列出来,希望和我一样有心没钱的人也能享受开发的乐趣.</P>
<P style="TEXT-INDENT: 2em">1、推荐铁电存储器（未见量的限制,据说最多有人申请了100片，不知真假.） </P>
<P style="TEXT-INDENT: 2em">介绍：铁电存储器（FRAM）产品将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结合在一起。FRAM产品包括各种接口和多种密度，像工业标准的串行和并行接口，工业标准的封装类型，以及4Kbit、6Kbit、64Kbit、256Kbit和1Mbit等密度。 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.huazhoucn.com/mianfei.aspx">http://www.huazhoucn.com/mianfei.aspx</A> </P>
<P style="TEXT-INDENT: 2em">申请注意：填写好企业、姓名等内容，不然可能收不到。当然可以多几个人申请，嘿嘿 </P>
<P style="TEXT-INDENT: 2em">2、VK系列UART（一次最多2片） </P>
<P style="TEXT-INDENT: 2em">介绍：维肯公司主要提供集成电路，射频电子标签读卡模块,医疗电子产品,汽车电子产品等在类的电子产品和整体解决方案。 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.vkic.com/usermanage/login.asp">http://www.vkic.com/usermanage/login.asp</A> </P>
<P style="TEXT-INDENT: 2em">申请注意：属企业级的申请，要填正确公司、姓名、联系方式。 </P>
<P style="TEXT-INDENT: 2em">3、ADI公司（最多索取3种产品，每种2片） </P>
<P style="TEXT-INDENT: 2em">介绍：ADI含几乎所有的模拟器件产品。 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.analog.com/intl/china/orderSamples/">http://www.analog.com/intl/china/orderSamples/</A> </P>
<P style="TEXT-INDENT: 2em">4、Maxim公司（最多索取3种产品，每种2片） </P>
<P style="TEXT-INDENT: 2em">介绍：Maxim公司免费提供Maxim/Dallas样品，以方便您评估测试其性能之用。 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.maxim-ic.com.cn/samples/">http://www.maxim-ic.com.cn/samples/</A> </P>
<P style="TEXT-INDENT: 2em">申请注意：需填写该表格中的“最终产品”和“预计年用量” 两项内容 </P>
<P style="TEXT-INDENT: 2em">5、Microchip Technology Inc（最多索取5种，每种1片） </P>
<P style="TEXT-INDENT: 2em">介绍：单片机和模拟半导体供应商 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://sample.microchip.com/Default.aspx?testCookies=true">http://sample.microchip.com/Default.aspx?testCookies=true</A> </P>
<P style="TEXT-INDENT: 2em">申请注意：时间较长，2个星期 </P>
<P style="TEXT-INDENT: 2em">6、TI（(最多提供 8 种不同型号的器件样片) ） </P>
<P style="TEXT-INDENT: 2em">介绍：模拟和 DSP 技术 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://focus.ti.com.cn/cn/general/docs/gencontent.tsp?contentId=29859&amp;DCMP=TI-cn_Home_Tracking&amp;HQS=v?">http://focus.ti.com.cn/cn/general/docs/gencontent.tsp?contentId=29859&amp;DCMP=TI-cn_Home_Tracking&amp;HQS=v?</A> </P>
<P style="TEXT-INDENT: 2em">OT+home_b_samples </P>
<P style="TEXT-INDENT: 2em">申请注意：在申请前组织下运用 </P>
<P style="TEXT-INDENT: 2em">7、成都国腾 </P>
<P style="TEXT-INDENT: 2em">介绍：IC接口类、IC电源类、IC存储类、IC消费类、IC其它产品、IP类、IC通讯类 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.gticc.com/cn/khfw-ypsq1.htm">http://www.gticc.com/cn/khfw-ypsq1.htm</A> </P>
<P style="TEXT-INDENT: 2em">8、南京沁恒 </P>
<P style="TEXT-INDENT: 2em">介绍：涵盖电子电路、单片机和DSP、可编程器件、计算机硬件体系构架、计算机BIOS和系统软件 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.wch.cn/technique/index2.asp">http://www.wch.cn/technique/index2.asp</A> </P>
<P style="TEXT-INDENT: 2em">申请注意：客户需自付快递运费 </P>
<P style="TEXT-INDENT: 2em">9、飞思卡尔 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.freescale.com/webapp/sps/site/homepage.jsp?nodeId=010984007869597059286929489">http://www.freescale.com/webapp/sps/site/homepage.jsp?nodeId=010984007869597059286929489</A> </P>
<P style="TEXT-INDENT: 2em">10、美国微芯科技公司 </P>
<P style="TEXT-INDENT: 2em">介绍：以太网控制器 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.skyhic.com/">http://www.skyhic.com/</A> </P>
<P style="TEXT-INDENT: 2em">11、北天星 </P>
<P style="TEXT-INDENT: 2em">介绍：ATMEL、RAMTRON、ALLIANCE、TAISOL、ATCHIP、UTC、ESI、VIMICRO、Philips、MXIC、ST等原厂的各种芯片样品 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.po-star.http//www.mcu-memory.comcom/sample.asp">http://www.po-star. </A></P>
<P style="TEXT-INDENT: 2em">12、深圳市英蓓特信息技术有限公司 </P>
<P style="TEXT-INDENT: 2em">介绍：嵌入式开发 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.embed.com.cn/yangpian/index.asp?company_id=5089">http://www.embed.com.cn/yangpian/index.asp?company_id=5089</A> </P>
<P style="TEXT-INDENT: 2em">注意：邮资自付 </P>
<P style="TEXT-INDENT: 2em">13、润金法 </P>
<P style="TEXT-INDENT: 2em">介绍：单片机 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.ic365.com.cn/asp/apply.asp">http://www.ic365.com.cn/asp/apply.asp</A> </P>
<P style="TEXT-INDENT: 2em">注意：向企业，个人有些困难 </P>
<P style="TEXT-INDENT: 2em">14、双龙电子 </P>
<P style="TEXT-INDENT: 2em">介绍：SUNSHINE（编程器）、HILO（编程器/仿真器）、MICROTEK（仿真器）、ADVANTECH（编程器）、LEAP（编程器）、XELTEK（编程器）、 </P>
<P style="TEXT-INDENT: 2em">ENPLAS（Seckt）、3M（Socket）、CHIPTOOL（Socket）、ATMEL AVR（仿真器） </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.sl.com.cn/">http://www.sl.com.cn/</A> </P>
<P style="TEXT-INDENT: 2em">15、杭州利尔达科技 </P>
<P style="TEXT-INDENT: 2em">介绍：TI、ROHM、SIPEX、CATALYST、RAINSUN 等诸多国际著名半导体产品 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.lierda.com/">http://www.lierda.com/</A> </P>
<P style="TEXT-INDENT: 2em">16、泰仁发 </P>
<P style="TEXT-INDENT: 2em">介绍：单片机 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.tairenfa.com/apply.htm">http://www.tairenfa.com/apply.htm</A> </P>
<P style="TEXT-INDENT: 2em">17、丹特公司 </P>
<P style="TEXT-INDENT: 2em">介绍：功率转换和电力存储系统 </P>
<P style="TEXT-INDENT: 2em">申请地址：<A href="http://www.dionics-usa.com/sample_req_form.htm">http://www.dionics-usa.com/sample_req_form.htm</A></A><A href="http://www.mcu-memory.comcom/sample.asp">http://www.mcu-memory.comcom/sample.asp</A></P>
<P style="TEXT-INDENT: 2em"></P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/50247519200852910132536</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/50247519200852910132536</guid>
    <pubDate>Sun, 29 Jun 2008 10:13:02 +0800</pubDate>
    <dcterms:modified>2008-06-29T10:13:02+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[3G iPhone被指存在7大软肋]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/5024751920085285516958</link>
    <description><![CDATA[<div>《福布斯》文章指出，不管是上网、听音乐、看电影还是收发语音邮件，3G版iPhone表现得都不错，而且它比第一代iPhone速度更快，价格更便宜。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尽管苹果董事长乔布斯对产品细节精益求精，但是3G版iPhone仍存在许多不足。甚至在它发布之前，就出现了一些或大或小的问题。因此，iPhone与其他产品一样，也就是一款产品而已。　　 
<P>　　到目前为止，笔者认为它有下列七项不足或令人失望的地方：　　 </P>
<P>　　1、售价 </P>
<P>　　虽然3G版iPhone比第一代iPhone要便宜一半，售价仅199美元。但是对于消费者来说，这个价格并不算便宜。仔细算算，3G版iPhone的价格其实比第一代iPhone的价格还要贵160美元，因为AT&amp;T将另一款售价更高的服务与3G版iPhone捆绑在一起，以弥补iPhone最开始的成本。Gizmodo的败家发烧友将这称作是“在价格上玩的小把戏”，但是纽约时报的技术博客Bits将这称为“对于消费者而言的一次退步”。　　 </P>
<P>　　2、不支持Flash </P>
<P>　　IPhone的网络浏览器功能很强大。它配备的显示屏尺寸大，分辨率高，用户完全可以用手指操作。 但是它最大的问题是，不支持Adobe的Flash技术，这也就是说，它不能完全显示那些包含多媒体内容的网站。Adobe正在努力提高其技术的兼容性，但是目前iPhone仍不支持它。　　 </P>
<P>　　3、未配备可更换电池 </P>
<P>　　许多商旅人士通常都没有时间停下来给手机充电。他们一般会随身携带多块备用电池。 但是，3G版iPhone不能更换电池，这一点令消费者们颇为失望。虽然消费者可以买到DIY的工具，但是笔者建议消费者们最好不要自己去改装。　　 </P>
<P>　　4、视频录制 </P>
<P>　　苹果电脑中预装了一款视频编辑和娱乐软件iMovie。除Shuffle之外的iPod都已经可以观看视频。 但是如果消费者想录制视频，那最好去购买索尼的产品。 尽管它内建了一款200万像素的数码相机，但是苹果3G版iPhone还不能录制视频，这个功能即使连许多低端的功能手机都已经具备了。　　 </P>
<P>　　5、没有剪切与粘贴功能 </P>
<P>　　自从第一款iPhone去年上市以来，发烧友们就对不能在iPhone上使用复制与粘贴功能感到不爽。这项功能其实非常有用，比如消费者可以将博客中的一段话通过复制与粘贴功能迅速添加到电子邮件中发送给好友。 而且，这还不用改变手机的接口。　　 </P>
<P>　　6、没有多媒体信息类的服务 </P>
<P>　　福布斯的David Ewalt将3G版iPhone不支持多媒体信息服务称作最令人抓狂的问题之一。 消费者根本没办法打开好友通过短信息发来的任何图片。　　 </P>
<P>　　7、没有语音拨号功能 </P>
<P>　　到目前为止，还没有人对此提出意见。也许那是因为大家都还在抱怨iPhone的按键不好按。iPhone没有语音识别功能。正是因为这项功能，消费者们才能够在旅途中使用黑莓。</P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/5024751920085285516958</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/5024751920085285516958</guid>
    <pubDate>Sat, 28 Jun 2008 17:51:06 +0800</pubDate>
    <dcterms:modified>2008-06-28T17:51:06+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[滤波电路归纳]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/5024751920085166312815</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">
<TABLE cellSpacing=0 cellPadding=0 width=550 border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=550 border=0>
<TBODY>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></TD></TR>
<TR>
<TD height=40>电容滤波电路</TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">★滤波原理</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">◆当u2为正半周并且数值大于电容两端电压uC时，二极管D1和D3管导通，D2和D4管截止，电流一路流经负载电阻RL，另一路对电容C充电。当uC&gt;u2，导致D1和D3管反向偏置而截止，电容通过负载电阻RL放电，uC按指数规律缓慢下降。</P></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=550 border=0>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em"><IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/931.gif" border=0></P>
<P style="TEXT-INDENT: 2em"></P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">◆当u2为负半周幅值变化到恰好大于uC时，D2和D4因加正向电压变为导通状态，u2再次对C充电，uC上升到u2的峰值后又开始下降；下降到一定数值时D2和D4变为截止，C对RL放电，uC按指数规律下降；放电到一定数值时D1和D3变为导通，重复上述过程。</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">RL、C对充放电的影响：</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">电容充电时间常数为rDC，充电速度快；RLC为放电时间常数，放电速度慢。电容C愈大，负载电阻RL愈大，滤波后输出电压愈平滑，并且其平均值愈大。</P></TD></TR>
<TR>
<TD height=40>　　★输出电压平均值</TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">◆当负载开路，即 <IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/image002.gif" border=0> 时， <IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/image004.gif" border=0> ；</P>
<P style="TEXT-INDENT: 2em">◆当RLC=(3~5)T/2时，可取得较好的滤波效果， <IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/image006.gif" border=0> 。</P>
<P style="TEXT-INDENT: 2em">考虑电网电压波动范围为±10％，电容的耐压值应大于 <IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/image008.gif" border=0> 。</P></TD></TR>
<TR>
<TD height=40>　　★脉动系数</TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em"><IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/image010.gif" border=0> </P></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">★整流二极管的导通角</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">◆在未加滤波电容之前，整流电路中的二极管导通角θ为π。</P>
<P style="TEXT-INDENT: 2em">◆加滤波电容后，只有当电容充电时，二极管才导通，因此，每只二极管的导通角均小于π。</P>
<P style="TEXT-INDENT: 2em">RLC的值愈大，滤波效果愈好，导通角θ将愈小。整流二极管承的冲击电流大。</P></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">★电容滤波电路的输出特性和滤波特性</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">输出特性：当滤波电容C选定后，输出电压平均值UO(AV)和输出电流平均值IO(AV)的关系称为输出特性。</P>
<P style="TEXT-INDENT: 2em">滤波特性：脉动系数S和输出电流平均值IO(AV)的关系称为滤波特性。如下图所示，曲线表明，C愈大电路带负载能力愈强，滤波效果愈好；IO(AV)愈大（即负载电阻RL愈小），UO(AV)愈低，S的值愈大。</P>
<P style="TEXT-INDENT: 2em"></P></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=550 border=0>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em"><IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/935.gif" border=0></P>
<P style="TEXT-INDENT: 2em"></P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">小结：电容滤波电路简单，输出电压平均值高，适用于负载电流较小且其变化也较小的场合。 </P></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">倍压整流电路</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">倍压整流电路：利用滤波电容的存储作用，由多个电容和二极管可以获得几倍于变压器副边电压的输出电压，称为倍压整流电路。</P>
<P style="TEXT-INDENT: 2em">利用压整流电路可实现二倍压和多倍压。</P></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=550 border=0>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em"><IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/936.gif" border=0></P>
<P style="TEXT-INDENT: 2em"></P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">其它形式的滤波电路</P></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">★电感滤波电路</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">电感滤波后，不但负载电流及电压的脉动减小，波形变得平滑，而且整流二极管的导通角增大。L愈大，滤波效果愈好。另外，由于滤波电感电动势的作用，可以使二极管的导通角接近π，减小了二极管的冲击电流，平滑了流过二极管的电流，从而延长了整流二极管的寿命。</P></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=550 border=0>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em"><IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/938.gif" border=0></P>
<P style="TEXT-INDENT: 2em"></P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">★复式滤波电路</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">当单独使用电容或电感进行滤波时，效果仍不理想时，可采用复式滤波电路。</P></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=550 border=0>
<TBODY>
<TR>
<TD><IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/939.gif" border=0></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">★各种滤波电路的比较</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">各种滤波电路性能的比较</P></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">类型</P>
<P style="TEXT-INDENT: 2em">性能</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">电容滤波</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">电感滤波</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">LC滤波</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">RC或LC<I>π</I>型滤波</P></TD></TR>
<TR>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em"><I>UL(AV)/U2</I></P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">1.2</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">0.9</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">0.9</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">1.2</P></TD></TR>
<TR>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">θ</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">小</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">大</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">大</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">小</P></TD></TR>
<TR>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">适用场合</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">小电流负载</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">大电流负载</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">适应性较强</P></TD>
<TD width=114>
<P></P>
<P style="TEXT-INDENT: 2em">小电流负载</P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD height=20>
<P></P>
<P style="TEXT-INDENT: 2em"><IMG src="file:///C:/Documents%20and%20Settings/flashbird/桌面/PROTEUS/大学生电子设计竞赛论文/滤波器/9_3%20滤波电路归纳.files/scrool.gif" border=0></P>
<P style="TEXT-INDENT: 2em"></P></TD></TR>
<TR>
<TD height=40>
<P></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em"></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/5024751920085166312815</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/5024751920085166312815</guid>
    <pubDate>Mon, 16 Jun 2008 18:03:12 +0800</pubDate>
    <dcterms:modified>2008-07-12T17:33:18+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[万年历中公历转换农历与星期的程序]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/5024751920084139227792</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp; 一直因为工作太忙的缘故,没有把我的万年历程序修改,相信看过我博客的都清楚,原先的虽然有公历转农历的功能,但是不正确,经过热心网友帮助后,终于修改成功了,具有了日期查询的功能,现在把公历转换农历与星期的程序贴出来,给需要的人参考.</P>
<P>&nbsp;&nbsp;&nbsp; /***************************************************<BR>* 标题：公历与阴历、星期转换&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>* 日期：2008年1月18日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 说明：阴历日期与星期随公历变化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>***************************************************/<BR>static unsigned char const year_code[]={<BR>0x04,0xAe,0x53, //1901 0<BR>0x0A,0x57,0x48, //1902 3<BR>0x55,0x26,0xBd, //1903 6<BR>0x0d,0x26,0x50, //1904 9<BR>0x0d,0x95,0x44, //1905 12<BR>0x46,0xAA,0xB9, //1906 15<BR>0x05,0x6A,0x4d, //1907 18<BR>0x09,0xAd,0x42, //1908 21<BR>0x24,0xAe,0xB6, //1909<BR>0x04,0xAe,0x4A, //1910<BR>0x6A,0x4d,0xBe, //1911<BR>0x0A,0x4d,0x52, //1912<BR>0x0d,0x25,0x46, //1913<BR>0x5d,0x52,0xBA, //1914<BR>0x0B,0x54,0x4e, //1915<BR>0x0d,0x6A,0x43, //1916<BR>0x29,0x6d,0x37, //1917<BR>0x09,0x5B,0x4B, //1918<BR>0x74,0x9B,0xC1, //1919<BR>0x04,0x97,0x54, //1920<BR>0x0A,0x4B,0x48, //1921<BR>0x5B,0x25,0xBC, //1922<BR>0x06,0xA5,0x50, //1923<BR>0x06,0xd4,0x45, //1924<BR>0x4A,0xdA,0xB8, //1925<BR>0x02,0xB6,0x4d, //1926<BR>0x09,0x57,0x42, //1927<BR>0x24,0x97,0xB7, //1928<BR>0x04,0x97,0x4A, //1929<BR>0x66,0x4B,0x3e, //1930<BR>0x0d,0x4A,0x51, //1931<BR>0x0e,0xA5,0x46, //1932<BR>0x56,0xd4,0xBA, //1933<BR>0x05,0xAd,0x4e, //1934<BR>0x02,0xB6,0x44, //1935<BR>0x39,0x37,0x38, //1936<BR>0x09,0x2e,0x4B, //1937<BR>0x7C,0x96,0xBf, //1938<BR>0x0C,0x95,0x53, //1939<BR>0x0d,0x4A,0x48, //1940<BR>0x6d,0xA5,0x3B, //1941<BR>0x0B,0x55,0x4f, //1942<BR>0x05,0x6A,0x45, //1943<BR>0x4A,0xAd,0xB9, //1944<BR>0x02,0x5d,0x4d, //1945<BR>0x09,0x2d,0x42, //1946<BR>0x2C,0x95,0xB6, //1947<BR>0x0A,0x95,0x4A, //1948<BR>0x7B,0x4A,0xBd, //1949<BR>0x06,0xCA,0x51, //1950<BR>0x0B,0x55,0x46, //1951<BR>0x55,0x5A,0xBB, //1952<BR>0x04,0xdA,0x4e, //1953<BR>0x0A,0x5B,0x43, //1954<BR>0x35,0x2B,0xB8, //1955<BR>0x05,0x2B,0x4C, //1956<BR>0x8A,0x95,0x3f, //1957<BR>0x0e,0x95,0x52, //1958<BR>0x06,0xAA,0x48, //1959<BR>0x7A,0xd5,0x3C, //1960<BR>0x0A,0xB5,0x4f, //1961<BR>0x04,0xB6,0x45, //1962<BR>0x4A,0x57,0x39, //1963<BR>0x0A,0x57,0x4d, //1964<BR>0x05,0x26,0x42, //1965<BR>0x3e,0x93,0x35, //1966<BR>0x0d,0x95,0x49, //1967<BR>0x75,0xAA,0xBe, //1968<BR>0x05,0x6A,0x51, //1969<BR>0x09,0x6d,0x46, //1970<BR>0x54,0xAe,0xBB, //1971<BR>0x04,0xAd,0x4f, //1972<BR>0x0A,0x4d,0x43, //1973<BR>0x4d,0x26,0xB7, //1974<BR>0x0d,0x25,0x4B, //1975<BR>0x8d,0x52,0xBf, //1976<BR>0x0B,0x54,0x52, //1977<BR>0x0B,0x6A,0x47, //1978<BR>0x69,0x6d,0x3C, //1979<BR>0x09,0x5B,0x50, //1980<BR>0x04,0x9B,0x45, //1981<BR>0x4A,0x4B,0xB9, //1982<BR>0x0A,0x4B,0x4d, //1983<BR>0xAB,0x25,0xC2, //1984<BR>0x06,0xA5,0x54, //1985<BR>0x06,0xd4,0x49, //1986<BR>0x6A,0xdA,0x3d, //1987<BR>0x0A,0xB6,0x51, //1988<BR>0x09,0x37,0x46, //1989<BR>0x54,0x97,0xBB, //1990<BR>0x04,0x97,0x4f, //1991<BR>0x06,0x4B,0x44, //1992<BR>0x36,0xA5,0x37, //1993<BR>0x0e,0xA5,0x4A, //1994<BR>0x86,0xB2,0xBf, //1995<BR>0x05,0xAC,0x53, //1996<BR>0x0A,0xB6,0x47, //1997<BR>0x59,0x36,0xBC, //1998<BR>0x09,0x2e,0x50, //1999 294<BR>0x0C,0x96,0x45, //2000 297<BR>0x4d,0x4A,0xB8, //2001<BR>0x0d,0x4A,0x4C, //2002<BR>0x0d,0xA5,0x41, //2003<BR>0x25,0xAA,0xB6, //2004<BR>0x05,0x6A,0x49, //2005<BR>0x7A,0xAd,0xBd, //2006<BR>0x02,0x5d,0x52, //2007<BR>0x09,0x2d,0x47, //2008<BR>0x5C,0x95,0xBA, //2009<BR>0x0A,0x95,0x4e, //2010<BR>0x0B,0x4A,0x43, //2011<BR>0x4B,0x55,0x37, //2012<BR>0x0A,0xd5,0x4A, //2013<BR>0x95,0x5A,0xBf, //2014<BR>0x04,0xBA,0x53, //2015<BR>0x0A,0x5B,0x48, //2016<BR>0x65,0x2B,0xBC, //2017<BR>0x05,0x2B,0x50, //2018<BR>0x0A,0x93,0x45, //2019<BR>0x47,0x4A,0xB9, //2020<BR>0x06,0xAA,0x4C, //2021<BR>0x0A,0xd5,0x41, //2022<BR>0x24,0xdA,0xB6, //2023<BR>0x04,0xB6,0x4A, //2024<BR>0x69,0x57,0x3d, //2025<BR>0x0A,0x4e,0x51, //2026<BR>0x0d,0x26,0x46, //2027<BR>0x5e,0x93,0x3A, //2028<BR>0x0d,0x53,0x4d, //2029<BR>0x05,0xAA,0x43, //2030<BR>0x36,0xB5,0x37, //2031<BR>0x09,0x6d,0x4B, //2032<BR>0xB4,0xAe,0xBf, //2033<BR>0x04,0xAd,0x53, //2034<BR>0x0A,0x4d,0x48, //2035<BR>0x6d,0x25,0xBC, //2036<BR>0x0d,0x25,0x4f, //2037<BR>0x0d,0x52,0x44, //2038<BR>0x5d,0xAA,0x38, //2039<BR>0x0B,0x5A,0x4C, //2040<BR>0x05,0x6d,0x41, //2041<BR>0x24,0xAd,0xB6, //2042<BR>0x04,0x9B,0x4A, //2043<BR>0x7A,0x4B,0xBe, //2044<BR>0x0A,0x4B,0x51, //2045<BR>0x0A,0xA5,0x46, //2046<BR>0x5B,0x52,0xBA, //2047<BR>0x06,0xd2,0x4e, //2048<BR>0x0A,0xdA,0x42, //2049<BR>0x35,0x5B,0x37, //2050<BR>0x09,0x37,0x4B, //2051<BR>0x84,0x97,0xC1, //2052<BR>0x04,0x97,0x53, //2053<BR>0x06,0x4B,0x48, //2054<BR>0x66,0xA5,0x3C, //2055<BR>0x0e,0xA5,0x4f, //2056<BR>0x06,0xB2,0x44, //2057<BR>0x4A,0xB6,0x38, //2058<BR>0x0A,0xAe,0x4C, //2059<BR>0x09,0x2e,0x42, //2060<BR>0x3C,0x97,0x35, //2061<BR>0x0C,0x96,0x49, //2062<BR>0x7d,0x4A,0xBd, //2063<BR>0x0d,0x4A,0x51, //2064<BR>0x0d,0xA5,0x45, //2065<BR>0x55,0xAA,0xBA, //2066<BR>0x05,0x6A,0x4e, //2067<BR>0x0A,0x6d,0x43, //2068<BR>0x45,0x2e,0xB7, //2069<BR>0x05,0x2d,0x4B, //2070<BR>0x8A,0x95,0xBf, //2071<BR>0x0A,0x95,0x53, //2072<BR>0x0B,0x4A,0x47, //2073<BR>0x6B,0x55,0x3B, //2074<BR>0x0A,0xd5,0x4f, //2075<BR>0x05,0x5A,0x45, //2076<BR>0x4A,0x5d,0x38, //2077<BR>0x0A,0x5B,0x4C, //2078<BR>0x05,0x2B,0x42, //2079<BR>0x3A,0x93,0xB6, //2080<BR>0x06,0x93,0x49, //2081<BR>0x77,0x29,0xBd, //2082<BR>0x06,0xAA,0x51, //2083<BR>0x0A,0xd5,0x46, //2084<BR>0x54,0xdA,0xBA, //2085<BR>0x04,0xB6,0x4e, //2086<BR>0x0A,0x57,0x43, //2087<BR>0x45,0x27,0x38, //2088<BR>0x0d,0x26,0x4A, //2089<BR>0x8e,0x93,0x3e, //2090<BR>0x0d,0x52,0x52, //2091<BR>0x0d,0xAA,0x47, //2092<BR>0x66,0xB5,0x3B, //2093<BR>0x05,0x6d,0x4f, //2094<BR>0x04,0xAe,0x45, //2095<BR>0x4A,0x4e,0xB9, //2096<BR>0x0A,0x4d,0x4C, //2097<BR>0x0d,0x15,0x41, //2098<BR>0x2d,0x92,0xB5, //2099<BR>};</P>
<P>//月份数据表<BR>static unsigned char&nbsp; const day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};<BR>static unsigned short const day_code2[3]={0x111,0x130,0x14e};<BR>/****************************************************************************<BR>* 子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0<BR>****************************************************************************/<BR>static unsigned char GetMoonDay(unsigned char month_p,unsigned short table_addr)<BR>{<BR>&nbsp;switch (month_p)<BR>&nbsp;{<BR>&nbsp;&nbsp;case 1:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr]&amp;0x08)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1); <BR>&nbsp;&nbsp;case 2:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr]&amp;0x04)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 3:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr]&amp;0x02)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 4:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr]&amp;0x01)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 5:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x80)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 6:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x40)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 7:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x20)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 8:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x10)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 9:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x08)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 10:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x04)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 11:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x02)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 12:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+1]&amp;0x01)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;&nbsp;case 13:<BR>&nbsp;&nbsp;&nbsp;if((year_code[table_addr+2]&amp;0x80)==0)&nbsp;return(0);<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<BR>&nbsp;}<BR>&nbsp;return(0);<BR>}</P>
<P>/*********************************************************************************************************<BR>** 函数名称:GetChinaCalendar<BR>** 功能描述:公农历转换(只允许1901-2099年)<BR>** 输　入:&nbsp; year&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公历年<BR>**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; month&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公历月<BR>**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; day&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公历日<BR>**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 储存农历日期地址<BR>** 输　出:&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成功<BR>**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 失败<BR>** 作　者:&nbsp; Campo<BR>** 修&nbsp; 改:&nbsp; 赖皮<BR>** 日　期:&nbsp; 2007年02月06日<BR>**-------------------------------------------------------------------------------------------------------<BR>** 修改人:<BR>** 日　期:<BR>**------------------------------------------------------------------------------------------------------<BR>********************************************************************************************************/<BR>unsigned char GetChinaCalendar(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp; year,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char month,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char day,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char *p)<BR>{ <BR>&nbsp;unsigned char temp1,temp2,temp3,month_p,yearH,yearL;&nbsp;<BR>&nbsp;unsigned char flag_y;<BR>&nbsp;unsigned short temp4,table_addr;</P>
<P>&nbsp;yearH=year/100;&nbsp;yearL=year%100;<BR>&nbsp;if((yearH!=19)&amp;&amp;(yearH!=20))&nbsp;return(0);<BR>&nbsp;<BR>&nbsp;// 定位数据表地址 <BR>&nbsp;if(yearH==20)&nbsp;table_addr=(yearL+100-1)*3;<BR>&nbsp;else&nbsp; &nbsp;&nbsp;&nbsp;table_addr=(yearL-1)*3;</P>
<P>&nbsp;// 取当年春节所在的公历月份/<BR>&nbsp;temp1=year_code[table_addr+2]&amp;0x60;&nbsp;<BR>&nbsp;temp1&gt;&gt;=5;</P>
<P>&nbsp;// 取当年春节所在的公历日 <BR>&nbsp;temp2=year_code[table_addr+2]&amp;31; </P>
<P>&nbsp;// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月 */<BR>&nbsp;if(temp1==1) &nbsp;temp3=temp2-1; <BR>&nbsp;else &nbsp;&nbsp;&nbsp;temp3=temp2+31-1; </P>
<P>&nbsp;// 计算公历日离当年元旦的天数 <BR>&nbsp;if (month&lt;10) &nbsp;temp4=day_code1[month-1]+day-1;<BR>&nbsp;else&nbsp; &nbsp;&nbsp;&nbsp;temp4=day_code2[month-10]+day-1;<BR>&nbsp;// 如果公历月大于2月并且该年的2月为闰月,天数加1 <BR>&nbsp;if ((month&gt;2)&amp;&amp;(yearL%4==0)) &nbsp;temp4++;</P>
<P>&nbsp;// 判断公历日在春节前还是春节后 */<BR>&nbsp;if (temp4&gt;=temp3)<BR>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;temp4-=temp3;<BR>&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;month_p=1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;flag_y=0;<BR>&nbsp;&nbsp;if(GetMoonDay(month_p,table_addr)==0)&nbsp;temp1=29; //小月29天<BR>&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp1=30; //大小30天<BR>&nbsp;&nbsp;// 从数据表中取该年的闰月月份,如为0则该年无闰月 */<BR>&nbsp;&nbsp;temp2=year_code[table_addr]/16; &nbsp;<BR>&nbsp;&nbsp;while(temp4&gt;=temp1)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;temp4-=temp1;<BR>&nbsp;&nbsp;&nbsp;month_p++;<BR>&nbsp;&nbsp;&nbsp;if(month==temp2)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;flag_y=~flag_y;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(flag_y==0)month++;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else month++;<BR>&nbsp;&nbsp;&nbsp;if(GetMoonDay(month_p,table_addr)==0)&nbsp;temp1=29;<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp1=30;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;day=temp4+1;<BR>&nbsp;}<BR>&nbsp;// 公历日在春节前使用下面代码进行运算 */<BR>&nbsp;else<BR>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;temp3-=temp4;<BR>&nbsp;&nbsp;if (yearL==0)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;yearL=100-1;<BR>&nbsp;&nbsp;&nbsp;yearH=19;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else yearL--;<BR>&nbsp;&nbsp;table_addr-=3;<BR>&nbsp;&nbsp;month=12;<BR>&nbsp;&nbsp;temp2=year_code[table_addr]/16; &nbsp;<BR>&nbsp;&nbsp;if (temp2==0)&nbsp;month_p=12; <BR>&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;month_p=13; </P>
<P>&nbsp;&nbsp;flag_y=0;<BR>&nbsp;&nbsp;if(GetMoonDay(month_p,table_addr)==0)&nbsp;temp1=29; <BR>&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp1=30; <BR>&nbsp;&nbsp;while(temp3&gt;temp1)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;temp3-=temp1;<BR>&nbsp;&nbsp;&nbsp;month_p--;<BR>&nbsp;&nbsp;&nbsp;if(flag_y==0)&nbsp;&nbsp;month--;<BR>&nbsp;&nbsp;&nbsp;if(month==temp2)&nbsp;flag_y=~flag_y;<BR>&nbsp;&nbsp;&nbsp;if(GetMoonDay(month_p,table_addr)==0)&nbsp;temp1=29;<BR>&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp1=30;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;day=temp1-temp3+1;<BR>&nbsp;}</P>
<P>&nbsp;*p++=yearH;<BR>&nbsp;*p++=yearL;<BR>&nbsp;*p++=month;<BR>&nbsp;*p=day;&nbsp;<BR>&nbsp;return(1);<BR>}</P>
<P>static unsigned char const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表<BR>/*********************************************************************************************************<BR>** 函数名称:GetWeek<BR>** 功能描述:输入公历日期得到星期(只允许1901-2099年)<BR>** 输　入:&nbsp; year&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公历年<BR>**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; month&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公历月<BR>**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; day&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公历日<BR>**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 储存星期地址<BR>** 输　出:&nbsp; 无<BR>** 作　者:&nbsp; Campo<BR>** 修&nbsp; 改:&nbsp; 赖皮<BR>** 日　期:&nbsp; 2007年02月06日<BR>**-------------------------------------------------------------------------------------------------------<BR>** 修改人:<BR>** 日　期:<BR>**------------------------------------------------------------------------------------------------------<BR>********************************************************************************************************/<BR>void GetWeek(<BR>&nbsp;&nbsp;&nbsp;unsigned int year,<BR>&nbsp;&nbsp;&nbsp;unsigned char month,<BR>&nbsp;&nbsp;&nbsp;unsigned char day,<BR>&nbsp;&nbsp;&nbsp;unsigned char *p)<BR>{&nbsp;<BR>&nbsp;unsigned int temp2;<BR>&nbsp;unsigned char yearH,yearL;<BR>&nbsp;<BR>&nbsp;yearH=year/100;&nbsp;yearL=year%100;<BR>&nbsp;<BR>&nbsp;// 如果为21世纪,年份数加100 */<BR>&nbsp;if (yearH&gt;19)&nbsp; &nbsp;yearL+=100;<BR>&nbsp;// 所过闰年数只算1900年之后的 */<BR>&nbsp;temp2=yearL+yearL/4;<BR>&nbsp;temp2=temp2%7; <BR>&nbsp;temp2=temp2+day+table_week[month-1];<BR>&nbsp;if (yearL%4==0&amp;&amp;month&lt;3)&nbsp;temp2--;<BR>&nbsp;*p=(temp2%7);<BR>}</P>
<P>/*********************************************************************************************************</P>
<P>上面的程序已经得到过验证,是没有问题的,希望抛砖引玉.<BR></P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/5024751920084139227792</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/5024751920084139227792</guid>
    <pubDate>Tue, 13 May 2008 21:02:27 +0800</pubDate>
    <dcterms:modified>2008-05-13T21:02:27+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[PIC单片机实例七:SED1565型液晶串行驱动]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/50247519200821761355541</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本来我一直以为只要学会了一种液晶控制器,就够了,所以我一直使用的是KS0108,但最近有网友让我写一个液晶串行驱动.我想了一下,的确有必要,因为他的最大优点在于他省了很多端口.所以,我找到SED1565系列(和ST7565差不多)尝试写了个驱动,以回馈网友,并用PROTEUS软件仿真通过,我想实际也基本可以用的.</P>
<P>一,原理图</P>
<P><A href="http://img.blog.163.com/photo/XOqGNu_u-AzVSU7nwgmeVw==/1729382256910899983.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/XOqGNu_u-AzVSU7nwgmeVw==/1729382256910899983.jpg"></A></P>
<P>芯片的接线很少,只使用了四个口,实际的液晶端口很多,但串行只用这四个就够了.</P>
<P><A href="http://img.blog.163.com/photo/GyBtavdOLaHkkW2T2wgoMg==/5109615252228967407.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/GyBtavdOLaHkkW2T2wgoMg==/5109615252228967407.jpg"></A></P>
<P>如液晶资料上说的,当P/S端接低电平时为串口模式.</P>
<P>串行传输时的时序如下所示:</P>
<P><A href="http://img.blog.163.com/photo/-RbXhtIzbBRy-5KnACWMAw==/1694760834775283130.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/-RbXhtIzbBRy-5KnACWMAw==/1694760834775283130.jpg"></A></P>
<P>所以CS2端口可以不用,一直接高电平.A0是指示输入的是数据或是命令,高电平为数据,低电平为命令.</P>
<P>在时钟上升沿时,数据输入.</P>
<P>二.程序(PICC8.05)</P>
<P>/***********************************************<BR>* 标题：SED1565图形LCD模块驱动&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; <BR>* 作者：Flashbird&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 日期：2008.03.16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 版本：ZHX1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 说明：所用单片机为PIC16F877A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>***********************************************/<BR>#include &lt;pic.h&gt;</P>
<P>#define NOP() asm("nop")<BR>#define SI&nbsp;&nbsp;&nbsp; RB0&nbsp;&nbsp; <BR>#define SCL&nbsp;&nbsp; RB1&nbsp;&nbsp; <BR>#define A0&nbsp;&nbsp;&nbsp; RB2&nbsp;&nbsp; <BR>#define CS1&nbsp;&nbsp; RB3&nbsp;&nbsp; <BR>#define uch&nbsp;&nbsp; unsigned char</P>
<P>/**********************************************<BR>* 函数：SerialInputByte(uch dat)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 描述：从SI口串行输入8位数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>**********************************************/<BR>void SerialInputByte(uch dat)<BR>{<BR>&nbsp;uch i;<BR>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(dat&amp;0x80)SI=1;<BR>&nbsp;&nbsp;else SI=0;<BR>&nbsp;&nbsp;SCL=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //上升沿有效<BR>&nbsp;&nbsp;NOP();<BR>&nbsp;&nbsp;SCL=1;<BR>&nbsp;&nbsp;dat=dat&lt;&lt;1;<BR>&nbsp;}<BR>}</P>
<P>/**********************************************<BR>* 函数：WriteData(uch dat)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 描述：从SI口串行输入要显示的数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>**********************************************/&nbsp;<BR>void WriteData(uch dat)<BR>{<BR>&nbsp;CS1=0;<BR>&nbsp;A0=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写数据<BR>&nbsp;SerialInputByte(dat);<BR>&nbsp;CS1=1;<BR>}</P>
<P>/**********************************************<BR>* 函数：WriteCommand(uch cmd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 描述：从SI口串行输入命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>**********************************************/&nbsp;<BR>void WriteCommand(uch cmd)<BR>{<BR>&nbsp;CS1=0;<BR>&nbsp;A0=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写命令<BR>&nbsp;SerialInputByte(cmd);<BR>&nbsp;CS1=1;<BR>}</P>
<P>/**********************************************<BR>* 函数：ClearScreen()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 描述：清屏&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>**********************************************/&nbsp;<BR>void ClearScreen()<BR>{<BR>&nbsp;uch i,j;<BR>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;WriteCommand(0xb0+i);<BR>&nbsp;&nbsp;WriteCommand(0x10);<BR>&nbsp;&nbsp;WriteCommand(0x0);<BR>&nbsp;&nbsp;for(j=0;j&lt;132;j++)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;WriteData(0x00);<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>/**********************************************<BR>* 函数：SetLine(uch line)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 描述：设定页地址----X:0--7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>**********************************************/&nbsp;<BR>void SetLine(uch line)<BR>{<BR>&nbsp;line=line&amp;0x07;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //0&lt;=line&lt;=7&nbsp;<BR>&nbsp;line=line|0xb0;<BR>&nbsp;WriteCommand(line);<BR>}</P>
<P>/**********************************************<BR>* 函数：SetColumn(uch column)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 描述：设定列地址----Y:0--127&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>**********************************************/<BR>void SetColumn(uch column)<BR>{<BR>&nbsp;uch column_h,column_l;<BR>&nbsp;column=column&amp;0x7f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //0&lt;=column&lt;=127<BR>&nbsp;column_h=column&amp;0x0f0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //列地址高四位<BR>&nbsp;column_h=column&gt;&gt;4;<BR>&nbsp;column_l=column&amp;0x0f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //列地址低四位<BR>&nbsp;column_h=column_h|0x10;<BR>&nbsp;column_l=column_l|0x00;<BR>&nbsp;WriteCommand(column_h);<BR>&nbsp;WriteCommand(column_l);<BR>}</P>
<P>/**********************************************<BR>* 函数：SetOnOff(uch state)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 描述：开关显示&nbsp; 1:开显示&nbsp; 0:关显示 *<BR>**********************************************/<BR>void SetOnOff(uch state)<BR>{<BR>&nbsp;state=state|0xae;<BR>&nbsp;WriteCommand(state);<BR>}</P>
<P>/*****************************************************<BR>* 函数：Show16X16(uch line,uch comlon,const uch *pt) *<BR>* 描述：显示一个16X16的汉字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line:显示的页（0--7）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*<BR>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column:显示的列（0--127）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pt:显示字的首地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>*****************************************************/<BR>void Show16X16(uch line,uch column,const uch *pt)<BR>{<BR>&nbsp;uch i,column_temp;<BR>&nbsp;WriteCommand(0xa1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //反向显示(即从左到右显示)<BR>&nbsp;column_temp=column;<BR>&nbsp;SetColumn(column);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置起始列<BR>&nbsp;SetLine(line);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置行<BR>&nbsp;for(i=0;i&lt;16;i++)<BR>&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;WriteData(*pt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写数据<BR>&nbsp;&nbsp;*pt++;//<BR>&nbsp;&nbsp;column++;<BR>&nbsp;}<BR>&nbsp;SetLine(line+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置汉字下半部分显示页<BR>&nbsp;column=column_temp;<BR>&nbsp;SetColumn(column);<BR>&nbsp;for(i=0;i&lt;16;i++)<BR>&nbsp;{&nbsp;<BR>&nbsp;&nbsp;WriteData(*pt);<BR>&nbsp;&nbsp;*pt++;<BR>&nbsp;&nbsp;column++;<BR>&nbsp;}<BR>}<BR>//以下为测试程序<BR>/**********************************************<BR>* 函数：Init()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*<BR>* 描述：端口初始化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>**********************************************/&nbsp;<BR>void init()<BR>{<BR>&nbsp;TRISB=0;<BR>&nbsp;PORTB=0;<BR>}</P>
<P>//字库<BR>const uch huan[]=<BR>{0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,<BR>&nbsp;0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00};/*"欢",0*/<BR>const uch ying[]=<BR>{0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,<BR>&nbsp;0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00};/*"迎",1*/<BR>const uch fang[]=<BR>{0x40,0x41,0x4E,0xC4,0x00,0x08,0x08,0x08,0x09,0xFE,0x4A,0x48,0x48,0xC8,0x08,0x00,<BR>&nbsp;0x00,0x00,0x00,0x3F,0x10,0x48,0x20,0x18,0x07,0x00,0x20,0x60,0x20,0x1F,0x00,0x00};/*"访",2*/<BR>const uch wen[]=<BR>{0x00,0x00,0xF8,0x01,0x06,0xE0,0x22,0x22,0x22,0x22,0xE2,0x02,0x02,0xFE,0x00,0x00,<BR>&nbsp;0x00,0x00,0xFF,0x00,0x00,0x03,0x02,0x02,0x02,0x02,0x03,0x40,0x80,0x7F,0x00,0x00};/*"问",3*/</P>
<P>//滚动显示“欢迎访问”<BR>void test()<BR>{<BR>&nbsp;int i;<BR>&nbsp;uch set=0;<BR>&nbsp;uch column=32;<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;Show16X16(3,column,huan);<BR>&nbsp;&nbsp;Show16X16(3,column+16,ying);<BR>&nbsp;&nbsp;Show16X16(3,column+32,fang);<BR>&nbsp;&nbsp;Show16X16(3,column+48,wen);<BR>&nbsp;&nbsp;for(i=0;i&lt;4000;i++);<BR>&nbsp;&nbsp;if(set==0)column--;<BR>&nbsp;&nbsp;if(set==1)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;column++;<BR>&nbsp;&nbsp;&nbsp;SetColumn(column-1);<BR>&nbsp;&nbsp;&nbsp;SetLine(3);<BR>&nbsp;&nbsp;&nbsp;WriteData(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //擦除前面显示的数据<BR>&nbsp;&nbsp;&nbsp;SetColumn(column-1);<BR>&nbsp;&nbsp;&nbsp;SetLine(4);<BR>&nbsp;&nbsp;&nbsp;WriteData(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //擦除前面显示的数据<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if(column==0)set=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果到最左，就往右移<BR>&nbsp;&nbsp;if((column+48)==111)set=0;&nbsp; //如果到最右，就往左移<BR>&nbsp;}<BR>}</P>
<P>void main()<BR>{<BR>&nbsp;init();<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;test(32);<BR>&nbsp;}<BR>}<BR>三.总结</P>
<P>由于前段时间太忙,让网友久等了,谢谢他对我的支持,如有不对的地方,请指出,共同探讨.&nbsp;&nbsp;&nbsp;&nbsp; </P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/50247519200821761355541</comments>
    <slash:comments>4</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/50247519200821761355541</guid>
    <pubDate>Mon, 17 Mar 2008 18:13:55 +0800</pubDate>
    <dcterms:modified>2008-03-17T18:13:55+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[自己改装三菱FX系列编程电缆]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/5024751920082119147111</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近由于工作的调整,开始接触三菱PLC.但是我们公司只有一根编程电缆,但用的人很多,插来拔去实在很麻烦,买买又很贵,所以查了好多资料,决定自己用现有的RS232线改制,下面是接线图.</P>
<P>&nbsp;</P>
<P><A href="http://img.blog.163.com/photo/T2H_IwkJg3Nxu1togkMOdw==/1731915531701280312.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/T2H_IwkJg3Nxu1togkMOdw==/1731915531701280312.jpg"></A></P>
<P><A href="http://img.blog.163.com/photo/BbRN9D7FzNGnQnD5j8xZpQ==/1731915531701280302.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/BbRN9D7FzNGnQnD5j8xZpQ==/1731915531701280302.jpg"></A></P>
<P>几点需要说明:</P>
<P>1.RS232,RS422均是全双工通讯,只是电平信号相反且电压不同,本图采用422单边驱动的方式,这样就和RS232基本相同了.</P>
<P>2.电阻的作用主要用来限制电流,防止电流过大烧坏通讯端口.我用的是3K的电阻,效果良好.</P>
<P>3.不要在两头都带电的情况下插拔电缆,以免烧坏通讯端口.</P>
<P>经一段时间用下来,没有出现任何异常情况,且适合FX1N,FX2N等多种机型.</P>
<P>这样经后学习PLC就方便多了,再不用和同事们抢电缆了.希望有兴趣的朋友和我多多讨论啊.</P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/5024751920082119147111</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/5024751920082119147111</guid>
    <pubDate>Tue, 11 Mar 2008 21:01:47 +0800</pubDate>
    <dcterms:modified>2008-03-11T21:01:47+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[PIC单片机实例六:基于PROTEUS模拟的精美调光台灯]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/5024751920081361420332</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp; 马上要过年了,明天就要发工资了,我今天把这个实例贴出来,这一年的工作和学习就告一段落了,朋友们,我们明年再见了.</P>
<P>一.原理和功能介绍</P>
<P>1.PROTEUS模拟的效果图如下:</P>
<P><A href="http://img.blog.163.com/photo/WuOluhiCoaXd8afcGFA4Eg==/1148699379956749236.jpg" target=_blank><IMG height=379 src="http://img.blog.163.com/photo/WuOluhiCoaXd8afcGFA4Eg==/1148699379956749236.jpg" width=529></A></P>
<P>我简要介绍一下系统的组成及各部分的功能</P>
<P>本系统主要有五部分构成:</P>
<P>1.显示和键盘</P>
<P>显示采用的是最常用最便宜的1602液晶,内藏HD44780,且内含简单字库.指令简单,容易上手</P>
<P>键盘部分由7个按键和一个电位器旋钮组成系统的输入部分.(如图)</P>
<P>2.运算处理单元</P>
<P>本系统的所有操作都由PIC16F877A单片机完成(选择他的理由:端口多,不需扩展)</P>
<P>3.存储单元</P>
<P>主要由一片24C01的1K内存的EEPROM完成,此芯片与单片机通过I2C总线通信,具有占有端口少的优点.</P>
<P>4.输出控制单元</P>
<P>由一片光耦和一个双向晶闸管组成.单片机输出的脉冲通过控制光耦的通断控制双向晶闸管的通断,从而控制电灯的亮度.</P>
<P>5.时钟单元</P>
<P>这是一个附加单元,对本系统无关键作用,只是为了增加附加值.有一片DS1302时钟芯片和一个32768Hz的晶振组成</P>
<P>&nbsp;</P>
<P>功能说明</P>
<P>1.一上电,系统显示"ADJUST"可调状态,此时旋钮调节光的亮度,即PWM波的占空比,如果此时按下"存储"键,则此时的亮度值被记录下来并保存,共可以记录下三个不同的亮度.</P>
<P>2.如你按下"模式"键,此时旋钮被屏蔽,只能调用你存储的三个亮度值,分别为"MODE 1","MODE 2","MODE 3"方便你的使用.</P>
<P>3.时间设置的两个按键可以实时调整时间.</P>
<P>二.程序(picc 8.05)</P>
<P>1.主程序</P>
<P>/***************************************************************<BR>* 标题：PWM输出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*<BR>* 日期：2008年1月25日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 功能：使用PIC的CCP模块输出PWM波&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>***************************************************************/<BR>#include &lt;pic.h&gt;<BR>#include "LCD1602_init.h"<BR>#include "ds1302.h"<BR>#include "i2c.h"</P>
<P>static volatile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit&nbsp;GODONE&nbsp;&nbsp;@ ((unsigned)&amp;ADCON0*8)+2;<BR>uch k,kb,kmem;<BR>void PWMinit()<BR>{<BR>&nbsp;&nbsp;TRISC=0xfb;//设置C口状态<BR>&nbsp;PORTC=0x00;<BR>&nbsp;PR2=0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置PWM波的周期<BR>&nbsp;CCP1CON=0x0c;<BR>&nbsp;CCPR1L=0x1c;//设置占空比<BR>&nbsp;<BR>&nbsp;T2CON=0x01; //设置1:4预分频<BR>&nbsp;TMR2ON=1;&nbsp;&nbsp; //开启定时器2<BR>}<BR>/*-------------------------------------------------------*/</P>
<P>void AD_convert_init()&nbsp;&nbsp;&nbsp;&nbsp; //旋钮采样输出<BR>{<BR>&nbsp;uch i;<BR>&nbsp;ADCON1=0x00;<BR>&nbsp;ADCON0=0x01;<BR>&nbsp;for(i=0;i&lt;100;i++);<BR>&nbsp;GODONE=1;<BR>}<BR>/*-------------------------------------------------------*/</P>
<P>void ADScan()<BR>{<BR>&nbsp;<BR>&nbsp;if(GODONE==0)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(ADRESH&gt;0xe3)ADRESH=0xe3;&nbsp;&nbsp; //限制占空比的范围<BR>&nbsp;&nbsp;if(ADRESH&lt;0x1c)ADRESH=0x1c;<BR>&nbsp;&nbsp;CCPR1L=ADRESH;<BR>&nbsp;&nbsp;GODONE=1;<BR>&nbsp;&nbsp;<BR>&nbsp;}<BR>}<BR>/*-------------------------------------------------------*/</P>
<P>void KeyScan()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置时间子程序<BR>{<BR>&nbsp;int d;<BR>&nbsp;<BR>&nbsp;if(RC6==0)&nbsp; //设置键按下<BR>&nbsp;{<BR>&nbsp;&nbsp;k++;&nbsp;&nbsp;&nbsp; //选定入口值<BR>&nbsp;&nbsp;k=k%3;<BR>&nbsp;}<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(RC6==1)break;//等待按键松开<BR>&nbsp;}<BR>&nbsp;switch(k)//键盘服务入口<BR>&nbsp;{<BR>&nbsp;&nbsp;case 1://设置分<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x83);//读取分<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;//转换为16进制<BR>&nbsp;&nbsp;&nbsp;minute=flag;&nbsp;&nbsp; //设置秒的闪烁标志<BR>&nbsp;&nbsp;&nbsp;hour=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其余变量不闪烁<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;if(minute==0)&nbsp; //闪烁<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteCommand_1602(0xce);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RC7==0)&nbsp;&nbsp;&nbsp;&nbsp; //分数值加1<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x3b)d=0;//大于59就为0<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x82,d);//写入DS1302<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RC7==1)break;//等待键松开<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 2://设置时<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x85);//读取时<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;//转换为16进制<BR>&nbsp;&nbsp;&nbsp;hour=flag;&nbsp;&nbsp; //设置秒的闪烁标志<BR>&nbsp;&nbsp;&nbsp;minute=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其余变量不闪烁<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;if(hour==0)&nbsp; //闪烁<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteCommand_1602(0xcb);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RC7==0)&nbsp;&nbsp;&nbsp;&nbsp; //时数值加1<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x17)d=0;//大于59就为0<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x84,d);//写入DS1302<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RC7==1)break;//等待键松开<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 0://设置完毕，不闪烁<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;minute=1;<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}<BR>/*-------------------------------------------------------*/</P>
<P>void KeyScan1()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出显示子程序<BR>{<BR>&nbsp;if(RC0==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模式键<BR>&nbsp;{<BR>&nbsp;&nbsp;kb++;<BR>&nbsp;&nbsp;kb=kb%2;<BR>&nbsp;}<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(RC0==1)break;<BR>&nbsp;}<BR>&nbsp;switch(kb)<BR>&nbsp;{<BR>&nbsp;&nbsp;case 0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //可调模式,<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;ADON=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//旋钮有效<BR>&nbsp;&nbsp;&nbsp;WriteCommand_1602(0x80);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('A');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('D');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('J');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('U');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('S');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('T');<BR>&nbsp;&nbsp;&nbsp;WriteCommand_1602(0x8a);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if(RC5==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //存储键<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;kmem++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;kmem=kmem%3;<BR>&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(RC5==1)break;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;switch(kmem)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 1:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_24cl01b(0x00,ADRESH);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写入第一通道<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteCommand_1602(0x8a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('C');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('H');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('1');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('O');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('K');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_24cl01b(0x01,ADRESH);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写入第二通道<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteCommand_1602(0x8a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('C');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('H');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('2');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('O');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('K');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_24cl01b(0x02,ADRESH);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写入第三通道<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteCommand_1602(0x8a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('C');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('H');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('3');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('O');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('K');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //"MODE"模式<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;ADON=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //屏蔽旋钮<BR>&nbsp;&nbsp;&nbsp;WriteCommand_1602(0x80);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('M');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('O');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('D');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602('E');<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x0);<BR>&nbsp;&nbsp;&nbsp;WriteData_1602(0x0);</P>
<P>&nbsp;&nbsp;&nbsp;if(RC1==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模式一<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CCPR1L=r_24cl01b(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ADRESH=r_24cl01b(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(RC1==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteCommand_1602(0x8a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('C');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('H');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('1');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RC3==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模式二<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CCPR1L=r_24cl01b(0x01);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ADRESH=r_24cl01b(0x01);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(RC3==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteCommand_1602(0x8a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('C');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('H');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('2');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RC4==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模式三<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CCPR1L=r_24cl01b(0x02);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ADRESH=r_24cl01b(0x02);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(RC4==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteCommand_1602(0x8a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('C');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('H');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602('3');<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}<BR>/*-------------------------------------------------------*/</P>
<P>void DisplaySet(uch val)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示占空比子程序<BR>{<BR>&nbsp;int pwm,pwm_shi,pwm_ge;<BR>&nbsp;if(val&gt;0xe3)val=0xe3;<BR>&nbsp;if(val&lt;0x1c)val=0x1c;<BR>&nbsp;pwm=val*100/255;<BR>&nbsp;pwm_shi=0x30+pwm/10;<BR>&nbsp;pwm_ge=0x30+pwm%10;<BR>&nbsp;WriteCommand_1602(0xc4);<BR>&nbsp;WriteData_1602(pwm_shi);<BR>&nbsp;WriteData_1602(pwm_ge);<BR>&nbsp;WriteData_1602('%');<BR>}<BR>/*-------------------------------------------------------*/</P>
<P>void main()<BR>{<BR>&nbsp;init1602();<BR>&nbsp;i2c_init();<BR>&nbsp;AD_convert_init();<BR>&nbsp;TMR1init();<BR>&nbsp;PWMinit();<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;ADScan();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;DisplaySet(ADRESH);<BR>&nbsp;&nbsp;FlashMaohao();<BR>&nbsp;&nbsp;DisplayTime1602();<BR>&nbsp;&nbsp;KeyScan();<BR>&nbsp;&nbsp;KeyScan1();<BR>&nbsp;}<BR>}<BR>2.I2C子程序</P>
<P>/***************************************************************<BR>* 标题：I2C协议&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 日期：2008年2月2日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 功能：I2C通讯协议&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>***************************************************************/<BR>#define nop() asm("nop")<BR>#define SCL&nbsp;&nbsp; RD6<BR>#define SDA&nbsp;&nbsp; RD7</P>
<P>void i2c_init()<BR>{<BR>&nbsp;TRISD6=0;<BR>&nbsp;TRISD7=0;<BR>&nbsp;RD6=0;<BR>&nbsp;RD7=0;<BR>}<BR>/*------------------------------------------------------------------*/<BR>//start<BR>void start_iic()<BR>{<BR>&nbsp;SDA=1;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SCL=1;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SDA=0;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SCL=0;//it is ready to send data<BR>&nbsp;nop();<BR>}<BR>/*------------------------------------------------------------------*/&nbsp;<BR>//stop<BR>void stop_iic(void)<BR>{<BR>&nbsp;SDA=0;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SCL=1;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SDA=1;<BR>&nbsp;nop();<BR>}<BR>/*------------------------------------------------------------------*/<BR>//send ack<BR>void ack_iic()<BR>{<BR>&nbsp;SDA=0;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SCL=1;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SCL=0;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>}<BR>/*------------------------------------------------------------------*/<BR>//send nack<BR>void nack_iic()<BR>{<BR>&nbsp;SDA=1;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SCL=1;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>&nbsp;SCL=0;<BR>&nbsp;nop();<BR>&nbsp;nop();<BR>}<BR>/*------------------------------------------------------------------*/<BR>//send 1 byte<BR>void send_iic(char c)<BR>{<BR>&nbsp;uch i;<BR>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;SCL=0;<BR>&nbsp;&nbsp;if((c&lt;&lt;i)&amp;0x80)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SDA=1;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SDA=0;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;SCL=1;<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;SCL=0;<BR>&nbsp;&nbsp;nop();<BR>&nbsp;}<BR>&nbsp;&nbsp;SDA=1;<BR>&nbsp;&nbsp;TRISD7=1;<BR>&nbsp;&nbsp;SCL=1;<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;SCL=0;<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;TRISD7=0;<BR>}<BR>/*------------------------------------------------------------------*/<BR>//receive 1 byte<BR>uch receive_iic(void)<BR>{<BR>&nbsp;uch rxbuf=0;<BR>&nbsp;uch i;<BR>&nbsp;//SDA=1;<BR>&nbsp;<BR>&nbsp;TRISD7=1;<BR>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;SCL=0;<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;SCL=1;<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;rxbuf=rxbuf&lt;&lt;1;<BR>&nbsp;&nbsp;if(SDA==1)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;rxbuf=rxbuf+1;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;nop();<BR>&nbsp;&nbsp;nop();<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;SCL=0;<BR>&nbsp;nop();<BR>&nbsp;TRISD7=0;<BR>&nbsp;return(rxbuf);<BR>}<BR>/*------------------------------------------------------------------*/<BR>//write 24cl01b subroutine<BR>void w_24cl01b(unsigned char addr,unsigned char data)<BR>{<BR>&nbsp;int i;<BR>&nbsp;start_iic();<BR>&nbsp;send_iic(0xa0);<BR>&nbsp;send_iic(addr);<BR>&nbsp;send_iic(data);<BR>&nbsp;stop_iic();<BR>&nbsp;for(i=0;i&lt;500;i++);<BR>}<BR>/*------------------------------------------------------------------*/&nbsp;<BR>//read 24cl01b subroutine<BR>char r_24cl01b(unsigned char addr)<BR>{<BR>&nbsp;int i;<BR>&nbsp;uch data;<BR>&nbsp;start_iic();<BR>&nbsp;send_iic(0xa0);<BR>&nbsp;send_iic(addr);<BR>&nbsp;<BR>&nbsp;start_iic();<BR>&nbsp;send_iic(0xa1);<BR>&nbsp;<BR>&nbsp;data=receive_iic();<BR>&nbsp;&nbsp;&nbsp; nack_iic();<BR>&nbsp;stop_iic();<BR>&nbsp;for(i=0;i&lt;1000;i++);<BR>&nbsp;return(data);<BR>&nbsp;}<BR></P>
<P>3.1602操作子程序</P>
<P>/***************************************************************<BR>* 标题：LCD1602驱动&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 日期：2008年1月29日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 功能：驱动1602液晶的驱动程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>***************************************************************/<BR>#include &lt;pic.h&gt;</P>
<P>#define RS RD0<BR>#define RW RD1<BR>#define E&nbsp; RD2</P>
<P>#define uch unsigned char</P>
<P>//延时子程序<BR>void delay_1602(int time)<BR>{<BR>&nbsp;while(time--);<BR>}<BR>/*-----------------------------------------------*/</P>
<P>//写命令子程序<BR>void WriteCommand_1602(uch command)<BR>{<BR>&nbsp;RS=0;<BR>&nbsp;RW=0;<BR>&nbsp;<BR>&nbsp;delay_1602(400);<BR>&nbsp;E=1;<BR>&nbsp;PORTB=command;<BR>&nbsp;E=0;<BR>}<BR>/*-----------------------------------------------*/</P>
<P>//写数据子程序<BR>void WriteData_1602(uch data)<BR>{<BR>&nbsp;RS=1;<BR>&nbsp;RW=0;<BR>&nbsp;<BR>&nbsp;delay_1602(400);<BR>&nbsp;E=1;<BR>&nbsp;PORTB=data;<BR>&nbsp;E=0;<BR>}<BR>/*-----------------------------------------------*/</P>
<P>//初始化LCD1602子程序<BR>void init1602()<BR>{<BR>&nbsp;TRISD0=0;<BR>&nbsp;TRISD1=0;<BR>&nbsp;TRISD2=0;<BR>&nbsp;RD0=0;<BR>&nbsp;RD1=0;<BR>&nbsp;RD2=0;<BR>&nbsp;TRISB=0;<BR>&nbsp;PORTB=0;<BR>&nbsp;WriteCommand_1602(0x01);<BR>&nbsp;WriteCommand_1602(0x38);<BR>&nbsp;WriteCommand_1602(0x0c);<BR>&nbsp;WriteCommand_1602(0x80);<BR>&nbsp;//WriteData_1602('M');<BR>&nbsp;//WriteData_1602('O');<BR>&nbsp;//WriteData_1602('D');<BR>&nbsp;//WriteData_1602('E');<BR>&nbsp;//WriteData_1602(':');<BR>&nbsp;WriteCommand_1602(0xc0);<BR>&nbsp;WriteData_1602('P');<BR>&nbsp;WriteData_1602('W');<BR>&nbsp;WriteData_1602('M');<BR>&nbsp;WriteData_1602(':');<BR>}<BR>4.时钟子程序</P>
<P>/***************************************************************<BR>* 标题：DS1302数字时钟&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 日期：2008年1月29日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 功能：显示日历与时间的程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>***************************************************************/<BR>#define&nbsp; RST&nbsp; RD3<BR>#define&nbsp; SCLK RD4 <BR>#define&nbsp; IO&nbsp;&nbsp; RD5<BR>uch flag=0;<BR>uch minute=1,hour=1;<BR>uch clock[]={0};<BR>uch DisCash[]={0x00,0x30,0x09,0x16,0x01,0x03,0x09};&nbsp;<BR>/////往1302写入1Byte数据////////////////////////<BR>void RTInputByte(uch d) <BR>{ <BR>&nbsp;&nbsp;&nbsp; uch i;<BR>&nbsp;&nbsp;&nbsp; TRISD3=0;<BR>&nbsp;&nbsp;&nbsp; TRISD4=0;<BR>&nbsp;&nbsp;&nbsp; TRISD5=0;<BR>&nbsp;&nbsp;&nbsp; for(i=8; i&gt;0; i--)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IO = d&amp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取最低位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //上升沿发送<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //恢复<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d = d &gt;&gt; 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; } <BR>}<BR>///////从1302读取1Byte数据////////////////////////<BR>uch RTOutputByte(void) <BR>{ <BR>&nbsp;&nbsp;&nbsp; uch i,val=0;<BR>&nbsp;&nbsp;&nbsp; TRISD5=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置为输入<BR>&nbsp;&nbsp;&nbsp; for(i=8; i&gt;0; i--)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val = val &gt;&gt;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(IO)val=val|0x80;// 从最低位开始接收<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下降沿接收<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 0; <BR>&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp; TRISD5=0; <BR>&nbsp;&nbsp;&nbsp;&nbsp; return(val); <BR>}<BR>///////先写地址，后写命令/数据//////////////////////////<BR>void W1302(uch ucAddr, uch ucDa)<BR>{<BR>&nbsp;&nbsp;&nbsp; RST = 0;<BR>&nbsp;&nbsp;&nbsp; SCLK = 0;<BR>&nbsp;&nbsp;&nbsp; RST = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开DS1302<BR>&nbsp;&nbsp;&nbsp; RTInputByte(ucAddr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 地址，命令 */<BR>&nbsp;&nbsp;&nbsp; RTInputByte(ucDa);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 写1Byte数据*/<BR>&nbsp;&nbsp;&nbsp; SCLK = 1;<BR>&nbsp;&nbsp;&nbsp; RST = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关闭DS1302<BR>}<BR>///////先写地址，后读命令/数据////////////////////////<BR>uch R1302(uch ucAddr)<BR>{<BR>&nbsp;&nbsp;&nbsp; uch ucData;<BR>&nbsp;&nbsp;&nbsp; RST = 0;<BR>&nbsp;&nbsp;&nbsp; SCLK = 0;<BR>&nbsp;&nbsp;&nbsp; RST = 1;<BR>&nbsp;&nbsp;&nbsp; RTInputByte(ucAddr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 地址，命令 */<BR>&nbsp;&nbsp;&nbsp; ucData = RTOutputByte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 读1Byte数据 */<BR>&nbsp;&nbsp;&nbsp; SCLK = 1;<BR>&nbsp;&nbsp;&nbsp; RST = 0;<BR>&nbsp;&nbsp;&nbsp; return(ucData);<BR>}<BR>/////////向1302写入 秒 分 时 日 月 星期 年 */////////////<BR>void Set1302(uch *pClock) <BR>{<BR>&nbsp;&nbsp;&nbsp; uch i;<BR>&nbsp;&nbsp;&nbsp; uch ucAddr = 0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //起使地址<BR>&nbsp;&nbsp;&nbsp; W1302(0x8e,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///* 控制命令,WP=0,允许写操作*/<BR>&nbsp;&nbsp;&nbsp; for(i =7; i&gt;0; i--)<BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; W1302(ucAddr,*pClock);&nbsp;&nbsp;&nbsp; ///* 秒 分 时 日 月 星期 年 */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pClock++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucAddr +=2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写地址加2<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; W1302(0x8e,0x80);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 控制命令,WP=1,写保护*/<BR>}<BR>////////从1302读出 秒 分 时 日 月 星期 年 *//////////////////<BR>void v_Get1302(unsigned char&nbsp; ucCurtime[]) <BR>{<BR>unsigned char i;<BR>unsigned char ucAddr = 0x81;<BR>for(i=0;i&lt;7;i++)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucCurtime[i] = R1302(ucAddr);///*格式为: 秒 分 时 日 月 星期 年 */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucAddr += 2;<BR>&nbsp;&nbsp; }<BR>}</P>
<P>//使用LCD1602显示<BR>void DisplayTime1602()<BR>{<BR>&nbsp;uch hour_shi,hour_ge,minute_shi,minute_ge;<BR>&nbsp;v_Get1302(clock);<BR>&nbsp;hour_shi=0x30+clock[2]/16;<BR>&nbsp;hour_ge=0x30+clock[2]%16;<BR>&nbsp;minute_shi=0x30+clock[1]/16;<BR>&nbsp;minute_ge=0x30+clock[1]%16;<BR>&nbsp;<BR>&nbsp;if(hour==1)<BR>&nbsp;{WriteCommand_1602(0x80+0x4b);<BR>&nbsp;&nbsp;WriteData_1602(hour_shi);<BR>&nbsp;&nbsp;WriteData_1602(hour_ge);<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;if(minute==1)<BR>&nbsp;{WriteCommand_1602(0x80+0x4e);<BR>&nbsp;&nbsp;WriteData_1602(minute_shi);<BR>&nbsp;&nbsp;WriteData_1602(minute_ge);<BR>&nbsp;}<BR>}<BR>//TRM1初始化子程序<BR>void TMR1init()<BR>{<BR>&nbsp;//TRM1 INITIAL<BR>&nbsp;&nbsp; T1CON=0X30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8分频<BR>&nbsp;&nbsp; TMR1IF=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //清中断标志<BR>&nbsp;&nbsp; TMR1IE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使能定时器1中断<BR>&nbsp;&nbsp; TMR1L=0XDB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始值（定时0.5S）<BR>&nbsp;&nbsp; TMR1H=0X0B;<BR>&nbsp;&nbsp; TMR1ON=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //开定时器1<BR>}</P>
<P>//冒号闪烁子程序<BR>void FlashMaohao()<BR>{<BR>&nbsp;if(TMR1IF==1)<BR>&nbsp;{<BR>&nbsp;&nbsp;TMR1ON=0;<BR>&nbsp;&nbsp;TMR1IF=0;<BR>&nbsp;&nbsp;TMR1L=0XDB;&nbsp;&nbsp;&nbsp;&nbsp; //重新付初值<BR>&nbsp;&nbsp;&nbsp;&nbsp; TMR1H=0X0B;<BR>&nbsp;&nbsp;&nbsp;&nbsp; flag++;<BR>&nbsp;&nbsp;&nbsp;&nbsp; flag=flag%2;&nbsp;&nbsp;&nbsp; //闪烁标志在0-1间翻转<BR>&nbsp;&nbsp;&nbsp;&nbsp; TMR1ON=1;<BR>&nbsp;}<BR>&nbsp;if(flag==0)<BR>&nbsp;{<BR>&nbsp;&nbsp;WriteCommand_1602(0xcd);<BR>&nbsp;&nbsp;WriteData_1602(':');<BR>&nbsp;}<BR>&nbsp;if(flag==1)<BR>&nbsp;{<BR>&nbsp;&nbsp;WriteCommand_1602(0xcd);<BR>&nbsp;&nbsp;WriteData_1602(0x00);<BR>&nbsp;}<BR>}<BR></P>
<P>三.总结</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 虽然是完成了,但还有很多遗憾:</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 1.并没有完全仿真出来,主要由于软件需要的数字和模拟器件太多,资源太多,运行不过来.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 2.有些实物已经验证的程序在PROTEUS上却失败,如24C01能写入,却读出来总为0,事实却可以的.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 3.程序逻辑性还是差了点,感觉很混乱.</P>
<P>大家如有兴趣,帮我改改I2C的程序,让他能仿真出来.</P>
<P>最后祝大家新年快乐,万事如意!</P>
<P>&nbsp;</P></div>]]></description>
	    <author><![CDATA[wujieflash]]></author>
	    <comments>http://wujieflash.blog.163.com/blog/static/5024751920081361420332</comments>
    <slash:comments>10</slash:comments>
    <guid isPermaLink="true">http://wujieflash.blog.163.com/blog/static/5024751920081361420332</guid>
    <pubDate>Sun, 3 Feb 2008 18:14:20 +0800</pubDate>
    <dcterms:modified>2008-02-03T18:14:20+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[PIC单片机实例五:基于PROTEUS模拟的精美万年历]]></title>	
    <link>http://wujieflash.blog.163.com/blog/static/5024751920080226525471</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了把KS0108系列的液晶吃透,特别制作了这款万年历,感觉效果还是不错的.希望大家分享我的喜悦,毕竟有了更多志同道合的朋友支持,我才能更进一步提高.</P>
<P>一,原理介绍</P>
<P><A href="http://img.blog.163.com/photo/YqltXkxL2l8IUdg4kc1ngw==/5376172055173755897.jpg" target=_blank><IMG style="WIDTH: 567px; HEIGHT: 412px" height=426 src="http://img.blog.163.com/photo/YqltXkxL2l8IUdg4kc1ngw==/5376172055173755897.jpg" width=581></A></P>
<P>说明:</P>
<P>1.单片机还是采用PIC中最经典的PIC16F877A,端口多,功能全,特别是他有8K的ROM,这是我选择的主要原因,因为储存液晶的字库需要很大的空间.</P>
<P>2.液晶显示还是用的KS0108系列,主要是他性价比高,指令简单,特别是公司也在用.</P>
<P>3.时钟/日历芯片用的DALLOS的DS1302芯片,他可以储存从2000-2099年的日历,及实时时钟,可以方便的读写.</P>
<P>4.温度测量还是用的DS18B20,这在我上一实例中已经用过,有兴趣可以查阅.</P>
<P>5.本万年历可以显示实时时钟,精确到秒,年,月,日,星期,阴历,温度,生肖等,显示的信息量大.</P>
<P>6,可以通过按键自由设定时钟及日历,按"设置"键可以在秒,分,时,日,月,星期,年之间来回切换,要设置的单元以闪烁提醒.通过"+"."-"按键可以把要设置的单元设定到预想状态.</P>
<P>二,程序说明:</P>
<P>本程序有许多小的模块,现分列如下:</P>
<P>1.主程序</P>
<P>/***************************************************<BR>* 标题：万年历&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 日期：2008年1月13日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>* 说明：包含文件&lt;ziku.h&gt;,&lt;lcd_init.h&gt;&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DS1302.H&gt;,&lt;DS18B20.H&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;KEYSCAN.H&gt;,&lt;YILI.H&gt;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>***************************************************/<BR>#include &lt;pic.h&gt;<BR>#include "ziku.h"<BR>#include "lcd_init.h"<BR>#include "ds1302.h"<BR>#include "ds18b20.h"<BR>#include "keyscan.h"<BR>#include "yinli.h"</P>
<P>//子程序<BR>//LCD显示空白边框子程序<BR>void LCDShowTable()<BR>{<BR>&nbsp;uch i;<BR>&nbsp;SlectScreen(1);&nbsp;&nbsp;&nbsp;&nbsp; //写左半屏<BR>&nbsp;SetLine(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //起使页<BR>&nbsp;SetColumn(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //起使列<BR>&nbsp;for(i=0;i&lt;64;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if((i==0)||(i==63))WriteData(0xff);//第1、63列竖线<BR>&nbsp;&nbsp;else WriteData(0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //最上面一行线<BR>&nbsp;}<BR>&nbsp;for(i=1;i&lt;7;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;SetLine(i);<BR>&nbsp;&nbsp;SetColumn(0);<BR>&nbsp;&nbsp;WriteData(0xff); //竖线<BR>&nbsp;&nbsp;SetColumn(63);<BR>&nbsp;&nbsp;WriteData(0xff); //竖线&nbsp;<BR>&nbsp;}<BR>&nbsp;SetLine(7);<BR>&nbsp;SetColumn(0);<BR>&nbsp;for(i=0;i&lt;64;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if((i==0)||(i==63))WriteData(0xff);<BR>&nbsp;&nbsp;else WriteData(0x80);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //最下面的横线<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;SlectScreen(2);//写右半屏<BR>&nbsp;SetLine(0);<BR>&nbsp;SetColumn(0);<BR>&nbsp;for(i=0;i&lt;64;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(i==63)WriteData(0xff);<BR>&nbsp;&nbsp;else WriteData(0x01);<BR>&nbsp;}<BR>&nbsp;SetLine(4);<BR>&nbsp;SetColumn(0);<BR>&nbsp;for(i=0;i&lt;64;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(i==63)WriteData(0xff);<BR>&nbsp;&nbsp;else WriteData(0x01);<BR>&nbsp;}<BR>&nbsp;for(i=1;i&lt;7;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;SetLine(i);<BR>&nbsp;&nbsp;SetColumn(63);<BR>&nbsp;&nbsp;WriteData(0xff);&nbsp;<BR>&nbsp;}<BR>&nbsp;SetLine(7);<BR>&nbsp;SetColumn(0);<BR>&nbsp;for(i=0;i&lt;64;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(i==63)WriteData(0xff);<BR>&nbsp;&nbsp;else WriteData(0x80);<BR>&nbsp;}&nbsp;<BR>}<BR>/*----------------------------------------------------------*/</P>
<P>//显示固定字符子程序<BR>void LCDShowGudingWord()<BR>{<BR>&nbsp;Show8X16_2(0,24,s0);<BR>&nbsp;Show8X16_2(0,32,s0);<BR>&nbsp;Show8X16(2,1,s0);<BR>&nbsp;Show8X16(2,9,s0);<BR>&nbsp;Show16X16_3(6,40,ri);<BR>&nbsp;Show16X32(2,24,ss0);<BR>&nbsp;Show16X32(2,40,ss0);<BR>&nbsp;Show8X16_2(0,64,s0);<BR>&nbsp;Show8X16_2(0,72,s0);<BR>&nbsp;Show8X16_2(0,80,maohao);<BR>&nbsp;Show8X16_2(0,88,s0);<BR>&nbsp;Show8X16_2(0,96,s0);<BR>&nbsp;Show8X16_2(0,104,maohao);<BR>&nbsp;Show8X16_2(0,112,s0);<BR>&nbsp;Show8X16_2(0,119,s0);<BR>&nbsp;Show8X16(2,80,s0);<BR>&nbsp;Show8X16(2,88,s0);<BR>&nbsp;Show16X16_2(4,64,shiyi);<BR>&nbsp;Show16X16_2(4,80,yue);<BR>&nbsp;Show16X16_2(4,95,chu);<BR>&nbsp;Show16X16_2(4,111,yi);<BR>&nbsp;Show16X16_3(6,72,sheng);<BR>&nbsp;Show16X16_3(6,88,xiao);<BR>&nbsp;Show16X16_3(6,104,shu);<BR>&nbsp;<BR>&nbsp;Show16X16_2(0,40,nian);<BR>&nbsp;Show16X16(4,2,yue);<BR>&nbsp;Show16X16_3(6,8,xing);<BR>&nbsp;Show16X16_3(6,24,qi);<BR>&nbsp;Show16X16(2,96,danwei1);<BR>&nbsp;Show8X16_2(0,8,s2);<BR>&nbsp;Show8X16_2(0,16,s0);<BR>}<BR>/*----------------------------------------------------------*/</P>
<P>//TRM1初始化子程序<BR>void TMR1init()<BR>{<BR>&nbsp;//TRM1 INITIAL<BR>&nbsp;&nbsp; T1CON=0X30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8分频<BR>&nbsp;&nbsp; TMR1IF=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //清中断标志<BR>&nbsp;&nbsp; TMR1IE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使能定时器1中断<BR>&nbsp;&nbsp; TMR1L=0XDB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始值（定时0.5S）<BR>&nbsp;&nbsp; TMR1H=0X0B;<BR>&nbsp;&nbsp; TMR1ON=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //开定时器1<BR>}</P>
<P>//冒号闪烁子程序<BR>void FlashMaohao()<BR>{<BR>&nbsp;static uch timecount=0;<BR>&nbsp;if(TMR1IF==1)<BR>&nbsp;{<BR>&nbsp;&nbsp;TMR1ON=0;<BR>&nbsp;&nbsp;TMR1IF=0;<BR>&nbsp;&nbsp;TMR1L=0XDB;&nbsp;&nbsp;&nbsp;&nbsp; //重新付初值<BR>&nbsp;&nbsp;&nbsp;&nbsp; TMR1H=0X0B;<BR>&nbsp;&nbsp;&nbsp;&nbsp; flag++;<BR>&nbsp;&nbsp;&nbsp;&nbsp; flag=flag%2;&nbsp;&nbsp;&nbsp; //闪烁标志在0-1间翻转<BR>&nbsp;&nbsp;&nbsp;&nbsp; TMR1ON=1;<BR>&nbsp;&nbsp;timecount++;<BR>&nbsp;&nbsp;if(timecount==120)//1分钟采样一次温度<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;timecount=0;<BR>&nbsp;&nbsp;&nbsp;get_temp();&nbsp;&nbsp; //温度转换子程序<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;if(flag==0)<BR>&nbsp;{<BR>&nbsp;&nbsp;Show8X16_2(0,80,maohao);<BR>&nbsp;&nbsp;Show8X16_2(0,104,maohao);<BR>&nbsp;}<BR>&nbsp;if(flag==1)<BR>&nbsp;{<BR>&nbsp;&nbsp;Show8X16_2(0,80,noshu);//清除<BR>&nbsp;&nbsp;Show8X16_2(0,104,noshu);<BR>&nbsp;}<BR>}</P>
<P>//主程序<BR>void main()<BR>{<BR>&nbsp;TMR1init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定时器1初始化<BR>&nbsp;keyinit();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //键盘初始化<BR>&nbsp;LCDinit();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //LCD操作初始化<BR>&nbsp;LCDShowTable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示空白表格<BR>&nbsp;LCDShowGudingWord();&nbsp;&nbsp;&nbsp; //显示固定字符<BR>&nbsp;//Set1302(DisCash);&nbsp;&nbsp;&nbsp;&nbsp; //设置初始时间（默认写入我写程序的时间）<BR>&nbsp;get_temp();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读取温度<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;v_Get1302(clock);&nbsp;&nbsp; //读取时间、日历<BR>&nbsp;&nbsp;display();<BR>&nbsp;&nbsp;YangToYin(clock[6]/16*10+clock[6]&amp;0x0f,clock[4]/16*10+clock[4]&amp;0x0f,clock[3]/16*10+clock[3]&amp;0x0f);<BR>&nbsp;&nbsp;FlashMaohao();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //冒号闪烁<BR>&nbsp;&nbsp;KeyScan();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //键盘扫描<BR>&nbsp;}<BR>}</P>
<P>2.测温程序:</P>
<P>/***************************************************<BR>* 标题：DS18B20测温&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*<BR>* 日期：2008年1月13日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>* 说明：使用DS18B20芯片测温&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*<BR>***************************************************/<BR># define DQ RC3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义18B20数据端口 <BR># define DQ_DIR TRISC3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义18B20D口方向寄存器 <BR># define DQ_HIGH() DQ_DIR =1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置数据口为输入<BR># define DQ_LOW() DQ = 0; DQ_DIR = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置数据口为输出<BR>&nbsp;unsigned char&nbsp; TLV=0 ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //采集到的温度高8位<BR>&nbsp;unsigned char&nbsp; THV=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //采集到的温度低8位<BR>&nbsp;unsigned char TZ=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //转换后的温度值整数部分<BR>&nbsp;<BR>&nbsp;//------------------------------------------------<BR>//延时函数</P>
<P><BR>//系统初始化函数<BR>void init()<BR>{<BR>&nbsp; ADCON1=0X07;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置A口为普通数字口<BR>&nbsp; TRISA=0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置A口方向为输出<BR>&nbsp; //TRISC3=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置D口方向为输出<BR>}</P>
<P>//-----------------------------------------------<BR>//复位DS18B20函数<BR>reset(void)<BR>{<BR>&nbsp; char presence=1;<BR>&nbsp; while(presence)<BR>&nbsp; { <BR>&nbsp;&nbsp;&nbsp; DQ_LOW() ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //主机拉至低电平<BR>&nbsp;&nbsp;&nbsp; delay(2,90);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //延时503us<BR>&nbsp;&nbsp;&nbsp; DQ_HIGH();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //释放总线等电阻拉高总线,并保持15~60us<BR>&nbsp;&nbsp;&nbsp; delay(2,8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //延时70us<BR>&nbsp;&nbsp;&nbsp; if(DQ==1) presence=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //没有接收到应答信号，继续复位<BR>&nbsp;&nbsp;&nbsp; else presence=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //接收到应答信号<BR>&nbsp;&nbsp;&nbsp; delay(2,70);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //延时430us<BR>&nbsp;&nbsp; }<BR>&nbsp; }</P>
<P>//-----------------------------------------------<BR>//写18b20写字节函数<BR>void write_byte(uch val)<BR>{<BR>&nbsp;uch i;<BR>&nbsp;uch temp;<BR>&nbsp;for(i=8;i&gt;0;i--)<BR>&nbsp;{<BR>&nbsp;&nbsp; temp=val&amp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //最低位移出<BR>&nbsp;&nbsp; DQ_LOW(); <BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从高拉至低电平,产生写时间隙<BR>&nbsp;&nbsp; if(temp==1)&nbsp; DQ_HIGH();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果写1,拉高电平<BR>&nbsp;&nbsp; delay(2,7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //延时63us<BR>&nbsp;&nbsp; DQ_HIGH(); <BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; val=val&gt;&gt;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //右移一位<BR>&nbsp; }<BR>}</P>
<P>//------------------------------------------------<BR>//18b20读字节函数<BR>uch read_byte(void)<BR>{<BR>&nbsp;uch i;<BR>&nbsp;uch value=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读出温度<BR>&nbsp;static bit j;<BR>&nbsp;for(i=8;i&gt;0;i--)<BR>&nbsp;{<BR>&nbsp;&nbsp; value&gt;&gt;=1; <BR>&nbsp;&nbsp; DQ_LOW();<BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();<BR>&nbsp;&nbsp; NOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //6us<BR>&nbsp;&nbsp; DQ_HIGH();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //拉至高电平<BR>&nbsp;&nbsp; NOP(); <BR>&nbsp;&nbsp; NOP(); <BR>&nbsp;&nbsp; NOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4us<BR>&nbsp;&nbsp; j=DQ;<BR>&nbsp;&nbsp; if(j) value|=0x80;<BR>&nbsp;&nbsp; delay(2,7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //63us<BR>&nbsp; }<BR>&nbsp; return(value);<BR>}</P>
<P>//-------------------------------------------------<BR>//启动温度转换函数<BR>void get_temp()<BR>{ <BR>int i;<BR>DQ_HIGH();<BR>reset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //复位等待从机应答 <BR>write_byte(0XCC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //忽略ROM匹配 <BR>write_byte(0X44);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送温度转化命令&nbsp; <BR>for(i=10;i&gt;0;i--)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay(201,132);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用多次显示函数，确保温度转换完成所需要的时间<BR>&nbsp;&nbsp;&nbsp; }<BR>reset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //再次复位，等待从机应答 <BR>write_byte(0XCC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //忽略ROM匹配 <BR>write_byte(0XBE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送读温度命令 <BR>TLV=read_byte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读出温度低8 <BR>THV=read_byte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读出温度高8位 <BR>DQ_HIGH();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //释放总线 <BR>TZ=(TLV&gt;&gt;4)|(THV&lt;&lt;4)&amp;0X3f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //温度整数部分<BR>ChangeToLCD(2,80,TZ);<BR>}</P>
<P>3.日历显示程序</P>
<P>/***************************************************<BR>* 标题：DS1302读写&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 日期：2008年1月14日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>* 说明：日历显示范围：2000年--2099年&nbsp;&nbsp;*<BR>***************************************************/<BR>#define&nbsp; RST&nbsp; RC0<BR>#define&nbsp; SCLK RC1 <BR>#define&nbsp; IO&nbsp;&nbsp; RC2<BR>uch flag=0;<BR>uch second=1,minute=1,hour=1,year=1,month=1,date=1,day=1;<BR>uch clock[]={0};<BR>uch DisCash[]={0x00,0x30,0x09,0x16,0x01,0x03,0x09};&nbsp;<BR>/////往1302写入1Byte数据////////////////////////<BR>void RTInputByte(uch d) <BR>{ <BR>&nbsp;&nbsp;&nbsp; uch i;<BR>&nbsp;&nbsp;&nbsp; TRISC=0x00;<BR>&nbsp;&nbsp;&nbsp; for(i=8; i&gt;0; i--)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IO = d&amp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取最低位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //上升沿发送<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //恢复<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d = d &gt;&gt; 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; } <BR>}<BR>///////从1302读取1Byte数据////////////////////////<BR>uch RTOutputByte(void) <BR>{ <BR>&nbsp;&nbsp;&nbsp; uch i,val=0;<BR>&nbsp;&nbsp;&nbsp; TRISC2=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置为输入<BR>&nbsp;&nbsp;&nbsp; for(i=8; i&gt;0; i--)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val = val &gt;&gt;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(IO)val=val|0x80;// 从最低位开始接收<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下降沿接收<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCLK = 0; <BR>&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp; return(val); <BR>}<BR>///////先写地址，后写命令/数据//////////////////////////<BR>void W1302(uch ucAddr, uch ucDa)<BR>{<BR>&nbsp;&nbsp;&nbsp; RST = 0;<BR>&nbsp;&nbsp;&nbsp; SCLK = 0;<BR>&nbsp;&nbsp;&nbsp; RST = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开DS1302<BR>&nbsp;&nbsp;&nbsp; RTInputByte(ucAddr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 地址，命令 */<BR>&nbsp;&nbsp;&nbsp; RTInputByte(ucDa);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 写1Byte数据*/<BR>&nbsp;&nbsp;&nbsp; SCLK = 1;<BR>&nbsp;&nbsp;&nbsp; RST = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关闭DS1302<BR>}<BR>///////先写地址，后读命令/数据////////////////////////<BR>uch R1302(uch ucAddr)<BR>{<BR>&nbsp;&nbsp;&nbsp; uch ucData;<BR>&nbsp;&nbsp;&nbsp; RST = 0;<BR>&nbsp;&nbsp;&nbsp; SCLK = 0;<BR>&nbsp;&nbsp;&nbsp; RST = 1;<BR>&nbsp;&nbsp;&nbsp; RTInputByte(ucAddr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 地址，命令 */<BR>&nbsp;&nbsp;&nbsp; ucData = RTOutputByte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 读1Byte数据 */<BR>&nbsp;&nbsp;&nbsp; SCLK = 1;<BR>&nbsp;&nbsp;&nbsp; RST = 0;<BR>&nbsp;&nbsp;&nbsp; return(ucData);<BR>}<BR>/////////向1302写入 秒 分 时 日 月 星期 年 */////////////<BR>void Set1302(uch *pClock) <BR>{<BR>&nbsp;&nbsp;&nbsp; uch i;<BR>&nbsp;&nbsp;&nbsp; uch ucAddr = 0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //起使地址<BR>&nbsp;&nbsp;&nbsp; W1302(0x8e,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///* 控制命令,WP=0,允许写操作*/<BR>&nbsp;&nbsp;&nbsp; for(i =7; i&gt;0; i--)<BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; W1302(ucAddr,*pClock);&nbsp;&nbsp;&nbsp; ///* 秒 分 时 日 月 星期 年 */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pClock++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucAddr +=2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写地址加2<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; W1302(0x8e,0x80);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // /* 控制命令,WP=1,写保护*/<BR>}<BR>////////从1302读出 秒 分 时 日 月 星期 年 *//////////////////<BR>void v_Get1302(unsigned char&nbsp; ucCurtime[]) <BR>{<BR>unsigned char i;<BR>unsigned char ucAddr = 0x81;<BR>for(i=0;i&lt;7;i++)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucCurtime[i] = R1302(ucAddr);///*格式为: 秒 分 时 日 月 星期 年 */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucAddr += 2;<BR>&nbsp;&nbsp; }<BR>}</P>
<P>/////////与LCD的显示接口//////////////////////<BR>void display()<BR>{<BR>&nbsp;uch i;<BR>&nbsp;for(i=0;i&lt;7;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;clock[i]=clock[i]/16*10+clock[i]%16;//转换为十六进制<BR>&nbsp;}<BR>&nbsp;if(second==1)ChangeToLCD2(0,111,clock[0]);//显示秒<BR>&nbsp;&nbsp;&nbsp; if(minute==1)ChangeToLCD2(0,88,clock[1]); //显示分<BR>&nbsp;&nbsp;&nbsp; if(hour==1)ChangeToLCD2(0,64,clock[2]);&nbsp;&nbsp; //显示时<BR>&nbsp;&nbsp;&nbsp; if(year==1)ChangeToLCD2(0,24,clock[6]);&nbsp;&nbsp; //显示年<BR>&nbsp;if(month==1)ChangeToLCD(2,2,clock[4]);&nbsp;&nbsp;&nbsp; //显示月<BR>&nbsp;if(date==1)ChangeToLCD3(2,24,clock[3]);&nbsp;&nbsp; //显示日<BR>&nbsp;if(day==1)ChangeToLCD4(6,40,clock[5]);&nbsp;&nbsp; //显示星期<BR>&nbsp;ChangeToLCD5(6,104,clock[6]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示生肖<BR>&nbsp;<BR>}&nbsp;</P>
<P>4.按键扫描与服务程序</P>
<P>/***************************************************<BR>* 标题：按键扫描和服务&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>* 日期：2008年1月17日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>* 说明：当按键按下，选中的单元就会闪烁 *<BR>***************************************************/<BR>uch k=0;</P>
<P>//键盘初始化子程序<BR>void keyinit()<BR>{<BR>&nbsp;TRISD0=1;<BR>&nbsp;TRISD0=1;<BR>&nbsp;TRISD0=1;<BR>}<BR>/*----------------------------------------------------------*/</P>
<P>//键盘扫描子程序<BR>void KeyScan()<BR>{<BR>&nbsp;int d;<BR>&nbsp;if(RD0==0)&nbsp; //设置键按下<BR>&nbsp;{<BR>&nbsp;&nbsp;k++;&nbsp;&nbsp;&nbsp; //选定入口值<BR>&nbsp;&nbsp;k=k%8;<BR>&nbsp;}<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(RD0==1)break;//等待按键松开<BR>&nbsp;}<BR>&nbsp;switch(k)//键盘服务入口<BR>&nbsp;{<BR>&nbsp;&nbsp;case 1://设置秒<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x81);//读取秒<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;//转换为16进制<BR>&nbsp;&nbsp;&nbsp;second=flag;&nbsp;&nbsp; //设置秒的闪烁标志<BR>&nbsp;&nbsp;&nbsp;minute=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其余变量不闪烁<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;year=1;<BR>&nbsp;&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;&nbsp;date=1;<BR>&nbsp;&nbsp;&nbsp;day=1;<BR>&nbsp;&nbsp;&nbsp;if(second==0)&nbsp; //闪烁<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,111,noshu);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,119,noshu);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD1==0)&nbsp;&nbsp;&nbsp;&nbsp; //秒数值加1<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x3b)d=0;//大于59就为0<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x80,d);//写入DS1302<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD1==1)break;//等待键松开<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD2==0)//数值减1<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&lt;0)d=0x3b;//小于0就写59<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x80,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD2==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 2://设置分<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x83);<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;<BR>&nbsp;&nbsp;&nbsp;minute=flag;<BR>&nbsp;&nbsp;&nbsp;second=1;<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;year=1;<BR>&nbsp;&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;&nbsp;date=1;<BR>&nbsp;&nbsp;&nbsp;day=1;<BR>&nbsp;&nbsp;&nbsp;if(minute==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,96,noshu);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,88,noshu);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD1==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x3b)d=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x82,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD1==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD2==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&lt;0)d=0x3b;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x82,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD2==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 3://设置时<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x85);<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;<BR>&nbsp;&nbsp;&nbsp;hour=flag;<BR>&nbsp;&nbsp;&nbsp;second=1;<BR>&nbsp;&nbsp;&nbsp;minute=1;<BR>&nbsp;&nbsp;&nbsp;year=1;<BR>&nbsp;&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;&nbsp;date=1;<BR>&nbsp;&nbsp;&nbsp;day=1;<BR>&nbsp;&nbsp;&nbsp;if(hour==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,64,noshu);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,72,noshu);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD1==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x17)d=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x84,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD1==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD2==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&lt;0)d=0x17;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x84,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD2==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 4://设置日期<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x87);<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;<BR>&nbsp;&nbsp;&nbsp;date=flag;<BR>&nbsp;&nbsp;&nbsp;second=1;<BR>&nbsp;&nbsp;&nbsp;minute=1;<BR>&nbsp;&nbsp;&nbsp;year=1;<BR>&nbsp;&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;day=1;<BR>&nbsp;&nbsp;&nbsp;if(date==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show16X32(2,24,noshu2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show16X32(2,40,noshu2);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD1==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x1f)d=1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x86,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD1==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD2==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&lt;1)d=0x1f;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x86,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD2==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 5://设置月<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x89);<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;<BR>&nbsp;&nbsp;&nbsp;month=flag;<BR>&nbsp;&nbsp;&nbsp;second=1;<BR>&nbsp;&nbsp;&nbsp;minute=1;<BR>&nbsp;&nbsp;&nbsp;year=1;<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;date=1;<BR>&nbsp;&nbsp;&nbsp;day=1;<BR>&nbsp;&nbsp;&nbsp;if(month==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16(2,2,noshu);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16(2,10,noshu);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD1==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x0c)d=1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x88,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD1==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD2==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&lt;1)d=0x0c;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x88,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD2==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 6://设置星期<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x8b);<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;<BR>&nbsp;&nbsp;&nbsp;day=flag;<BR>&nbsp;&nbsp;&nbsp;second=1;<BR>&nbsp;&nbsp;&nbsp;minute=1;<BR>&nbsp;&nbsp;&nbsp;year=1;<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;date=1;<BR>&nbsp;&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;&nbsp;if(day==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show16X16_3(6,40,noshu3);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD1==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x07)d=1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x8a,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD1==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD2==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&lt;1)d=0x07;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x8a,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD2==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 7://设置年<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;d=R1302(0x8d);<BR>&nbsp;&nbsp;&nbsp;d=d/16*10+d%16;<BR>&nbsp;&nbsp;&nbsp;year=flag;<BR>&nbsp;&nbsp;&nbsp;second=1;<BR>&nbsp;&nbsp;&nbsp;minute=1;<BR>&nbsp;&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;date=1;<BR>&nbsp;&nbsp;&nbsp;day=1;<BR>&nbsp;&nbsp;&nbsp;if(year==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,24,noshu);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Show8X16_2(0,32,noshu);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD1==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&gt;0x63)d=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x8c,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD1==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(RD2==0)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;d--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(d&lt;0)d=0x63;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d=d/10*16+d%10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x8c,d);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RD2==1)break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;case 0://设置完毕，不闪烁<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;second=1;<BR>&nbsp;&nbsp;&nbsp;minute=1;<BR>&nbsp;&nbsp;&nbsp;month=1;<BR>&nbsp;&nbsp;&nbsp;hour=1;<BR>&nbsp;&nbsp;&nbsp;date=1;<BR>&nbsp;&nbsp;&nbsp;day=1;<BR>&nbsp;&nbsp;&nbsp;year=1;<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>5.液晶显示程序</P>
<P>/***************************************************<BR>* 标题：LCD操作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 作者：Wujieflash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<BR>* 日期：2008年1月12日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>* 说明：KS0108系列液晶不带字库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<BR>***************************************************/<BR>#include &lt;pic.h&gt;</P>
<P>#define E&nbsp;&nbsp;&nbsp; RA0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//液晶使能端<BR>#define RW&nbsp;&nbsp; RA1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读写控制端<BR>#define DI&nbsp;&nbsp; RA2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据/指令通道<BR>#define CSA&nbsp; RA5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//片选<BR>#define CSB&nbsp; RA3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//片选<BR>#define nop() asm("nop")</P>
<P>////////////////////////基本子函数///////////////////////<BR>//延时<BR>void delay(char x,char y) <BR>{<BR>&nbsp; char z;<BR>&nbsp; do{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; z=y;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do{;}while(--z);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }while(--x);<BR>&nbsp;}<BR>//其指令时间为：7+（3*（Y-1）+7）*（X-1）如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。<BR>//则是：14+（3*（Y-1）+7）*（X-1）。</P>
<P>//--------------------------------------------------<BR>void LCDdelay()<BR>{<BR>&nbsp;unsigned int i=500;<BR>&nbsp;while(i--)<BR>&nbsp;{;}<BR>}<BR>/*----------------------------------------------------*/</P>
<P>//状态检查<BR>void CheckState()<BR>{<BR>&nbsp;unsigned int dat;<BR>&nbsp;RW=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读状态<BR>&nbsp;DI=0;<BR>&nbsp;TRISB=0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置口为输入<BR>&nbsp;while(1)<BR>&nbsp;{<BR>&nbsp;&nbsp;E=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //高电平读数据<BR>&nbsp;&nbsp;dat=PORTB&amp;0x90;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //当4、7位为0时为正常状态<BR>&nbsp;&nbsp;E=0;<BR>&nbsp;&nbsp;if(dat==0x00)break;<BR>&nbsp;}<BR>&nbsp;TRISB=0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //恢复口为输出<BR>}<BR>/*----------------------------------------------------*/</P>
<P>//写显示数据<BR>//dat:显示数据<BR>void WriteData(unsigned char dat)<BR>{<BR>&nbsp;CheckState();<BR>&nbsp;DI=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写数据<BR>&nbsp;RW=0;<BR>&nbsp;PORTB=dat;<BR>&nbsp;E=1;<BR>&nbsp;E=0;<BR>}<BR>/*---------------------------------------------------*/</P>
<P>//写指令<BR>//command:操作LCD的指令<BR>void WriteCommand(unsigned char dat)<BR>{<BR>&nbsp;CheckState();<BR>&nbsp;RW=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写指令<BR>&nbsp;PORTB=dat;<BR>&nbsp;E=1;<BR>&nbsp;E=0;<BR>}<BR>/*---------------------------------------------------*/</P>
<P>//设定页地址----X:0--7<BR>void SetLine(unsigned char line)<BR>{<BR>&nbsp;line=line&amp;0x07;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //0&lt;=line&lt;=7&nbsp;<BR>&nbsp;line=line|0xb8;<BR>&nbsp;WriteCommand(line);<BR>}<BR>/*---------------------------------------------------*/</P>
<P>//设定列地址----Y:0--63<BR>void SetColumn(unsigned char column)<BR>{<BR>&nbsp;column=column&amp;0x3f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //0&lt;=column&lt;=63<BR>&nbsp;column=column|0x40;<BR>&nbsp;WriteCommand(column);<BR>}<BR>/*--------------------------------------------------*/</P>
<P>//设定开始行<BR>void SetStartLine(unsigned char startline)<BR>{<BR>&nbsp;startline=startline&amp;0x3f;&nbsp;&nbsp; //0&lt;=startline&lt;=63<BR>&nbsp;startline=startline|0xc0;<BR>&nbsp;WriteCommand(startline);<BR>}<BR>/*--------------------------------------------------*/</P>
<P>//开关显示<BR>//1:开显示&nbsp; 0:关显示<BR>void SetOnOff(unsigned char state)<BR>{<BR>&nbsp;state=state|0x3e;<BR>&nbsp;WriteCommand(state);<BR>}<BR>/*--------------------------------------------------*/</P>
<P>//选择屏幕<BR>//screen: 1:左屏 2:右屏<BR>void SlectScreen(unsigned char screen)<BR>{<BR>&nbsp;switch(screen)<BR>&nbsp;{<BR>&nbsp;&nbsp;case 1: CSA=0;<BR>&nbsp;&nbsp; &nbsp;&nbsp;CSB=1;//左屏<BR>&nbsp;&nbsp; &nbsp;&nbsp;break;<BR>&nbsp;&nbsp;case 2: CSA=1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSB=0;//右屏<BR>&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;}<BR>}<BR>/*--------------------------------------------------*/</P>
<P>//清屏<BR>//screen: 1:左屏 2:右屏<BR>void ClearScreen(unsigned char screen)<BR>{<BR>&nbsp;unsigned char i,j;<BR>&nbsp;SlectScreen(screen);<BR>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;SetLine(i);<BR>&nbsp;&nbsp;for(j=0;j&lt;64;j++)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;WriteData(0x00);<BR>&nbsp;&nbsp;&nbsp;WriteData(0x00);<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}<BR>/*---------------------------------------------------*/</P>
<P>//显示一个16X16的汉字<BR>void Show16X16(unsigned char line,unsigned char column,const unsigned char *pt)<BR>{<BR>&nbsp;unsigned char i,column_temp;<BR>&nbsp;column_temp=column;<BR>&nbsp;SlectScreen(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //选通左屏<BR>&nbsp;SetColumn(column);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置起始列<BR>&nbsp;SetLine(line);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置行<BR>&nbsp;for(i=0;i&lt;16;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(column&gt;=64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果列&gt;=64，则选通右屏<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SlectScreen(2);<BR>&nbsp;&nbsp;&nbsp;column=column%64;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置右屏起始列<BR>&nbsp;&nbsp;&nbsp;SetColumn(column);<BR>&nbsp;&nbsp;&nbsp;SetLine(line);<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;WriteData(*pt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写数据<BR>&nbsp;&nbsp;*pt++;//<BR>&nbsp;&nbsp;column++;<BR>&nbsp;}<BR>&nbsp;SlectScreen(1);<BR>&nbsp;SetLine(line+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置汉字下半部分显示页<BR>&nbsp;column=column_temp;<BR>&nbsp;SetColumn(column);<BR>&nbsp;for(i=0;i&lt;16;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(column&gt;=64)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SlectScreen(2);<BR>&nbsp;&nbsp;&nbsp;column=column%64;<BR>&nbsp;&nbsp;&nbsp;SetColumn(column);<BR>&nbsp;&nbsp;&nbsp;SetLine(line+1);<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;WriteData(*pt);<BR>&nbsp;&nbsp;*pt++;<BR>&nbsp;&nbsp;column++;<BR>&nbsp;}<BR>}<BR>/*-------------------------------------------------------*/</P>
<P>//显示一个16X16的汉字带上划线<BR>void Show16X16_2(unsigned char line,unsigned char column,const unsigned char *pt)<BR>{<BR>&nbsp;unsigned char i,column_temp;<BR>&nbsp;column_temp=column;<BR>&nbsp;SlectScreen(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //选通左屏<BR>&nbsp;SetColumn(column);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置起始列<BR>&nbsp;SetLine(line);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置行<BR>&nbsp;for(i=0;i&lt;16;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(column&gt;=64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果列&gt;=64，则选通右屏<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SlectScreen(2);<BR>&nbsp;&nbsp;&nbsp;column=column%64;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置右屏起始列<BR>&nbsp;&nbsp;&nbsp;SetColumn(column);<BR>&nbsp;&nbsp;&nbsp;SetLine(line);<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;WriteData(*pt|0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写数据<BR>&nbsp;&nbsp;*pt++;<BR>&nbsp;&nbsp;column++;<BR>&nbsp;}<BR>&nbsp;SlectScreen(1);<BR>&nbsp;SetLine(line+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置汉字下半部分显示页<BR>&nbsp;column=column_temp;<BR>&nbsp;SetColumn(column);<BR>&nbsp;for(i=0;i&lt;16;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(column&gt;=64)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SlectScreen(2);<BR>&nbsp;&nbsp;&nbsp;column=column%64;<BR>&nbsp;&nbsp;&nbsp;SetColumn(column);<BR>&nbsp;&nbsp;&nbsp;SetLine(line+1);<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;WriteData(*pt);<BR>&nbsp;&nbsp;*pt++;<BR>&nbsp;&nbsp;column++;<BR>&nbsp;}<BR>}<BR>/*------------------------------------