<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[十年部落]]></title>
  <subtitle type="html"><![CDATA[51 AVR单片机|ARM开发|电子技术|protel学习|VC++编程|英语频道|软件资源分享]]></subtitle>
  <id>http://www.shinian10.com/</id> 
  <link rel="alternate" type="text/html" href="http://www.shinian10.com/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.shinian10.com/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.4.1022">PJBlog2</generator> 
  <updated>2008-05-10T20:00:05+08:00</updated> 

  <entry>
	  <title type="html"><![CDATA[DSP与普通单片机的区别]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=4" label="DSP技术" /> 
	  <updated>2008-05-10T20:00:05+08:00</updated>
	  <published>2008-05-10T20:00:05+08:00</published>
		  <summary type="html"><![CDATA[考虑一个数字信号处理的实例，比如有限冲击响应滤波器（FIR）。用数学语言来说，FIR滤波器是做一系列的点积。取一个输入量和一个序数向量，在系数和输入样本的滑动窗口间作乘法，然后将所有的乘积加起来，形成一个输出样本。<br/>类似的运算在数字信号处理过程中大量地重复发生，使得为此设计的器件必须提供专门<br/>的支持，促成了了DSP器件与通用处理器（GPP）的分流：<br/><br/>1&nbsp;对密集的乘法运算的支持<br/><br/>GPP不是设计来做密集乘法任务的，即使是一些现代的GPP，也要求多个指令周期来做一次乘法。而DSP处理器使用专门的硬件来实现单周期乘法。DSP处理器还增加了累加器寄存器来处理多个乘积的和。累加器寄存器通常比其他寄存器宽，增加称为结果bits的额外bits来避免溢出。同时，为了充分体现专门的乘法-累加硬件的好处，几乎所有的DSP的指令集都包含有显式的MAC指令。<br/><br/>2&nbsp;存储器结构<br/><br/>传统上，GPP使用冯.诺依曼存储器结构。这种结构中，只有一个存储器空间通过一组总线（一个地址总线和一个数据总线）连接到处理器核。通常，做一次乘法会发生4次存储器访问，用掉至少四个指令周期。<br/><br/>大多数DSP采用了哈佛结构，将存储器空间划分成两个，分别存储程序和数据。它们有两组总线连接到处理器核，允许同时对它们进行访问。这种安排将处理器存贮器的带宽加倍，更重要的是同时为处理器核提供数据与指令。在这种布局下，DSP得以实现单周期的MAC指令。<br/><br/>还有一个问题，即现在典型的高性能GPP实际上已包含两个片内高速缓存，一个是数据，一个是指令，它们直接连接到处理器核，以加快运行时的访问速度。从物理上说，这种片内的双存储器和总线的结构几乎与哈佛结构的一样了。然而从逻辑上说，两者还是有重要的区别。<br/><br/>GPP使用控制逻辑来决定哪些数据和指令字存储在片内的高速缓存里，其程序员并不加以指定（也可能根本不知道）。与此相反，DSP使用多个片内存储器和多组总线来保证每个指令周期内存储器的多次访问。在使用DSP时，程序员要明确地控制哪些数据和指令要存储在片内存储器中。程序员在写程序时，必须保证处理器能够有效地使用其双总线。<br/><br/>此外，DSP处理器几乎都不具备数据高速缓存。这是因为DSP的典型数据是数据流。也就是说，DSP处理器对每个数据样本做计算后，就丢弃了，几乎不再重复使用。<br/><br/>3&nbsp;零开销循环<br/><br/>如果了解到DSP算法的一个共同的特点，即大多数的处理时间是花在执行较小的循环上，也就容易理解，为什么大多数的DSP都有专门的硬件，用于零开销循环。所谓零开销循环是指处理器在执行循环时，不用花时间去检查循环计数器的值、条件转移到循环的顶部、将循环计数器减1。<br/><br/>与此相反，GPP的循环使用软件来实现。某些高性能的GPP使用转移预报硬件，几乎达到与硬件支持的零开销循环同样的效果。<br/><br/>4&nbsp;定点计算<br/><br/>大多数DSP使用定点计算，而不是使用浮点。虽然DSP的应用必须十分注意数字的精确，用浮点来做应该容易的多，但是对DSP来说，廉价也是非常重要的。定点机器比起相应的浮点机器来要便宜（而且更快）。为了不使用浮点机器而又保证数字的准确，DSP处理器在指令集和硬件方面都支持饱和计算、舍入和移位。<br/><br/>5&nbsp;专门的寻址方式<br/><br/>DSP处理器往往都支持专门的寻址模式，它们对通常的信号处理操作和算法是很有用的。例如，模块（循环）寻址（对实现数字滤波器延时线很有用）、位倒序寻址（对FFT很有用）。这些非常专门的寻址模式在GPP中是不常使用的，只有用软件来实现。<br/><br/>6&nbsp;执行时间的预测<br/><br/>大多数的DSP应用（如蜂窝电话和调制解调器）都是严格的实时应用，所有的处理必须在指定的时间内完成。这就要求程序员准确地确定每个样本需要多少处理时间，或者，至少要知道，在最坏的情况下，需要多少时间。<br/><br/>如果打算用低成本的GPP去完成实时信号处理的任务，执行时间的预测大概不会成为什么问题，应为低成本GPP具有相对直接的结构，比较容易预测执行时间。然而，大多数实时DSP应用所要求的处理能力是低成本GPP所不能提供的。<br/><br/>这时候，DSP对高性能GPP的优势在于，即便是使用了高速缓存的DSP，哪些指令会放进去也是由程序员（而不是处理器）来决定的，因此很容易判断指令是从高速缓存还是从存储器中读取。DSP一般不使用动态特性，如转移预测和推理执行等。因此，由一段给定的代码来预测所要求的执行时间是完全直截了当的。从而使程序员得以确定芯片的性能限制。<br/><br/>7&nbsp;定点DSP指令集<br/><br/>定点DSP指令集是按两个目标来设计的：<br/><br/>使处理器能够在每个指令周期内完成多个操作，从而提高每个指令周期的计算效率。&nbsp;将存贮DSP程序的存储器空间减到最小（由于存储器对整个系统的成本影响甚大，该问题在对成本敏感的DSP应用中尤为重要）。&nbsp;<br/>为了实现这些目标，DSP处理器的指令集通常都允许程序员在一个指令内说明若干个并行的操作。例如，在一条指令包含了MAC操作，即同时的一个或两个数据移动。在典型的例子里，一条指令就包含了计算FIR滤波器的一节所需要的所有操作。这种高效率付出的代价是，其指令集既不直观，也不容易使用（与GPP的指令集相比）。<br/><br/>GPP的程序通常并不在意处理器的指令集是否容易使用，因为他们一般使用象C或C++等高级语言。而对于DSP的程序员来说，不幸的是主要的DSP应用程序都是用汇编语言写的（至少部分是汇编语言优化的）。这里有两个理由：首先，大多数广泛使用的高级语言，例如C，并不适合于描述典型的DSP算法。其次，DSP结构的复杂性，如多存储器空间、多总线、不规则的指令集、高度专门化的硬件等，使得难于为其编写高效率的编译器。<br/><br/>即便用编译器将C源代码编译成为DSP的汇编代码，优化的任务仍然很重。典型的DSP应用都具有大量计算的要求，并有严格的开销限制，使得程序的优化必不可少（至少是对程序的最关键部分）。因此，考虑选用DSP的一个关键因素是，是否存在足够的能够较好地适应DSP处理器指令集的程序员。<br/><br/>8&nbsp;开发工具的要求<br/><br/>因为DSP应用要求高度优化的代码，大多数DSP厂商都提供一些开发工具，以帮助程序员完成其优化工作。例如，大多数厂商都提供处理器的仿真工具，以准确地仿真每个指令周期内处理器的活动。无论对于确保实时操作还是代码的优化，这些都是很有用的工具。<br/><br/>GPP厂商通常并不提供这样的工具，主要是因为GPP程序员通常并不需要详细到这一层的信息。GPP缺乏精确到指令周期的仿真工具，是DSP应用开发者所面临的的大问题：由于几乎不可能预测高性能GPP对于给定任务所需要的周期数，从而无法说明如何去改善代码的性能。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=513" /> 
	  <id>http://www.shinian10.com/default.asp?id=513</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[从51到ARM 32位嵌入式系统入门 电子书下载]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=26" label="嵌入式开发" /> 
	  <updated>2008-05-08T21:09:54+08:00</updated>
	  <published>2008-05-08T21:09:54+08:00</published>
		  <summary type="html"><![CDATA[第1章&nbsp;几个基本概念<br/><br/>1.1&nbsp;从51系列单片机到ARM处理器1<br/>1.2&nbsp;ARM不是单片机2<br/>1.3&nbsp;51系列单片机和ARM处理器的比较3<br/>1.4&nbsp;以ARM为核的单片机4<br/>1.4.1&nbsp;处理器内核只和外部地址相关4<br/>1.4.2&nbsp;ARM怎样组成一个单片机6<br/>1.4.3&nbsp;一点启示7<br/><br/>第2章&nbsp;ARM处理器基础<br/><br/>2.1&nbsp;ARM处理器的数据格式8<br/>2.1.1&nbsp;基础知识8<br/>2.1.2&nbsp;ARM处理器的存储器结构9<br/>2.1.3&nbsp;ARM处理器的指令存储或数据存储13<br/>2.1.4&nbsp;地址对准15<br/>2.2&nbsp;处理器模式15<br/>2.3&nbsp;ARM内部寄存器17<br/>2.3.1&nbsp;ARM状态时的寄存器17<br/>2.3.2&nbsp;Thumb状态下的寄存器25<br/>2.4&nbsp;异常27<br/><br/>第3章&nbsp;ARM7TDMI简介<br/><br/>3.1&nbsp;概述29<br/>3.2&nbsp;结构和框图30<br/>3.3.3&nbsp;级流水线结构33<br/>3.4&nbsp;ＡＲＭ处理器的寻址方式35<br/>3.4.1&nbsp;51系列与ARM系列寻址方法的比较35<br/>3.4.2&nbsp;寄存器寻址36<br/>3.4.3&nbsp;立即寻址36<br/>3.4.4&nbsp;寄存器移位寻址37<br/>3.4.5&nbsp;寄存器间接寻址39<br/>3.4.6&nbsp;变址寻址40<br/>3.4.7&nbsp;多寄存器寻址42<br/>3.4.8&nbsp;堆栈寻址42<br/>3.4.9&nbsp;寻址方式的应用43<br/>3.4.1&nbsp;0ARM指令寻址一览表44<br/><br/>第4章&nbsp;异常和中断<br/><br/>4.1&nbsp;概述45<br/>4.2&nbsp;复位异常46<br/>4.3&nbsp;未定义指令异常47<br/>4.4&nbsp;软件中断异常49<br/>4.5&nbsp;预取指中止异常49<br/>4.6&nbsp;数据中止异常50<br/>4.7&nbsp;中断请求（IRQ）异常&nbsp;51<br/>4.8&nbsp;快速中断（FIQ）请求异常52<br/>4.9&nbsp;中断源和中断优先级53<br/>4.10&nbsp;异常中断的进入和退出54<br/><br/><img src="http://www.bookschina.com.tw/cover1/2006/060123/1282056.jpg" border="0" alt=""/><br/>第5章&nbsp;ARM指令集<br/><br/>5.1&nbsp;概述56<br/>5.2&nbsp;指令可选后缀59<br/>5.2.1&nbsp;S后缀60<br/>5.2.2&nbsp;后缀60<br/>5.2.3&nbsp;B后缀61<br/>5.2.4&nbsp;T后缀61<br/>5.2.5&nbsp;条件后缀62<br/>5.3&nbsp;ARM数据传送指令（存储器访问指令）64<br/>5.3.1&nbsp;关于数据传送64<br/>5.3.2&nbsp;数据传送中的几个问题66<br/>5.3.3&nbsp;ARM数据传送指令代码表70<br/>5.3.4&nbsp;数据传送指令代码详述71<br/>5.4&nbsp;ARM分支指令93<br/>5.4.1&nbsp;关于程序分支93<br/>5.4.2&nbsp;ARM分支指令详解94<br/>5.5&nbsp;ARM数据处理指令98<br/>5.5.1&nbsp;ARM数据处理指令的特点98<br/>5.5.2&nbsp;第2操作数99<br/>5.5.3&nbsp;ARM数据处理指令代码表101<br/>5.5.4&nbsp;ARM数据处理指令详述103<br/>5.6&nbsp;ARM指令集中和协处理器有关的指令120<br/>5.7&nbsp;ARM指令集中的软件中断指令125<br/><br/>第6章&nbsp;Thumb指令集<br/>6.1&nbsp;Thumb指令的特点129<br/>6.2&nbsp;Thumb指令和ARM指令的比较132<br/>6.3&nbsp;Thumb指令集中的数据传送类指令134<br/>6.4&nbsp;Thumb指令集中的分支指令146<br/>6.5&nbsp;Thumb指令集中的数据处理指令152<br/>6.6&nbsp;Thumb指令集中的软件中断指令164<br/><br/>第7章&nbsp;伪指令<br/><br/>7.1&nbsp;伪指令概述166<br/>7.2&nbsp;与ARM指令相关的伪指令167<br/>7.3&nbsp;与Thumb指令相关的伪指令177<br/>7.4&nbsp;通用伪指令180<br/>7.4.1&nbsp;为变量定义和赋值的伪指令180<br/>7.4.2&nbsp;定义各类寄存器名称的伪指令184<br/>7.4.3&nbsp;数据定义伪指令187<br/>7.4.4&nbsp;控制程序流向的伪指令196<br/>7.4.5&nbsp;其他伪指令201<br/><br/>第8章&nbsp;ARM系统设计和程序设计<br/><br/>8.1&nbsp;关于ARM处理器，我们学到了什么？207<br/>8.2&nbsp;程序设计的几个问题209<br/>8.3&nbsp;ARM指令和&nbsp;Thumb指令的兼容性214<br/>8.4&nbsp;汇编程序规则221<br/>8.4.1&nbsp;组成222<br/>8.4.2&nbsp;书写格式223<br/>8.4.3&nbsp;汇编语言中的表达式224<br/>8.5&nbsp;汇编程序举例231<br/><br/>第9章&nbsp;C和C++语言的应用<br/><br/>9.1&nbsp;汇编语言与C/C++语言的比较237<br/>9.2&nbsp;C/C++语言的编程规范238<br/>9.2.1&nbsp;注释238<br/>9.2.2&nbsp;命名239<br/>9.2.3&nbsp;编辑风格239<br/>9.3&nbsp;如何编写针对ARM的高效C语言程序240<br/>9.3.1&nbsp;以空间换时间240<br/>9.3.2&nbsp;使用数学方法解决问题242<br/>9.3.3&nbsp;使用位操作242<br/>9.3.4&nbsp;嵌入汇编243<br/>9.4&nbsp;C、C++语言与汇编语言的混合编程244<br/>9.4.1&nbsp;在C、C++程序中使用内嵌的汇编指令的语法格式244<br/>9.4.2&nbsp;在C、C++程序中使用内嵌的汇编指令的注意事项245<br/>9.4.3&nbsp;内嵌汇编指令的应用举例247<br/>9.4.4&nbsp;从汇编程序中访问C程序变量248<br/>9.4.5&nbsp;在C++程序中使用C程序头文件249<br/>9.4.6&nbsp;汇编程序、C程序以及C++程序的相互调用举例250<br/><br/>第10章&nbsp;程序的编辑和编译<br/><br/>10.1&nbsp;程序设计过程254<br/>10.1.1&nbsp;编辑程序254<br/>10.1.2&nbsp;编译程序255<br/>10.1.3&nbsp;连接和调试程序257<br/>10.2&nbsp;ARM处理器开发工具介绍258<br/>10.2.1&nbsp;ARM处理器仿真系统特点258<br/>10.2.2&nbsp;ADS集成开发环境259<br/>10.2.3&nbsp;ADS开发系统的系统资源261<br/>10.2.4&nbsp;系统软件开发的步骤263<br/>10.3&nbsp;程序的编辑263<br/>10.3.1&nbsp;源程序是可移植的263<br/>10.3.2&nbsp;在CodeWarrior&nbsp;for&nbsp;ADS环境下编辑源文件266<br/>10.3.3&nbsp;建立工程项目总结271<br/>10.3.4&nbsp;建立C语言和C++语言源文件271<br/>10.3.5&nbsp;文件的管理272<br/>10.3.6&nbsp;编辑画面的设置273<br/>10.3.7&nbsp;ADS编辑功能介绍279<br/>10.3.8&nbsp;屏幕分割设置282<br/>10.4&nbsp;程序的编译283<br/>10.4.1&nbsp;有两种方式可以实现程序的编译283<br/>10.4.2&nbsp;命令行中的可选项和图形方式中的可选项286<br/>10.4.3&nbsp;ADS中的可选项290<br/>10.5&nbsp;汇编器的应用291<br/>10.5.1&nbsp;ARM汇编器armasm中的可选项291<br/>10.5.2&nbsp;ARM汇编器应用298<br/>10.5.3&nbsp;应用举例300<br/>10.6&nbsp;编译器的应用303<br/>10.6.1&nbsp;ARM编译器中的可选项303<br/>10.6.2&nbsp;ARM编译器的应用317<br/><br/>第11章&nbsp;程序的连接<br/><br/>11.1&nbsp;几个与连接有关的概念320<br/>11.2&nbsp;连接器的应用326<br/>11.3&nbsp;连接器选项设置334<br/>11.4&nbsp;连接器应用举例347<br/><br/>第12章&nbsp;ARM调试工具AXD<br/><br/>12.1&nbsp;调试工具AXD361<br/>12.1.1&nbsp;ARM调试工具介绍361<br/>12.1.2&nbsp;调试工具AXD的使用方法363<br/>12.2&nbsp;在调试过程中使用断点371<br/>12.2.1&nbsp;设置断点371<br/>12.2.2&nbsp;执行到断点处374<br/>12.2.3&nbsp;查找和修改断点374<br/>12.2.4&nbsp;断点管理下拉菜单374<br/>12.2.5&nbsp;观察断点375<br/>12.2.6&nbsp;删除断点376<br/>12.3&nbsp;AXD中其他工具介绍376<br/>12.3.1&nbsp;使用观测项376<br/>12.3.2&nbsp;在调试程序时观察变量381<br/>12.3.3&nbsp;在调试程序时使用符号表383<br/>12.3.4&nbsp;使用观测点384<br/>12.3.5&nbsp;工具栏中的工具387<br/>12.4&nbsp;数据格式389<br/>12.4.1&nbsp;设置数据格式389<br/>12.4.2&nbsp;设置默认的数据显示格式393<br/><br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.shinian10.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="隐藏内容"/> 隐藏内容</div><div class="UBBContent">该内容已经被作者隐藏,只有会员才允许查阅 <a href="http://www.shinian10.com/login.asp">登录</a> | <a href="http://www.shinian10.com/register.asp">注册</a></div></div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=512" /> 
	  <id>http://www.shinian10.com/default.asp?id=512</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[毕业论文答辩申请书模板]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=7" label="软件资源" /> 
	  <updated>2008-04-07T21:20:34+08:00</updated>
	  <published>2008-04-07T21:20:34+08:00</published>
		  <summary type="html"><![CDATA[我是××级博士研究生（学号××），现已完成攻读××专业博士学位研究生培养计划中规定的全部课程学习内容及博士学位论文工作,且已通过预答辩。现申请进行博士学位论文答辩，并提交全部有关材料（学位论文初稿、由研究生院培养办公室出具的成绩单及在校期间发表的与学位论文相关的学术论文原件及复印件），请审批]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=511" /> 
	  <id>http://www.shinian10.com/default.asp?id=511</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[SOCKET编程入门]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=9" label="C/C++编程" /> 
	  <updated>2008-02-18T09:22:11+08:00</updated>
	  <published>2008-02-18T09:22:11+08:00</published>
		  <summary type="html"><![CDATA[对TCP/IP、UDP、Socket编程这些词你不会很陌生吧？随着网络技术的发展，这些词充斥着我们的耳朵。那么我想问：<br/>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;什么是TCP/IP、UDP？<br/>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket在哪里呢？<br/>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket是什么呢？<br/>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你会使用它们吗？<br/><strong>什么是TCP/IP</strong><strong>、UDP</strong><strong>？</strong>&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCP/IP（Transmission&nbsp;Control&nbsp;Protocol/Internet&nbsp;Protocol）即传输控制协议/网间协议，是一个工业标准的协议集，它是为广域网（WANs）设计的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UDP（User&nbsp;Data&nbsp;Protocol，用户数据报协议）是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。<br/>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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/><img src="http://goodcandle.cnblogs.com/images/cnblogs_com/goodcandle/socket1.jpg" border="0" alt=""/><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。<br/><strong>Socket</strong><strong>在哪里呢？<br/></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>在图1中，我们没有看到Socket的影子，那么它到底在哪里呢？还是用图来说话，一目了然。<br/><img src="http://goodcandle.cnblogs.com/images/cnblogs_com/goodcandle/socket2.jpg" border="0" alt=""/><br/>图2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原来Socket在这里。<br/><strong>Socket</strong><strong>是什么呢？<br/></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket是应用层与TCP/IP协议族通信的中间软件抽象层，它是一组接口。在设计模式中，Socket其实就是一个门面模式，它把复杂的TCP/IP协议族隐藏在Socket接口后面，对用户来说，一组简单的接口就是全部，让Socket去组织数据，以符合指定的协议。<br/><strong>你会使用它们吗？<br/></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>前人已经给我们做了好多的事了，网络间的通信也就简单了许多，但毕竟还是有挺多工作要做的。以前听到Socket编程，觉得它是比较高深的编程知识，但是只要弄清Socket编程的工作原理，神秘的面纱也就揭开了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个生活中的场景。你要打电话给一个朋友，先拨号，朋友听到电话铃声后提起电话，这时你和你的朋友就建立起了连接，就可以讲话了。等交流结束，挂断电话结束此次交谈。&nbsp;&nbsp;&nbsp;&nbsp;生活中的场景就解释了这工作原理，也许TCP/IP协议族就是诞生于生活中，这也不一定。<br/><img src="http://goodcandle.cnblogs.com/images/cnblogs_com/goodcandle/socket3.jpg" border="0" alt=""/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>图3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先从服务器端说起。服务器端先初始化Socket，然后与端口绑定(bind)，对端口进行监听(listen)，调用accept阻塞，等待客户端连接。在这时如果有个客户端初始化一个Socket，然后连接服务器(connect)，如果连接成功，这时客户端与服务器端的连接就建立了。客户端发送数据请求，服务器端接收请求并处理请求，然后把回应数据发送给客户端，客户端读取数据，最后关闭连接，一次交互结束。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里我就举个简单的例子，我们走的是TCP协议这条路（见图2）。例子用MFC编写，运行的界面如下：<br/><img src="http://goodcandle.cnblogs.com/images/cnblogs_com/goodcandle/socket4.jpg" border="0" alt=""/><br/>图4<br/><img src="http://goodcandle.cnblogs.com/images/cnblogs_com/goodcandle/socket5.jpg" border="0" alt=""/><br/>图5<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在客户端输入服务器端的IP地址和发送的数据，然后按发送按钮，服务器端接收到数据，然后回应客户端。客户端读取回应的数据，显示在界面上。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是接收数据和发送数据的函数：<br/>int&nbsp;&nbsp;&nbsp;&nbsp;Receive(SOCKET&nbsp;fd,char&nbsp;*szText,int&nbsp;len)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;cnt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt=len;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(cnt&gt;0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc=recv(fd,szText,cnt,0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rc==SOCKET_ERROR)<br/>&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;return&nbsp;-1;<br/>&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;if(rc==0)&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;len-cnt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szText+=rc;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt-=rc;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;len;<br/>}<br/>int&nbsp;Send(SOCKET&nbsp;fd,char&nbsp;*szText,int&nbsp;len)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;cnt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt=len;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(cnt&gt;0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc=send(fd,szText,cnt,0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rc==SOCKET_ERROR)<br/>&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;return&nbsp;-1;<br/>&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;if(rc==0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;len-cnt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szText+=rc;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt-=rc;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;len;<br/>}<br/><strong>服务器端：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在服务器端，主要是启动Socket和监听线程。<br/>#define&nbsp;DEFAULT_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2000<br/>void&nbsp;CServerDlg::OnStart()&nbsp;<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;local;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwThreadID&nbsp;=&nbsp;0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local.sin_family=AF_INET;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置的端口为DEFAULT_PORT。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local.sin_port=htons(DEFAULT_PORT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local.sin_addr.S_un.S_addr=INADDR_ANY;<br/>&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化Socket<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_Listening&nbsp;=&nbsp;socket(AF_INET,SOCK_STREAM,0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m_Listening&nbsp;==&nbsp;INVALID_SOCKET)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将本地地址绑定到所创建的套接字上<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bind(m_Listening,(LPSOCKADDR)&amp;local,sizeof(local))&nbsp;==&nbsp;SOCKET_ERROR&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(m_Listening);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建监听线程，这样也能响应界面上操作。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hListenThread&nbsp;=&nbsp;::Cr&#101;ateThread(NULL,0,ListenThread,this,0,&amp;dwThreadID);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_StartBtn.EnableWindow(FALSE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_StopBtn.EnableWindow(TRUE);<br/>}<br/>监听线程函数：<br/>DWORD&nbsp;WINAPI&nbsp;CServerDlg::ListenThread(LPVOID&nbsp;lpparam)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CServerDlg*&nbsp;pDlg&nbsp;=&nbsp;(CServerDlg*)lpparam;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pDlg&nbsp;==&nbsp;NULL)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br/>&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;&nbsp;Listening&nbsp;=&nbsp;pDlg-&gt;m_Listening;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始监听是否有客户端连接。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(listen(Listening,40)&nbsp;==&nbsp;SOCKET_ERROR)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;szBuf[MAX_PATH];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szBuf,0,MAX_PATH);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;ConnectSocket;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;&nbsp;&nbsp;&nbsp;ClientAddr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nLen&nbsp;=&nbsp;sizeof(sockaddr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//阻塞直到有客户端连接，不然多浪费CPU资源。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectSocket&nbsp;=&nbsp;accept(Listening,(sockaddr*)&amp;ClientAddr,&amp;nLen);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//都到客户端的IP地址。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*pAddrname&nbsp;=&nbsp;inet_ntoa(ClientAddr.sin_addr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDlg-&gt;Receive(ConnectSocket,szBuf,100);<br/>&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;pDlg-&gt;SetRequestText(szBuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(szBuf,&#34;&nbsp;:我是老猫，收到（&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(szBuf,pAddrname);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(szBuf,&#34;）&#34;);<br/>&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;pDlg-&gt;Send(ConnectSocket,szBuf,100);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br/>}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务器端一直在监听是否有客户端连接，如有连接，处理客户端的请求，给出回应，然后继续监听。<br/><strong>客户端：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户端的发送函数：<br/>#define&nbsp;DEFAULT_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2000<br/>void&nbsp;CClientDlg::OnSend()&nbsp;<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwIP&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szText[MAX_PATH];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szText,0,MAX_PATH);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_IP.GetWindowText(szText,MAX_PATH);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//把字符串形式的IP地址转成IN_ADDR结构需要的形式。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwIP&nbsp;=&nbsp;inet_addr(szText);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_RequestEdit.GetWindowText(szText,MAX_PATH);<br/>&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;local;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;socketTmp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//必须是AF_INET,表示该socket在Internet域中进行通信<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local.sin_family=AF_INET;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//端口号<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local.sin_port=htons(DEFAULT_PORT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//服务器的IP地址。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local.sin_addr.S_un.S_addr=dwIP;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////初始化Socket<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socketTmp=socket(AF_INET,SOCK_STREAM,0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接服务器<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(connect(socketTmp,(LPSOCKADDR)&amp;local,sizeof(local))&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(socketTmp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(&#34;连接服务器失败。&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送请求，为简单只发100字节，在服务器端也规定100字节。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Send(socketTmp,szText,100);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取服务器端返回的数据。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szText,0,MAX_PATH);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收服务器端的回应。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Receive(socketTmp,szText,100);<br/>&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szMessage[MAX_PATH];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szMessage,0,MAX_PATH);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(szMessage,szText);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//界面上显示回应数据。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ReplyBtn.SetWindowText(szMessage);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(socketTmp);<br/>}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户端就一个函数完成了一次通信。在这里IP地址为何用127.0.0.1呢？使用这个IP地址，服务器端和客户端就能运行在同一台机器上，这样调试方便多了。当然你可以在你朋友的机器上运行Server程序(本人在局域网中测试过)，在自己的机器上运行Client程序，当然输入的IP地址就该是你朋友机器的IP地址了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单的理论和实践都说了，现在Socket编程不神秘了吧？希望对你有些帮助。&nbsp;&nbsp;&nbsp;&nbsp;]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=510" /> 
	  <id>http://www.shinian10.com/default.asp?id=510</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[BOOT.INI文件详解]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=7" label="软件资源" /> 
	  <updated>2008-02-07T20:50:43+08:00</updated>
	  <published>2008-02-07T20:50:43+08:00</published>
		  <summary type="html"><![CDATA[先了解一下什么是BOOT.INI吧<br/>Windows&nbsp;NT类的操作系统，也就是Windows&nbsp;NT/2000/XP中，有一个特殊文件，也就是“BOOT.INI”文件，这个文件会很轻松地按照我们的需求设置好多重启动系统。&nbsp;<br/>“BOOT.INI”文件会在已经安装了Windows&nbsp;NT/2000/XP的操作系统的所在分区，一般默认为C:\下面存在。但是它默认具有隐藏和系统属性，所以你要设置你的文件夹选项，以便把“BOOT.INI”文件显示出来。我们可以用任何一种文本编辑器来打开他它。一般情况下，它的内容如下:&nbsp;<br/><img src="http://hiphotos.baidu.com/fuping111/pic/item/ce7abffd0a745e1409244dd2.jpg" border="0" alt=""/><br/><span style="color:#ff0000">[boot&nbsp;loader]&nbsp;<br/>timeout=30&nbsp;<br/>default=multi(0)disk(0)rdisk(0)partition(1)\Windows&nbsp;<br/>[operating&nbsp;systems]&nbsp;<br/>multi(0)disk(0)rdisk(0)partition(1)\Windows=&#34;Microsoft&nbsp;Windows&nbsp;XP&nbsp;Professional&#34;&nbsp;/fastdetect</span><br/>&nbsp;<br/>在Windows&nbsp;2000或者是XP系统中，我们可以很容易的设置“BOOT.INI”文件。那就是在“我的电脑”上面点击右键，选择“属性”打开“系统属性”对话框，再点击“高级”选项卡，在“启动和故障修复”里面点击“设置”按钮，就可以打开“启动和故障修复”对话框了，在这里面我们就可以对它进行详细设置。&nbsp;<br/>如果你拥有Windows&nbsp;XP操作系统，那么你可以用“系统配置实用程序”来更方便的编辑“BOOT.INI”文件。具体做法是:打开“开始”菜单，点击“<br/>[url=http://hi.baidu.com/fuping111/blog/item/5aead813d3b6da025aaf538c.html]<br/><span style="color:#800080"><strong>运行</strong></span><br/>[/url]<br/>”命令，再在弹出的文本框中输入“<br/>[url=http://hi.baidu.com/fuping111/blog/item/2298bf0011740187e850cd4d.html]<br/><span style="color:#800080"><strong>Msconfig</strong></span><br/>[/url]<br/>”点击“确定”后就会弹出“系统配置实用程序”，再点击“BOOT.INI”选项卡，就会出现如图所示的界面。在这里，我们可以很方便地设置文件。&nbsp;<br/>言归正传，现在，来说明一下这个文件内容的含义。&nbsp;<br/>1.系统加载部分（[boot&nbsp;loader]）&nbsp;<br/>这一部分很简单，只有两个设定。那就是“timeout=”和“default=”。&nbsp;<br/>“timeout=”就是设定开机时系统引导菜单显示的时间，超过设定值则自动加载下面“default=”指定的操作系统。默认值是30，单位为秒。我们可以在这里面设定等待时间的长短。如果将其设为“0”那么就是不显示系统引导菜单。&nbsp;<br/>“default=”则是设定默认引导的操作系统。而等号后面的操作系统必须是已经在“[operating&nbsp;systems]”中存在的。如果想默认为加载另外的操作系统，我们可以参看“[operating&nbsp;systems]”中的操作系统列表，然后把想要加载的操作系统按照格式写到“default=”后面就可以了。&nbsp;<br/>2.操作系统部分（[operating&nbsp;systems]）&nbsp;<br/>在这里面，列出了机器上所安装的全部操作系统。比如机器上只有一个操作系统，那么就只有一条信息，那就是“multi(0)disk(0)rdisk(0)partition(1)\Windows=&#34;Microsoft&nbsp;Windows&nbsp;XP&nbsp;Professional&#34;&nbsp;/fastdetect”&nbsp;<br/>在这里需要注意的是，在英文引号内的文字就是引导操作系统菜单时显示出来的让我们选择操作系统的提示文字，在这里面我们可以随意更改。而“multi(0)disk(0)rdisk(0)partition(1)&nbsp;\Windows”这一句就需要些解释了。因为它涉及ARC（高级RISC计算机）命名，它是x86或RISC计算机中用于标识设备的动态方法。&nbsp;<br/>ARC命名的第一部分用于标识硬件适配卡/磁盘控制器，它有两个选项:SCSI和Multi。&nbsp;<br/>Multi表示一个非SCSI硬盘或一个由SCSI&nbsp;BIOS访问的SCSI硬盘，而SCSI则表示一个SCSI&nbsp;BIOS禁止的SCSI硬盘。(x)是硬件适配卡序号。Disk(x)表示SCSI总线号。如果硬件适配卡为Multi，其正确表示方法就为disk(0)，rdisk(x)则表示硬盘的序号，如果硬件适配卡为SCSI则忽略此值;&nbsp;<br/>partition(x)表示硬盘的分区序号。了解这些，我们就可以解释前面那条信息的含义了，即“multi(0)disk(0)rdisk(0)partition(1)&nbsp;\Windows”为，在0号非SCSI设备上的第0号磁盘上的第一个分区里面的“Windows”目录下可以找到能够启动的操作系统。&nbsp;<br/>等号后的内容前面已经说过，那个就是引导菜单显示出来的供我们选择的提示文字。而后面的“/fastdetect”又是作什么用的呢？这是一个开关符，用来控制启动该操作系统时的具体选项，下面再来详细的介绍各种开关符的含义:&nbsp;<br/>/3GB:这是Win2000&nbsp;SP3新引入的。这使得用户区和系统区分为3G比1G的比例。只有用户使用NT企业版，应用程序也支持3GB选项时，此选项才生效。&nbsp;<br/>/BASEVIDE使用标准VGA方式启动。这种方式主要用于显示驱动程序失效时。&nbsp;<br/>/BAUDRATE:指出用于调度的波特率，如果用户不设置，则使用默认的9600，而对于线缆Modem则使用19200。&nbsp;<br/>/BOOTLOG:使Win2000将日志写入&nbsp;%SystemRoot%\NTBTLOG.TXT&nbsp;。&nbsp;<br/>/BURNMEMORY=:使NT在已知的内存上少使用指定的数量，如果/burnmemory=64，则有64M内存NT不使用。&nbsp;<br/>/CRASHDEBUG:调度器在NT启动时启动，只有在内核错误时才有用，如果系统经常会无故出错，这个选项就很有用了。&nbsp;<br/>/DEBUG:在启动NT时调入调度器，它可以在任何时间激活，在错误可以再次出现时使用它比较合适。&nbsp;<br/>/DEBUGPORT=&nbsp;comx&nbsp;:指定用于调度的端口，其它X就指端口号。&nbsp;<br/>/FASTDETECT:对于Win2000启动时，它使系统不检查串行口和并行口。&nbsp;<br/>/HAL=:允许用户不使用默认的HAL。&nbsp;<br/>/INTAFFINITY:设置多处理器HAL(HALMPS.DLL)，使编号最大的处理器接收中断请求。如果不设置此选项，Win2000会使所有处理器接收中断请求。&nbsp;<br/>/KERNEL=:与上面的功能相同，不过是针对SMP中的内核而言的。&nbsp;<br/>/MAXMEM:n:指定NT可以使用的最大内存数，如果一个内存片损坏，这个开关就十分有用了。&nbsp;<br/>/NODEBUG:不使用调试信息。&nbsp;<br/>/NOGUIBOOT:指定此选项会使Win2000不加载VGA驱动程序，也就不会显示启动过程和失败时的兰屏信息。&nbsp;<br/>/NOSERIALMICE=[COMx&nbsp;|&nbsp;COMx,y,z…]:在特定的COM中上禁止对串行鼠标的检测。如果用户有一个非鼠标设备接在COM口上，这个选项会十分有用。如果此开关未加参数，系统会禁止所有COM口。&nbsp;<br/>/NUMPROC=n:只允许前N个系统处理器工作。&nbsp;<br/>/ONECPU:在多处理器中只使用一个处理器。&nbsp;<br/>/PCILOCK:不让NT为PCI设置分配IO/IRQ资源，而启用BIOS设置。&nbsp;<br/>/SAFEBOOT:安全启动，这个大家一定十分熟悉，Win2000只启动HKLM\System\CurrentControlSet\Control\SafeBoot中的驱动程序和服务，其后跟三个参数MINIMAL，NETWORK或DSREPAIR之一。MINIMAL和NETWORK在允许网络下启动系统。而DSREPAIR要求系统从备份设备中调入活动目录的设置。还有一个选项是&#34;(Alt&#101;rNATESHELL)&#34;，它让系统调入由HKLM\System\CurrentControlSet\&nbsp;<br/>SafeBoot\Alt&#101;rnateShell指定的SHELL程序，而不使用默认的Explorer。&nbsp;<br/>/SOS:在调入驱动程序名时显示它的名字，在因驱动问题而无法启动时使用比较好。&nbsp;<br/>/WIN95:在装有三个系统DOS、Win9x和Windows&nbsp;NT的系统上，让NTLDR直接调用Win9x。启动文件BOOTSECT.W40。&nbsp;<br/>/WIN95DOS:在装有三个系统DOS、Win9x和Windows&nbsp;NT的系统上，让NTLDR直接调用DOS启动文件BOOTSECT.DOS&nbsp;<br/>/YEAR=:使用指定的年份，如果设置为/YEAR=2005，那现在的时间就是2005年，此选项仅对NT4+SP4和Win2000生效。&nbsp;<br/>全看懂了，你完全可以自己造一个！]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=509" /> 
	  <id>http://www.shinian10.com/default.asp?id=509</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[如何制作windows启动盘]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=7" label="软件资源" /> 
	  <updated>2008-02-07T11:03:35+08:00</updated>
	  <published>2008-02-07T11:03:35+08:00</published>
		  <summary type="html"><![CDATA[系统封装很多人都会了所以我打算放到后面写~先写做启动盘吧！<br/>首先我们要做准备工作，下面是需要的软件：<br/><span style="color:#ff0033">EasyBoot&nbsp;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以轻易的做出启动光盘的启动界面。<br/><span style="color:#ff0000">Delphi</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编程软件，用来做光盘的AutoRun.exe的。（任意编程软件都可以，因为我学D的，所以这里就用D了！）<br/><span style="color:#ff0000">PS</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然就是用它来做图了~~呵呵！<br/><span style="color:#ff0000">WinImage</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来编辑和创建你的IMG镜像文件。<br/><span style="color:#ff0000">UltraISO</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来编辑你做好的ISO文件<br/><span style="color:#ff0000">nero</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;光盘刻录软件！我觉得很好用！<br/><span style="color:#ff0000">ACPI电源管理工具</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;网上有很下载的，用它可以删除驱动，开机时选择电源驱动<br/><span style="color:#ff0000">DEPLOY.CAB</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;微软的封装工具包，在windows光盘中！<br/><span style="color:#ff0000">ghost.exe</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个作用我就不说了吧！<br/><span style="color:#ff0000">DOS工具</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个是用来做自己的DOS工具箱的，可以下载你喜欢的任何DOS程序！<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;废话不多说~下面是EasyBoot的界面：<br/><img src="http://bbs.txwm.com/skins/default/filetype/gif.gif" border="0" alt=""/><br/>此主题相关图片如下：<br/><img src="http://bbs.txwm.com/UploadFile/2007-6/20076206511733.gif" border="0" alt=""/><br/>这个是我做好的启动画面，刚才已经刻好盘了哦~~是不是也想拥有一张属于自己的系统盘呢？那就继续往下看吧！<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EasyBoot的使用方法在帮助文件里应该写的很清楚的，我在这里说一下比较常用的功能和使用方法！<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最重要的也就是菜单编辑了，其他的用不用都无所谓的！<br/><img src="http://bbs.txwm.com/skins/default/filetype/gif.gif" border="0" alt=""/><br/>此主题相关图片如下：<br/><img src="http://bbs.txwm.com/UploadFile/2007-6/2007620657358.gif" border="0" alt=""/><br/>颜色设置如果想要透明的话就全部设置成白色的。我就是这么设置的~编辑菜单都是比较而言容易的，毕竟都是面向对象式的。主要是在执行命令那里。<br/>EasyBoot提供了三种命令（是不是还有其他的我就不太清楚了，主要用的就是这三个！）<br/>1、boot&nbsp;80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在执行命令中输入这个的话，那相对菜单的功能就是从硬盘启动！<br/>2、reboot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个名字很容易看明白吧！重启。相对菜单的功能就是重启计算机了！<br/>3、run&nbsp;***.img&nbsp;&nbsp;&nbsp;运行镜像文件。IMG文件的制作会在下面说的！<br/>在EasyBoot的其他选项中可以设置进度条和倒计时功能。<br/>文本显示中设置启动界面文本。<br/>屏幕布局基本上不需要用了吧！<br/>还有就是EasyBoot的目录结构。<br/>\-----&gt;EasyBoot.exe<br/>&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;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disk1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISO<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EZboot<br/>这样不会有人看不明白吧~<br/>disk1：里的文件生成ISO的时候就是根目录的文件了。<br/>EZboot：这个目录中存放着你的镜像文件及启动界面之类的文件。<br/>ISO：顾名思义就是存放ISO文件的目录了，可以自己选择路径的。<br/>汗~~~~刚才不小心把网页给关了……还要重写N多字！郁闷！！！！！！<br/>EasyBoot的使用在这里就不说了，具体看软件的帮助文档！下面我来教大家怎么制做自己的IMG镜像文件！就以启动菜单中的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;手动运行ghost&nbsp;&nbsp;&nbsp;为例吧！<br/>在菜单中编辑一个&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;手动运行ghost&nbsp;&nbsp;&nbsp;，然后执行命令中填写&nbsp;&nbsp;&nbsp;&#34;ran&nbsp;ghost.img&#34;&nbsp;不包括引号！<br/>很多人在做IMG的时候总是要从这里那里抓一堆文件过来，其实&nbsp;&nbsp;&nbsp;EasyBoot已经给我们准备好了这些文件的，EasyBoot\&nbsp;disk1\EZboot\&nbsp;下有一个setup98.img的文件，我们复制它，粘贴，然后改名为&#34;ghost.img&#34;&nbsp;用Winimage打开ghost.img编辑，保留以下文件，其他的全部删除：<br/>Autoexec.bat<br/>command.com<br/>config.sys<br/>himem.sys<br/>io.sys<br/>mouse.exe<br/>msdos.sys<br/>然后下载ghost.exe放在里面！用记事本编辑Autoexec.bat为以下内容：<br/>@ECHO&nbsp;OFF<br/>path=a:\<br/>mouse<br/>ghost<br/>用记事本编辑config.sys为以下内容：<br/>device=himem.sys&nbsp;/testmem:off<br/>files=60<br/>buffers=20<br/>dos=high,umb<br/>stacks=9,256<br/>lastdrive=z<br/>编辑这两个文件的时候要先把它们提取出来，编辑好了以后再放进去！保存~~~<br/>OK！手动运行ghost的IMG就完成了！是不是很简单呢？<br/><img src="http://bbs.txwm.com/skins/default/filetype/gif.gif" border="0" alt=""/><br/>此主题相关图片如下：<br/><img src="http://bbs.txwm.com/UploadFile/2007-6/2007620876481.gif" border="0" alt=""/><br/>一晚上都没休息了，先去睡觉！等晚上再过来继续写！想学的话就用力顶~~~~呵呵！<br/>下次讲系统封装&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再下一次讲用Delphi制做Autorun.exe&nbsp;插入光盘后自动运行的程序！&nbsp;&nbsp;<br/><img src="http://bbs.txwm.com/skins/default/filetype/gif.gif" border="0" alt=""/><br/>此主题相关图片如下：<br/><img src="http://bbs.txwm.com/UploadFile/2007-6/200762074033312.gif" border="0" alt=""/><br/>上面是我做的，基本上没有做什么美化，加了个Media&nbsp;Player控件，打开后会自动播放Mp3。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=508" /> 
	  <id>http://www.shinian10.com/default.asp?id=508</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[手机SIM卡常识]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=19" label="硬件设计" /> 
	  <updated>2008-02-01T12:04:02+08:00</updated>
	  <published>2008-02-01T12:04:02+08:00</published>
		  <summary type="html"><![CDATA[手机是什么？几乎所有人都知道答案：就是那特烧钱、特不保值的玩意！SIM卡是什么？估计许多人无法给出一个比较完整的答案，只知道是一张小小的卡片！但是您也许不知道手机离开了这张小小的SIM卡是几乎做不了工作的，除了在特殊情况下用户可以通过不带SIM卡的呼叫网络许可的专用紧急号码，比如110，119等等……下面让我们走近SIM卡，一起来揭开SIM卡的面纱，看看它的真实“面目”。&nbsp;<br/>一、SIM卡名词解释&nbsp;<br/>SIM卡（Subscriber&nbsp;Identity&nbsp;Module），即用户识别卡，它是一张符合GSM规范的“智慧卡”，SIM卡有大小之分，大卡尺寸54mmx84mm（约为名片大小），小卡尺寸为25mmx15mm（比普通邮票还小）。其实“大卡”上面真正起作用的是它上面的那张“小卡”，“小卡”上起作用的部分只有小指甲盖那么大。目前国内流行样式是“小卡”，小卡也可以换成“大卡”（有个卡托即可）。“大卡”和“小卡”分别适用于不同类型的GSM移动电话，早期的机型如摩托罗拉GC87C、308C等手机用的是“大卡”，现在新出的机型基本上都是用“小卡”。SIM卡可以插入任何一部符合GSM规范的移动电话中，“实现电话号码随卡不随机的功能”，而通话费则自动计入持卡用户的帐单上，与手机无关。&nbsp;二、SIM卡密码剖析&nbsp;<br/>（1）PIN码（Personal&nbsp;Identity&nbsp;Number）：个人识别码，也叫PIN1码，长4位，由用户自己设定，是属于SIM卡的密码，用来保护SIM卡的安全，初始状态是不激活的。启动该功能后，每次用户重新开机后，GSM系统就要和手机之间进行自动鉴别，判断SIM卡的合法性，即和手机对“口令”，只有在系统认可后，才为该用户提供服务。&nbsp;d<br/>（2）IN2码：PIN2码也是SIM卡的密码，它跟网络的计费和SIM卡内部资料的修改有关。手机上的“计费”功能需要PIN2码支持。GSM协议支持手机随时查询已通话的支出，但国内移动局和联通都未开通此项业务，所以PIN2码用户都不知道。<br/>（3）PUK（PIN&nbsp;Unblocking&nbsp;Key）：PUK码是解PIN码的万能锁，每张SM卡有各自对应的PUK码，长8位，可以交由用户自己管理，也可以由网络运营商自己控制。目前国内移动局基本都已开通查询PUK的业务，用户可以自己管理PUK码。&nbsp;<br/>三、SIM卡使用FAQ&nbsp;<br/>（1）SIM卡的日常使用中该注意什么？&nbsp;<br/>一是请勿将卡弯曲，卡上的金属芯片更应小心保护，保持金属芯片清洁（可用酒精棉球轻擦），避免沾染尘埃及化学物品；二是为保护金属芯片，请避免经常将SIM卡从手机中抽出；请勿将SIM卡置于超过85度或低于-35度的环境中；在取出或放入SIM卡前，请先关闭手机电源；三是最好不要用手去触摸那些触点，以防止静电损坏。&nbsp;<br/>（2）SIM卡被锁怎么办？&nbsp;<br/>导致这种锁卡现象的发生原因一般都是用户在启动PIN码保护功能后不慎将PIN码忘记，在错误的输入三次PIN码后SIM自动上锁，手机无法接入网络，提示要求输入PUK码。此时若您不知道PUK码，那么请不要再尝试输入PIN码了，请携带有关凭证（比如手机使用证，俗称无委证、身份证）和手机到移动局或者联通的营业厅去解开（免费）。若您输入10次错误的PIN码，那么SIM卡的自杀程序将自动启动，将SIM烧毁，这样您将需要花费人民币100元来重新办理一张新的SIM卡。<br/>（3）SIM卡遗失或者被窃后该做什么？&nbsp;<br/>当您遭遇到这种情况后，请立即携带有关证件到移动局或者联通营业厅去申请挂失，避免SIM卡被盗用，给您造成经济损失，并重新补办一张新的SIM卡。&nbsp;<br/>（4）SIM卡插入手机后开机出现出错信息怎么办？&nbsp;<br/>一是出现手机插入SIM卡开机后无任何反应或插入SIM卡显示出错（Bad&nbsp;Card/SIM&nbsp;Error）时，表示可能：SIM卡开关不良、接触不良、或使用废卡均会出现这样的问题。如果换新卡后故障仍然存在，那么故障一般发生在SIM卡供电部分。在SIM卡插座的供电端、时钟端、数据端，开机瞬间可用示波器观察到读卡信号，如无此信号，应为SIM卡供电开关周边电阻电容元件与卡脱焊问题。二是SIM卡在一部手机上可以用，在另一部手机上不能用，可能是在手机中已经设置“网络限制”和“用户限制”功能。可以通过16部网络控制码（NCK）、用户控制码（SPCK）启动该手机的限制功能，这种故障需要网络运营商解决，有时是SIM卡供电偏低或接触不良造成。<br/>四、SIM卡知识进阶&nbsp;<br/>（一）SIM卡内保存的数据可以归纳为以下四种类型：&nbsp;<br/>（1）由SIM卡生产厂商存入的系统原始数据。&nbsp;<br/>（2）由GSM网络运营部门或者其他经营部门在将卡发放给用户时注入的网络参数和用户数据。包括：&nbsp;<br/>*鉴权和加密信息Ki（Kc算法输入参数之一：密匙号）；&nbsp;<br/>*国际移动用户号（IMSI）；&nbsp;<br/>*A3：IMSI认证算法；&nbsp;<br/>*A5：加密密匙生成算法；&nbsp;<br/>*A8：密匙（Kc）生成前，用户密匙（Kc）生成算法；&nbsp;<br/>（3）由用户自己存入的数据。比如，短消息、固定拨号，缩位拨号，性能参数，话费记数等。&nbsp;<br/>（4）用户在用卡过程中自动存入和更新的网络接续和用户信息类数据。包括最近一次位置登记时的手机所在位置区识别号（LAI），设置的周期性位置更新间隔时间，临时移动用户号（TMSI）等。&nbsp;<br/>这些数据都存放在各自的目录项内，第一类数据放在根目录，当电源开启后首先进入根目录，再根据指令进入相关的子目录，每种目录极其内部的数据域均有各自的识别码保护，只有经过核对判别以后才能对数据域中的数据进行查询，读出和更新。上面第一类数据通常属永久性的数据，由SIM卡生产厂商注入以后无法更改，第二类数据只有网络运行部门的专门机构才允许查阅和更新，再第三、四类数据中的大部分允许用户利用任何手机对其进行读/写操作。&nbsp;<br/>（二）SIM卡结构&nbsp;<br/>（1）SIM卡能够储存多少电话号码取决于卡的EEPROM的容量（有2K、3K、8K容量），若有8KB的存储容量，可供储存以下信息：&nbsp;<br/>*100组电话号码及其对应的性名文字；&nbsp;<br/>*15组短信息（Short&nbsp;Message）；&nbsp;<br/>*25组以上最近拨出的号码；&nbsp;<br/>*4位SIM卡密码（PIN）。&nbsp;<br/>表1：几种主要的SIM卡的结构数据&nbsp;<br/>（2）SIM卡是带有微处理器的芯片卡，内有5个模块，每个模块对应一个功能：CPU（8位）、程序存储器ROM（6-16kbit）、工作存储器RAM（128-256kbit）、数据存储器EEPROM（2-8kbit）和串行通信单元，这5个模块集成在一块集成电路中。SIM卡在与手机连接时，最少需要5个连接线：&nbsp;<br/>*电源（Vcc）&nbsp;<br/>*时钟（CLK）<br/>*数据I/Q口（Data）&nbsp;<br/>*复位（RST）&nbsp;<br/>*接地端（GND）&nbsp;<br/>（3）电源开关时，SIM卡电气性能为：当开启电源期间，按以下次序激活各触点：RST低电平状态；Vcc加电；I/O口处于接收状态；Vpp加电；提供稳定的时钟信号。当关闭电源时，按如下次序工作：RST低电平状态；CLK低电平状态；Vpp去电；I/O口低电平状态；Vcc掉电。&nbsp;<br/>（4）SIM卡背面上20位数字所代表的含义如下：&nbsp;<br/>*前6位（898600）：是中国的代号；&nbsp;<br/>*第7位：业务接入号，对应于135、136、137、138、139中的5、6、8、9；&nbsp;<br/>*第8位：SIM卡的功能位：一般为0，现在的预付费SIM卡为I；&nbsp;<br/>*第9、10位：各省的编码；&nbsp;<br/>*11、12位：年号；&nbsp;<br/>*13位：供应商代码；&nbsp;<br/>*14-19位：用户识别码；&nbsp;<br/>*20位：校验位。&nbsp;<br/>厂商SIM卡型号&nbsp;中央处理器&nbsp;ROM&nbsp;RAM&nbsp;EEPROM&nbsp;<br/>摩托罗拉SC21&nbsp;8位&nbsp;6kbit&nbsp;128kbit&nbsp;3kbit&nbsp;<br/>Sc27&nbsp;8位&nbsp;12kbit&nbsp;240kbit&nbsp;3kbit&nbsp;<br/>Sc28&nbsp;8位&nbsp;16kbit&nbsp;240kbit&nbsp;8kbit&nbsp;<br/>日立H8/3101&nbsp;8/16位&nbsp;10kbit&nbsp;256kbit&nbsp;8kbit&nbsp;<br/>Thomson&nbsp;ST16612&nbsp;8位&nbsp;6kbit&nbsp;128kbit&nbsp;2kbit&nbsp;<br/>ST16&nbsp;8位&nbsp;16kbit&nbsp;256kbit&nbsp;8kbit<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=507" /> 
	  <id>http://www.shinian10.com/default.asp?id=507</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[基于PROTEUS模拟的精美万年历]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=13" label="protel学习" /> 
	  <updated>2008-02-01T11:47:45+08:00</updated>
	  <published>2008-02-01T11:47:45+08:00</published>
		  <summary type="html"><![CDATA[为了把KS0108系列的液晶吃透,特别制作了这款万年历,感觉效果还是不错的.希望大家分享我的喜悦,毕竟有了更多志同道合的朋友支持,我才能更进一步提高.<br/>一,原理介绍<br/>说明:<br/>1.单片机还是采用PIC中最经典的PIC16F877A,端口多,功能全,特别是他有8K的ROM,这是我选择的主要原因,因为储存液晶的字库需要很大的空间.<br/>2.液晶显示还是用的KS0108系列,主要是他性价比高,指令简单,特别是公司也在用.<br/>3.时钟/日历芯片用的DALLOS的DS1302芯片,他可以储存从2000-2099年的日历,及实时时钟,可以方便的读写.<br/>4.温度测量还是用的DS18B20,这在我上一实例中已经用过,有兴趣可以查阅.<br/>5.本万年历可以显示实时时钟,精确到秒,年,月,日,星期,阴历,温度,生肖等,显示的信息量大.<br/>6,可以通过按键自由设定时钟及日历,按&#34;设置&#34;键可以在秒,分,时,日,月,星期,年之间来回切换,要设置的单元以闪烁提醒.通过&#34;+&#34;.&#34;-&#34;按键可以把要设置的单元设定到预想状态.<br/><img src="http://www.shinian10.com/attachments/month_0802/wangnianli.jpg" border="0" alt=""/><br/>二,程序说明:<br/>本程序有许多小的模块,现分列如下:<br/>1.主程序<br/>/***************************************************<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;&nbsp;&nbsp;*<br/>*&nbsp;作者：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/>*&nbsp;日期：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/>*&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;,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>***************************************************/<br/>#include&nbsp;<br/>#include&nbsp;&#34;ziku.h&#34;<br/>#include&nbsp;&#34;lcd_init.h&#34;<br/>#include&nbsp;&#34;ds1302.h&#34;<br/>#include&nbsp;&#34;ds18b20.h&#34;<br/>#include&nbsp;&#34;keyscan.h&#34;<br/>#include&nbsp;&#34;yinli.h&#34;<br/>//子程序<br/>//LCD显示空白边框子程序<br/>void&nbsp;LCDShowTable()<br/>{<br/>&nbsp;uch&nbsp;i;<br/>&nbsp;SlectScreen(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写左半屏<br/>&nbsp;SetLine(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//起使页<br/>&nbsp;SetColumn(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//起使列<br/>&nbsp;for(i=0;i<br/>//显示固定字符子程序<br/>void&nbsp;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/>/*----------------------------------------------------------*/<br/>//TRM1初始化子程序<br/>void&nbsp;TMR1init()<br/>{<br/>&nbsp;//TRM1&nbsp;INITIAL<br/>&nbsp;&nbsp;&nbsp;T1CON=0X30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8分频<br/>&nbsp;&nbsp;&nbsp;TMR1IF=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清中断标志<br/>&nbsp;&nbsp;&nbsp;TMR1IE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能定时器1中断<br/>&nbsp;&nbsp;&nbsp;TMR1L=0XDB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始值（定时0.5S）<br/>&nbsp;&nbsp;&nbsp;TMR1H=0X0B;<br/>&nbsp;&nbsp;&nbsp;TMR1ON=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开定时器1<br/>}<br/>//冒号闪烁子程序<br/>void&nbsp;FlashMaohao()<br/>{<br/>&nbsp;static&nbsp;uch&nbsp;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;&nbsp;//重新付初值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMR1H=0X0B;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=flag%2;&nbsp;&nbsp;&nbsp;&nbsp;//闪烁标志在0-1间翻转<br/>&nbsp;&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;&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/>}<br/>//主程序<br/>void&nbsp;main()<br/>{<br/>&nbsp;TMR1init();&nbsp;&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;&nbsp;//键盘初始化<br/>&nbsp;LCDinit();&nbsp;&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;&nbsp;//显示空白表格<br/>&nbsp;LCDShowGudingWord();&nbsp;&nbsp;&nbsp;&nbsp;//显示固定字符<br/>&nbsp;//Set1302(DisCash);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置初始时间（默认写入我写程序的时间）<br/>&nbsp;get_temp();&nbsp;&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;&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;&nbsp;//冒号闪烁<br/>&nbsp;&nbsp;KeyScan();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//键盘扫描<br/>&nbsp;}<br/>}<br/>2.测温程序:<br/>/***************************************************<br/>*&nbsp;标题：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/>*&nbsp;作者：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;*<br/>*&nbsp;日期：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/>*&nbsp;说明：使用DS18B20芯片测温&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br/>***************************************************/<br/>#&nbsp;define&nbsp;DQ&nbsp;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;&nbsp;//定义18B20数据端口&nbsp;<br/>#&nbsp;define&nbsp;DQ_DIR&nbsp;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;&nbsp;//定义18B20D口方向寄存器&nbsp;<br/>#&nbsp;define&nbsp;DQ_HIGH()&nbsp;DQ_DIR&nbsp;=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置数据口为输入<br/>#&nbsp;define&nbsp;DQ_LOW()&nbsp;DQ&nbsp;=&nbsp;0;&nbsp;DQ_DIR&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置数据口为输出<br/>&nbsp;unsigned&nbsp;char&nbsp;&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;&nbsp;&nbsp;//采集到的温度高8位<br/>&nbsp;unsigned&nbsp;char&nbsp;&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;&nbsp;//采集到的温度低8位<br/>&nbsp;unsigned&nbsp;char&nbsp;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;&nbsp;//转换后的温度值整数部分<br/>&nbsp;<br/>&nbsp;//------------------------------------------------<br/>//延时函数<br/>//系统初始化函数<br/>void&nbsp;init()<br/>{<br/>&nbsp;&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;&nbsp;//设置A口为普通数字口<br/>&nbsp;&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;&nbsp;//设置A口方向为输出<br/>&nbsp;&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;&nbsp;//设置D口方向为输出<br/>}<br/>//-----------------------------------------------<br/>//复位DS18B20函数<br/>reset(void)<br/>{<br/>&nbsp;&nbsp;char&nbsp;presence=1;<br/>&nbsp;&nbsp;while(presence)<br/>&nbsp;&nbsp;{&nbsp;<br/>&nbsp;&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;&nbsp;&nbsp;//主机拉至低电平<br/>&nbsp;&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;&nbsp;//延时503us<br/>&nbsp;&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;&nbsp;//释放总线等电阻拉高总线,并保持15~60us<br/>&nbsp;&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;&nbsp;//延时70us<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(DQ==1)&nbsp;presence=1;&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;else&nbsp;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;&nbsp;//接收到应答信号<br/>&nbsp;&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;&nbsp;//延时430us<br/>&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>//-----------------------------------------------<br/>//写18b20写字节函数<br/>void&nbsp;write_byte(uch&nbsp;val)<br/>{<br/>&nbsp;uch&nbsp;i;<br/>&nbsp;uch&nbsp;temp;<br/>&nbsp;for(i=8;i&gt;0;i--)<br/>&nbsp;{<br/>&nbsp;&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;&nbsp;//最低位移出<br/>&nbsp;&nbsp;&nbsp;DQ_LOW();&nbsp;<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&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;&nbsp;//从高拉至低电平,产生写时间隙<br/>&nbsp;&nbsp;&nbsp;if(temp==1)&nbsp;&nbsp;DQ_HIGH();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果写1,拉高电平<br/>&nbsp;&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;&nbsp;//延时63us<br/>&nbsp;&nbsp;&nbsp;DQ_HIGH();&nbsp;<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&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;&nbsp;//右移一位<br/>&nbsp;&nbsp;}<br/>}<br/>//------------------------------------------------<br/>//18b20读字节函数<br/>uch&nbsp;read_byte(void)<br/>{<br/>&nbsp;uch&nbsp;i;<br/>&nbsp;uch&nbsp;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;&nbsp;//读出温度<br/>&nbsp;static&nbsp;bit&nbsp;j;<br/>&nbsp;for(i=8;i&gt;0;i--)<br/>&nbsp;{<br/>&nbsp;&nbsp;&nbsp;value&gt;&gt;=1;&nbsp;<br/>&nbsp;&nbsp;&nbsp;DQ_LOW();<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&nbsp;&nbsp;NOP();<br/>&nbsp;&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;//6us<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;//拉至高电平<br/>&nbsp;&nbsp;&nbsp;NOP();&nbsp;<br/>&nbsp;&nbsp;&nbsp;NOP();&nbsp;<br/>&nbsp;&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;//4us<br/>&nbsp;&nbsp;&nbsp;j=DQ;<br/>&nbsp;&nbsp;&nbsp;if(j)&nbsp;value|=0x80;<br/>&nbsp;&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;//63us<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;return(value);<br/>}<br/>//-------------------------------------------------<br/>//启动温度转换函数<br/>void&nbsp;get_temp()<br/>{&nbsp;<br/>int&nbsp;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;&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;&nbsp;//忽略ROM匹配&nbsp;<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;//发送温度转化命令&nbsp;&nbsp;<br/>for(i=10;i&gt;0;i--)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&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;&nbsp;//调用多次显示函数，确保温度转换完成所需要的时间<br/>&nbsp;&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;&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;&nbsp;//忽略ROM匹配&nbsp;<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;&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;&nbsp;//读出温度低8&nbsp;<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;&nbsp;//读出温度高8位&nbsp;<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;&nbsp;//释放总线&nbsp;<br/>TZ=(TLV&gt;&gt;4)|(THV<br/>3.日历显示程序<br/>/***************************************************<br/>*&nbsp;标题：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;*<br/>*&nbsp;作者：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;*<br/>*&nbsp;日期：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/>*&nbsp;说明：日历显示范围：2000年--2099年&nbsp;&nbsp;*<br/>***************************************************/<br/>#define&nbsp;&nbsp;RST&nbsp;&nbsp;RC0<br/>#define&nbsp;&nbsp;SCLK&nbsp;RC1&nbsp;<br/>#define&nbsp;&nbsp;IO&nbsp;&nbsp;&nbsp;RC2<br/>uch&nbsp;flag=0;<br/>uch&nbsp;second=1,minute=1,hour=1,year=1,month=1,date=1,day=1;<br/>uch&nbsp;clock[]={0};<br/>uch&nbsp;DisCash[]={0x00,0x30,0x09,0x16,0x01,0x03,0x09};&nbsp;<br/>/////往1302写入1Byte数据////////////////////////<br/>void&nbsp;RTInputByte(uch&nbsp;d)&nbsp;<br/>{&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uch&nbsp;i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;TRISC=0x00;<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(i=8;&nbsp;i&gt;0;&nbsp;i--)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO&nbsp;=&nbsp;d&amp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//取最低位<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//上升沿发送<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//恢复<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;d&nbsp;&gt;&gt;&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br/>}<br/>///////从1302读取1Byte数据////////////////////////<br/>uch&nbsp;RTOutputByte(void)&nbsp;<br/>{&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uch&nbsp;i,val=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;TRISC2=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置为输入<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(i=8;&nbsp;i&gt;0;&nbsp;i--)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;val&nbsp;&gt;&gt;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(IO)val=val|0x80;//&nbsp;从最低位开始接收<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下降沿接收<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;0;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(val);&nbsp;<br/>}<br/>///////先写地址，后写命令/数据//////////////////////////<br/>void&nbsp;W1302(uch&nbsp;ucAddr,&nbsp;uch&nbsp;ucDa)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开DS1302<br/>&nbsp;&nbsp;&nbsp;&nbsp;RTInputByte(ucAddr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;/*&nbsp;地址，命令&nbsp;*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;RTInputByte(ucDa);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;/*&nbsp;写1Byte数据*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭DS1302<br/>}<br/>///////先写地址，后读命令/数据////////////////////////<br/>uch&nbsp;R1302(uch&nbsp;ucAddr)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;uch&nbsp;ucData;<br/>&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;RTInputByte(ucAddr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;/*&nbsp;地址，命令&nbsp;*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;ucData&nbsp;=&nbsp;RTOutputByte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;/*&nbsp;读1Byte数据&nbsp;*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;SCLK&nbsp;=&nbsp;1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return(ucData);<br/>}<br/>/////////向1302写入&nbsp;秒&nbsp;分&nbsp;时&nbsp;日&nbsp;月&nbsp;星期&nbsp;年&nbsp;*/////////////<br/>void&nbsp;Set1302(uch&nbsp;*pClock)&nbsp;<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;uch&nbsp;i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uch&nbsp;ucAddr&nbsp;=&nbsp;0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//起使地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x8e,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///*&nbsp;控制命令,WP=0,允许写操作*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=7;&nbsp;i&gt;0;&nbsp;i--)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W1302(ucAddr,*pClock);&nbsp;&nbsp;&nbsp;&nbsp;///*&nbsp;秒&nbsp;分&nbsp;时&nbsp;日&nbsp;月&nbsp;星期&nbsp;年&nbsp;*/&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pClock++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucAddr&nbsp;+=2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写地址加2<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W1302(0x8e,0x80);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;/*&nbsp;控制命令,WP=1,写保护*/<br/>}<br/>////////从1302读出&nbsp;秒&nbsp;分&nbsp;时&nbsp;日&nbsp;月&nbsp;星期&nbsp;年&nbsp;*//////////////////<br/>void&nbsp;v_Get1302(unsigned&nbsp;char&nbsp;&nbsp;ucCurtime[])&nbsp;<br/>{<br/>unsigned&nbsp;char&nbsp;i;<br/>unsigned&nbsp;char&nbsp;ucAddr&nbsp;=&nbsp;0x81;<br/>for(i=0;i<br/>/////////与LCD的显示接口//////////////////////<br/>void&nbsp;display()<br/>{<br/>&nbsp;uch&nbsp;i;<br/>&nbsp;for(i=0;i<br/>4.按键扫描与服务程序<br/>/***************************************************<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;*<br/>*&nbsp;作者：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;<br/>*&nbsp;日期：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/>*&nbsp;说明：当按键按下，选中的单元就会闪烁&nbsp;*<br/>***************************************************/<br/>uch&nbsp;k=0;<br/>//键盘初始化子程序<br/>void&nbsp;keyinit()<br/>{<br/>&nbsp;TRISD0=1;<br/>&nbsp;TRISD0=1;<br/>&nbsp;TRISD0=1;<br/>}<br/>/*----------------------------------------------------------*/<br/>//键盘扫描子程序<br/>void&nbsp;KeyScan()<br/>{<br/>&nbsp;int&nbsp;d;<br/>&nbsp;if(RD0==0)&nbsp;&nbsp;//设置键按下<br/>&nbsp;{<br/>&nbsp;&nbsp;k++;&nbsp;&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&nbsp;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;&nbsp;//设置秒的闪烁标志<br/>&nbsp;&nbsp;&nbsp;minute=1;&nbsp;&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;&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;&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(d0x3b)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(d0x17)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(d0x1f)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(d0x0c)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(d0x07)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(d0x63)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<br/>5.液晶显示程序<br/>/***************************************************<br/>*&nbsp;标题：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;&nbsp;*<br/>*&nbsp;作者：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/>*&nbsp;日期：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/>*&nbsp;说明：KS0108系列液晶不带字库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br/>***************************************************/<br/>#include&nbsp;<br/>#define&nbsp;E&nbsp;&nbsp;&nbsp;&nbsp;RA0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//液晶使能端<br/>#define&nbsp;RW&nbsp;&nbsp;&nbsp;RA1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读写控制端<br/>#define&nbsp;DI&nbsp;&nbsp;&nbsp;RA2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据/指令通道<br/>#define&nbsp;CSA&nbsp;&nbsp;RA5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//片选<br/>#define&nbsp;CSB&nbsp;&nbsp;RA3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//片选<br/>#define&nbsp;nop()&nbsp;asm(&#34;nop&#34;)<br/>////////////////////////基本子函数///////////////////////<br/>//延时<br/>void&nbsp;delay(char&nbsp;x,char&nbsp;y)&nbsp;<br/>{<br/>&nbsp;&nbsp;char&nbsp;z;<br/>&nbsp;&nbsp;do{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z=y;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do{;}while(--z);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}while(--x);<br/>&nbsp;}<br/>//其指令时间为：7+（3*（Y-1）+7）*（X-1）如果再加上函数调用的call&nbsp;指令、页面设定、传递参数花掉的7&nbsp;个指令。<br/>//则是：14+（3*（Y-1）+7）*（X-1）。<br/>//--------------------------------------------------<br/>void&nbsp;LCDdelay()<br/>{<br/>&nbsp;unsigned&nbsp;int&nbsp;i=500;<br/>&nbsp;while(i--)<br/>&nbsp;{;}<br/>}<br/>/*----------------------------------------------------*/<br/>//状态检查<br/>void&nbsp;CheckState()<br/>{<br/>&nbsp;unsigned&nbsp;int&nbsp;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;&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;&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;&nbsp;//高电平读数据<br/>&nbsp;&nbsp;dat=PORTB&amp;0x90;&nbsp;&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;&nbsp;//恢复口为输出<br/>}<br/>/*----------------------------------------------------*/<br/>//写显示数据<br/>//dat:显示数据<br/>void&nbsp;WriteData(unsigned&nbsp;char&nbsp;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;&nbsp;//写数据<br/>&nbsp;RW=0;<br/>&nbsp;PORTB=dat;<br/>&nbsp;E=1;<br/>&nbsp;E=0;<br/>}<br/>/*---------------------------------------------------*/<br/>//写指令<br/>//command:操作LCD的指令<br/>void&nbsp;WriteCommand(unsigned&nbsp;char&nbsp;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;&nbsp;//写指令<br/>&nbsp;PORTB=dat;<br/>&nbsp;E=1;<br/>&nbsp;E=0;<br/>}<br/>/*---------------------------------------------------*/<br/>//设定页地址----X:0--7<br/>void&nbsp;SetLine(unsigned&nbsp;char&nbsp;line)<br/>{<br/>&nbsp;line=line&amp;0x07;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0<br/>//设定列地址----Y:0--63<br/>void&nbsp;SetColumn(unsigned&nbsp;char&nbsp;column)<br/>{<br/>&nbsp;column=column&amp;0x3f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0<br/>//设定开始行<br/>void&nbsp;SetStartLine(unsigned&nbsp;char&nbsp;startline)<br/>{<br/>&nbsp;startline=startline&amp;0x3f;&nbsp;&nbsp;&nbsp;//0<br/>//开关显示<br/>//1:开显示&nbsp;&nbsp;0:关显示<br/>void&nbsp;SetOnOff(unsigned&nbsp;char&nbsp;state)<br/>{<br/>&nbsp;state=state|0x3e;<br/>&nbsp;WriteCommand(state);<br/>}<br/>/*--------------------------------------------------*/<br/>//选择屏幕<br/>//screen:&nbsp;1:左屏&nbsp;2:右屏<br/>void&nbsp;SlectScreen(unsigned&nbsp;char&nbsp;screen)<br/>{<br/>&nbsp;switch(screen)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;1:&nbsp;CSA=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CSB=1;//左屏<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;case&nbsp;2:&nbsp;CSA=1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSB=0;//右屏<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;}<br/>}<br/>/*--------------------------------------------------*/<br/>//清屏<br/>//screen:&nbsp;1:左屏&nbsp;2:右屏<br/>void&nbsp;ClearScreen(unsigned&nbsp;char&nbsp;screen)<br/>{<br/>&nbsp;unsigned&nbsp;char&nbsp;i,j;<br/>&nbsp;SlectScreen(screen);<br/>&nbsp;for(i=0;i<br/>//显示一个16X16的汉字<br/>void&nbsp;Show16X16(unsigned&nbsp;char&nbsp;line,unsigned&nbsp;char&nbsp;column,const&nbsp;unsigned&nbsp;char&nbsp;*pt)<br/>{<br/>&nbsp;unsigned&nbsp;char&nbsp;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;&nbsp;//选通左屏<br/>&nbsp;SetColumn(column);&nbsp;&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;&nbsp;//设置行<br/>&nbsp;for(i=0;i=64)&nbsp;&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;&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;&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;&nbsp;//设置汉字下半部分显示页<br/>&nbsp;column=column_temp;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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/>/*-------------------------------------------------------*/<br/>//显示一个16X16的汉字带上划线<br/>void&nbsp;Show16X16_2(unsigned&nbsp;char&nbsp;line,unsigned&nbsp;char&nbsp;column,const&nbsp;unsigned&nbsp;char&nbsp;*pt)<br/>{<br/>&nbsp;unsigned&nbsp;char&nbsp;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;&nbsp;//选通左屏<br/>&nbsp;SetColumn(column);&nbsp;&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;&nbsp;//设置行<br/>&nbsp;for(i=0;i=64)&nbsp;&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;&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;&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;&nbsp;//设置汉字下半部分显示页<br/>&nbsp;column=column_temp;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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/>/*-------------------------------------------------------*/<br/>//显示一个16X16的汉字带下划线<br/>void&nbsp;Show16X16_3(unsigned&nbsp;char&nbsp;line,unsigned&nbsp;char&nbsp;column,const&nbsp;unsigned&nbsp;char&nbsp;*pt)<br/>{<br/>&nbsp;unsigned&nbsp;char&nbsp;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;&nbsp;//选通左屏<br/>&nbsp;SetColumn(column);&nbsp;&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;&nbsp;//设置行<br/>&nbsp;for(i=0;i=64)&nbsp;&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;&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;&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;&nbsp;//设置汉字下半部分显示页<br/>&nbsp;column=column_temp;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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|0x80);<br/>&nbsp;&nbsp;*pt++;<br/>&nbsp;&nbsp;column++;<br/>&nbsp;}<br/>}<br/>/*-------------------------------------------------------*/<br/>//显示一个8X16的字符<br/>void&nbsp;Show8X16(unsigned&nbsp;char&nbsp;line,unsigned&nbsp;char&nbsp;column,const&nbsp;unsigned&nbsp;char&nbsp;*pt)<br/>{<br/>&nbsp;unsigned&nbsp;char&nbsp;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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置行<br/>&nbsp;for(i=0;i=64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置汉字下半部分显示页<br/>&nbsp;column=column_temp;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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/>/*-------------------------------------------------------*/<br/>//显示一个8X16的字符带上划线<br/>void&nbsp;Show8X16_2(unsigned&nbsp;char&nbsp;line,unsigned&nbsp;char&nbsp;column,const&nbsp;unsigned&nbsp;char&nbsp;*pt)<br/>{<br/>&nbsp;unsigned&nbsp;char&nbsp;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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置行<br/>&nbsp;for(i=0;i=64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置汉字下半部分显示页<br/>&nbsp;column=column_temp;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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/>/*-------------------------------------------------------*/<br/>//显示一个16X32的字符<br/>void&nbsp;Show16X32(unsigned&nbsp;char&nbsp;line,unsigned&nbsp;char&nbsp;column,const&nbsp;unsigned&nbsp;char&nbsp;*pt)<br/>{<br/>&nbsp;unsigned&nbsp;char&nbsp;i,column_temp1,column_temp2,column_temp3;<br/>&nbsp;column_temp1=column;<br/>&nbsp;column_temp2=column;<br/>&nbsp;column_temp3=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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;//设置行<br/>&nbsp;for(i=0;i=64)&nbsp;&nbsp;&nbsp;&nbsp;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;//写数据<br/>&nbsp;&nbsp;*pt++;<br/>&nbsp;&nbsp;column++;<br/>&nbsp;}<br/>&nbsp;SlectScreen(1);<br/>&nbsp;SetLine(line+1);<br/>&nbsp;column=column_temp1;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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/>&nbsp;SlectScreen(1);<br/>&nbsp;SetLine(line+2);<br/>&nbsp;column=column_temp2;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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+2);<br/>&nbsp;&nbsp;}&nbsp;<br/>&nbsp;&nbsp;WriteData(*pt);<br/>&nbsp;&nbsp;*pt++;<br/>&nbsp;&nbsp;column++;<br/>&nbsp;}<br/>&nbsp;SlectScreen(1);<br/>&nbsp;SetLine(line+3);<br/>&nbsp;column=column_temp3;<br/>&nbsp;SetColumn(column);<br/>&nbsp;for(i=0;i=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+3);<br/>&nbsp;&nbsp;}&nbsp;<br/>&nbsp;&nbsp;WriteData(*pt);<br/>&nbsp;&nbsp;*pt++;<br/>&nbsp;&nbsp;column++;<br/>&nbsp;}<br/>}<br/>/*-------------------------------------------------------*/<br/>//LCD初始化子程序<br/>void&nbsp;LCDinit()<br/>{<br/>&nbsp;ADCON1=0x06;<br/>&nbsp;TRISA=0x00;<br/>&nbsp;TRISB=0x00;<br/>&nbsp;PORTB=0x00;<br/>&nbsp;SetOnOff(1);<br/>}<br/>/*----------------------------------------------------------*/<br/>//调用LCD显示子程序<br/>void&nbsp;ChangeToLCD(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)<br/>{<br/>&nbsp;int&nbsp;D_ge,D_shi;<br/>&nbsp;<br/>&nbsp;D_ge=data%10;&nbsp;&nbsp;&nbsp;&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;D_shi=data%100/10;&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;switch(D_ge)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show8X16(line,column+8,s0);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show8X16(line,column+8,s1);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show8X16(line,column+8,s2);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show8X16(line,column+8,s3);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show8X16(line,column+8,s4);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show8X16(line,column+8,s5);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show8X16(line,column+8,s6);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show8X16(line,column+8,s7);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show8X16(line,column+8,s8);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show8X16(line,column+8,s9);break;}<br/>&nbsp;}<br/>&nbsp;switch(D_shi)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show8X16(line,column,s0);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show8X16(line,column,s1);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show8X16(line,column,s2);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show8X16(line,column,s3);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show8X16(line,column,s4);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show8X16(line,column,s5);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show8X16(line,column,s6);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show8X16(line,column,s7);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show8X16(line,column,s8);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show8X16(line,column,s9);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>void&nbsp;ChangeToLCD2(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)//带上划线<br/>{<br/>&nbsp;int&nbsp;D_ge,D_shi;<br/>&nbsp;<br/>&nbsp;D_ge=data%10;&nbsp;&nbsp;&nbsp;&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;D_shi=data%100/10;&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;switch(D_ge)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show8X16_2(line,column+8,s0);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show8X16_2(line,column+8,s1);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show8X16_2(line,column+8,s2);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show8X16_2(line,column+8,s3);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show8X16_2(line,column+8,s4);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show8X16_2(line,column+8,s5);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show8X16_2(line,column+8,s6);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show8X16_2(line,column+8,s7);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show8X16_2(line,column+8,s8);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show8X16_2(line,column+8,s9);break;}<br/>&nbsp;}<br/>&nbsp;switch(D_shi)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show8X16_2(line,column,s0);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show8X16_2(line,column,s1);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show8X16_2(line,column,s2);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show8X16_2(line,column,s3);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show8X16_2(line,column,s4);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show8X16_2(line,column,s5);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show8X16_2(line,column,s6);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show8X16_2(line,column,s7);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show8X16_2(line,column,s8);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show8X16_2(line,column,s9);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>void&nbsp;ChangeToLCD3(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)//带下划线<br/>{<br/>&nbsp;int&nbsp;D_ge,D_shi;<br/>&nbsp;<br/>&nbsp;D_ge=data%10;&nbsp;&nbsp;&nbsp;&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;D_shi=data%100/10;&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;switch(D_ge)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show16X32(line,column+16,ss0);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show16X32(line,column+16,ss1);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show16X32(line,column+16,ss2);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show16X32(line,column+16,ss3);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show16X32(line,column+16,ss4);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show16X32(line,column+16,ss5);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show16X32(line,column+16,ss6);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show16X32(line,column+16,ss7);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show16X32(line,column+16,ss8);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show16X32(line,column+16,ss9);break;}<br/>&nbsp;}<br/>&nbsp;switch(D_shi)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show16X32(line,column,ss0);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show16X32(line,column,ss1);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show16X32(line,column,ss2);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show16X32(line,column,ss3);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show16X32(line,column,ss4);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show16X32(line,column,ss5);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show16X32(line,column,ss6);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show16X32(line,column,ss7);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show16X32(line,column,ss8);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show16X32(line,column,ss9);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>void&nbsp;ChangeToLCD4(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)//星期转换<br/>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;switch(data)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;1:{Show16X16_3(line,column,ri);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show16X16_3(line,column,yi);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show16X16_3(line,column,er);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show16X16_3(line,column,san);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show16X16_3(line,column,si);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show16X16_3(line,column,wu);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show16X16_3(line,column,liu);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>void&nbsp;ChangeToLCD5(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)//生肖转换<br/>{&nbsp;&nbsp;&nbsp;<br/>&nbsp;data=data%12;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;switch(data)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show16X16_3(line,column,llong);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show16X16_3(line,column,she);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show16X16_3(line,column,ma);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show16X16_3(line,column,yang);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show16X16_3(line,column,hou);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show16X16_3(line,column,ji);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show16X16_3(line,column,gou);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show16X16_3(line,column,zhu);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show16X16_3(line,column,shu);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show16X16_3(line,column,niu);break;}<br/>&nbsp;&nbsp;case&nbsp;10:{Show16X16_3(line,column,hu);break;}<br/>&nbsp;&nbsp;case&nbsp;11:{Show16X16_3(line,column,tu);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>void&nbsp;ChangeToLCD6(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)//阴历月转换<br/>{&nbsp;&nbsp;&nbsp;<br/>&nbsp;data=data%12;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;switch(data)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show16X16_2(line,column,zheng);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show16X16_2(line,column,er);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show16X16_2(line,column,san);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show16X16_2(line,column,si);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show16X16_2(line,column,wu);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show16X16_2(line,column,liu);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show16X16_2(line,column,qqi);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show16X16_2(line,column,ba);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show16X16_2(line,column,jiu);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show16X16_2(line,column,shi);break;}<br/>&nbsp;&nbsp;case&nbsp;10:{Show16X16_2(line,column,shiyi);break;}<br/>&nbsp;&nbsp;case&nbsp;11:{Show16X16_2(line,column,la);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>void&nbsp;ChangeToLCD7(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)//阴历日<br/>{&nbsp;&nbsp;&nbsp;<br/>&nbsp;data=data%12;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;switch(data)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show16X16_2(line,column,yi);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show16X16_2(line,column,er);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show16X16_2(line,column,san);break;}<br/>&nbsp;&nbsp;case&nbsp;3:{Show16X16_2(line,column,si);break;}<br/>&nbsp;&nbsp;case&nbsp;4:{Show16X16_2(line,column,wu);break;}<br/>&nbsp;&nbsp;case&nbsp;5:{Show16X16_2(line,column,liu);break;}<br/>&nbsp;&nbsp;case&nbsp;6:{Show16X16_2(line,column,qqi);break;}<br/>&nbsp;&nbsp;case&nbsp;7:{Show16X16_2(line,column,ba);break;}<br/>&nbsp;&nbsp;case&nbsp;8:{Show16X16_2(line,column,jiu);break;}<br/>&nbsp;&nbsp;case&nbsp;9:{Show16X16_2(line,column,shi);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>void&nbsp;ChangeToLCD8(uch&nbsp;line,uch&nbsp;column,uch&nbsp;data)//阴历日十位<br/>{&nbsp;&nbsp;&nbsp;<br/>&nbsp;data=data%3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;switch(data)<br/>&nbsp;{<br/>&nbsp;&nbsp;case&nbsp;0:{Show16X16_2(line,column,chu);break;}<br/>&nbsp;&nbsp;case&nbsp;1:{Show16X16_2(line,column,er);break;}<br/>&nbsp;&nbsp;case&nbsp;2:{Show16X16_2(line,column,san);break;}<br/>&nbsp;}&nbsp;<br/>}<br/>/*-----------------------------------------------------------------*/<br/>程序结束<br/>三,总结<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到现在为止,我对KS0108系列液晶的操作已经基本掌握了,并可以熟练应用.<br/>但是本程序中阳历转阴历的程序还是不对,我想不出更好的转换办法,希望大家能提供方法完善.<br/>由于篇幅原因,没有将阳历转阴历的程序,和液晶字库的程序附载上面,如有需要的可以联系我]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.shinian10.com/default.asp?id=506" /> 
	  <id>http://www.shinian10.com/default.asp?id=506</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[virtual pc装上了win2003跟xp sp2]]></title>
	  <author>
		 <name>zcjohnson</name>
		 <uri>http://www.shinian10.com/</uri>
		 <email>zcdelphi7@126.com</email>
	  </author>
	  <category term="" scheme="http://www.shinian10.com/default.asp?cateID=7" label="软件资源" /> 
	  <updated>2008-02-01T08:49:54+08:00</updated>
	  <published>2008-02-01T08:49:54+08:00</published>
		  <summary type="html"><![CDATA[一、热身运动——了解Virtual&nbsp;PC&nbsp;2004及其他&nbsp;<br/>1、Virtual&nbsp;PC&nbsp;2004寻根&nbsp;<br/>Virtual&nbsp;PC（下面简称VPC）本非微软所生，是属于Connectix公司的产品。Connectix和VMware是虚拟机市场中的主要竞争者，前者的产品VPC是基于Windows和Macintosh的，而后者的产品则是基于Windows和Linux。&nbsp;<br/>微软于2003年2月19日收购了这项技术，对其进行改进，并在2003年12月2日发布了Virtual&nbsp;PC&nbsp;2004（内部版本为5.3，Connectix发布的VPC最后版本为5.2）&nbsp;<br/>&nbsp;<br/>2、Virtual&nbsp;PC&nbsp;2004有何优势？&nbsp;<br/>正如苹果公司看到微软收购了VPC拍手叫好一样，VPC&nbsp;2004及其后续版本的优势是显而易见的：由于出身豪门，系微软产品，其稳定性和与Windows的兼容性都是其他运行于Windows上的虚拟机无法比拟的。这也说明了针对Macintosh的VPC在运行PC程序上性能更优越了，无疑是给了苹果电脑的用户一个福音。&nbsp;<br/>&nbsp;<br/>3、Virtual&nbsp;PC&nbsp;2004&nbsp;SP1介绍&nbsp;<br/>在发布VPC2004后不久，微软随后又发布了针对其的SP1。SP1中主要有如下的更新：&nbsp;<br/>★提供Virtual&nbsp;Disk&nbsp;Precompactor（虚拟磁盘预压缩工具）&nbsp;<br/>该工具在进行虚拟磁盘压缩之前使用，作用是把虚拟磁盘上的任何空白空间都清零。&nbsp;<br/>★改善了Windows&nbsp;XP&nbsp;SP2的虚拟机运行时性能慢的情况。&nbsp;<br/>★更新了Virtual&nbsp;Machine&nbsp;Additions。&nbsp;<br/>★对Windows&nbsp;NT&nbsp;Workstation&nbsp;4.0网络适配器驱动的更新&nbsp;<br/>★修正了MS-DOS&nbsp;6.22中Shared&nbsp;Folders功能在EMM386载入后无法使用的情况。&nbsp;<br/>★对KB&nbsp;833506中描述的Bug的修复。&nbsp;<br/>&nbsp;<br/>我们建议在安装VPC&nbsp;2004后就立即安装SP1。如果还没有安装SP1的朋友，请先关闭所有VPC虚拟机，如果有保存状态的虚拟机也必须关闭，再安装SP1。&nbsp;<br/>（限于篇幅原因，这里仅对SP1中主要更新做简要介绍，详细的请读者自己查阅SP1中的Readme）&nbsp;<br/>&nbsp;<br/>二、初步操刀，创建虚拟机全过程。&nbsp;<br/>step1、创建虚拟机&nbsp;<br/>运行VPC&nbsp;2004后，我们可以看到一个非常简单的操作界面，只有三个菜单和四个按钮——和VMware选项繁多的界面形成鲜明对比，这个就是VPC的控制台。（图1）&nbsp;<br/><img src="http://blogs.help-online.org/heelen/wp-content/uploads/2007/05/052707-0605-virtua1.png" border="0" alt=""/><br/>&nbsp;<br/>选择”File”——”New&nbsp;Virtual&nbsp;Machine&nbsp;Wizard”或点”New”按钮进入创建虚拟机向导。&nbsp;<br/>单击”Next”，可以看到有三个选项：第一个为创建一个新的虚拟机，此时是一步一步进行设置的；第二个为使用默认设置去创建虚拟机，此时直接生成一个vmc虚拟机配置文件，可以稍后选择”Settings”进行配置；第三个为添加一个现存的虚拟机到VPC控制台中。&nbsp;<br/>这里我们选择第一项，单击”Next”，设置好vmc虚拟机文件的存放位置及文件名。接下来选择虚拟机安装的操作系统版本。VPC会根据您上一步给出的vmc文件名来猜测您要建立的虚拟机系统类型，当然你可以自己手动选择。这里罗列了所有微软的操作系统。如果要安装的是Linux或Unix，那么可以选择Other，这并不影响虚拟机的性能。但这里需要大家注意的是，VPC&nbsp;2004的虚拟机无法安装Macintosh操作系统。选择好后，就是设置虚拟机的内存大小，VPC一般会根据你前面选择的操作系统来设置虚拟机的内存大小，选择第一项为使用VPC设置的建议值；如果要自行设置内存大小，可以选择第二项并进行调整。然后是设置虚拟机的硬盘，选择第一项即指定一个已创建好的vhd虚拟磁盘为虚拟机的硬盘，第二项为创建一个新的虚拟磁盘，此时VPC将默认创建一个”动态增长盘”，而没有提供更多的设置。这里我们选择第二项，设置好虚拟磁盘的存放路径和名称后，一台虚拟机就创建出来了，它将被自动添加到VPC控制台中。&nbsp;<br/>&nbsp;<br/>step2、创建虚拟磁盘&nbsp;<br/>如果按照前面创造磁盘，是按照默认值创建的。如果要对磁盘进行高级设置，就要用”虚拟磁盘向导”来创建了。选择”Virtual&nbsp;Disk”，单击”Next”，这时VPC让我们选择是”创建一个新的虚拟磁盘”还是”编辑一个现存的虚拟磁盘”，选择第一项。选择创建虚拟硬盘，并设置好vhd虚拟磁盘文件存放路径和名称后，接下来就是选择虚拟磁盘的类型。VPC的虚拟磁盘一共有四种类型，如图2所示。下面是各种磁盘的功能：&nbsp;<br/><img src="http://blogs.help-online.org/heelen/wp-content/uploads/2007/05/052707-0605-virtua2.png" border="0" alt=""/><br/>&nbsp;<br/>&nbsp;<br/>Dynamically&nbsp;expanding：动态增长盘。此种磁盘创建后开始vhd虚拟磁盘文件很小，随着虚拟机系统的安装，文件的添加，该vhd文件将逐步增大，但没有限制值。这种磁盘微软推荐的类型。&nbsp;<br/>&nbsp;<br/>Fixed&nbsp;size: