AJAX学习

这是从落伍转的原文,过几天好好研究后把心得发出来大家分享。

Ajax 由 HTML、JavaScript? 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.比如我们经常用的Gmail就采用了Ajax技术...甚至将来融合Ajax的web应用程序将代替桌面应用程序.这不是不可能,这对我们这些 Web程序员无疑是个好消息(每次看到那些做ERP的几万几十万的赚钱心里就不爽啊,都是程序员差距怎么这么大呢?)...

本专题将收集一些常用Ajax资料教程应用等,希望大家踊跃提供资料.

Ajax 的定义
Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写.这个短语是 Adaptive Path 的 Jesse James Garrett 发明的,按照 Jesse 的解释,这不是每个首字母缩写词.

Ajax 所用到的基本技术:
・HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段.
・JavaScript 代码是运行 Ajax 应用程序的核心代码,帮助改进与服务器应用程序的通信.
・DHTML 或 Dynamic HTML,用于动态更新表单.我们将使用 div、span 和其他动态 HTML 元素来标记 HTML.
・文档对象模型 DOM 用于(通过 JavaScript 代码)处理 HTML 结构和(某些情况下)服务器返回的 XML.

废话少说,先来两个Ajax类库:

>> XAJAX
特点:采用PHP编写,支持UTF-8编码,Smarty模板,体积稍大,功能丰富,使用方便
官方:http://www.xajaxproject.org/
下载:http://sourceforge.net/project/showfiles.php?group_id=139736
中文手册:http://www.im286.com/attachment.php?aid=3399

>> SAJAX
特点:包含PHP,ASP等8种语言的Ajax类库,功能略弱
官方:http://www.modernmethod.com/sajax/
下载:http://www.modernmethod.com/sajax/download.phtml

中文手册内容:(下载)

Xajax中文手册(第一版)

原文:http://xajax.sourceforge.net/
英文原版:Copyright ? 2005 J. Max Wilson
简体中文翻译:HonestQiao(乔楚)/2005-12-7 17:23/(第一版)

什么是xajax?
xajax如何工作?
为什么我要使用xajax代替其他PHP的Ajax库?
如何在我的PHP脚本之中使用xajax?
如何异步更新内容?
如何异步处理表单数据?
如何给xajax增加定制功能?
我能在私有或者收费产品之中使用xajax吗?

什么是xajax?
Xajax是一个开源的 PHP 类库 它能够让你黏合HTML、CSS、JavaScript和PHP,轻而易举的开发功能强大、基于WEB的AJAX应用软件. 使用xajax开发的应用软件,无需重新调入页面,就能够异步调用服务器端的PHP函数和更新内容.

xajax 如何工作?
你的应用软件需要异步调用的PHP函数, xajax的PHP对象都生成了对应的封装好了的JavaScript函数. 当被调用时,封装的函数使用JavaScript的XMLHttpRequest对象与服务器异步通讯,调用xajax对象对应的PHP函数. 调用结束后, PHP函数由xajax返回一个xajax的XML响应传递给应用程序. XML响应包含了特定的指令和数据,他们可以被xajax的JavaScript消息分析器解析,并且被用于更新你的应用程序的内容.

为什么我要使用xajax代替其他PHP的ajax库?
你应该选择一个最是和你的项目需要的库.
xajax 提供了以下的功能, 它们使得ajax富有特色而又功能强大:

Xajax特殊的 XML 响应 / javascript 消息分析系统 帮助你做到, 自动的处理函数返回的数据,按照PHP函数返回的指令更新内容或者状态. 因为xajax作了这些工作Because xajax does the work, 你不需要写javascript的回调处理函数.

Xajax反对将代码和数据紧密地杂糅在一起的主张, 并且保持xajax的代码从与他代码分离. 因为它是对象构造的, 你可以加上自己定制的功能给xajax去扩展xajaxResponse 类和使用addScript方法.
xajax 可以工作在 Firefox, Mozilla, 大部分基于 Mozilla 的浏览器, Internet Explorer, 和 Safari.

除了更新元素的值和内含的HTML内容(innerHTML), xajax 还能用于更新样式(styles), css 类, 多选和单选按钮选择,甚至可以更新任何元素的属性.

xajax 支持使用一维或者多维数组、关联数组(哈希数组) 作为xajax函数的参数从javascript传送给PHP. 反之Additionally, 如果你传送一个javascript的对象给xajax函数,PHP函数将接受一个描叙对象属性的关联数组(哈希数组).

xajax 提供了一种简单的异步表单处理方式. 使用 xajax.getFormValues() javascript 方法, 你可以轻而易举的在表单之中提交一个描绘值的数组作为参数传送到xajax异步处理函数:
xajax_processForm(xajax.getFormValues('formId');
它可以处理复杂的input 元素名称 ,例如 "checkbox[][]" 或者 "name[first]" 产生的多维或者关联数组(哈希数组), 就是普通提交表单那样使用PHP的$_GET数组

使用xajax你可以动态的发送附加的javascript作为请求的响应到你的应用软件中运行,而这就和动态的更新元素的属性一样方便.

Xajax会自动比较PHP函数返回的数据与你已经标记需要修改的元素属性. 只有当新的数据确实可以改变现有的属性,属性才会真的被更新. 这将可消除程序在一定时间间隔内更新与当前内容相同或者不同的内容而出现的明显的闪烁.

每一个通过xajax简单注册的函数都可以有不同的请求方式. 所有的函数默认使用POST方式,除非你明确的指定使用GET方式. 如果使用GET请求,你必须非常明确的考虑它确实是你所需要的

如果没有指定URI,xajax将设法自动确定脚本的URI. Xajax的自动确定算法经过了充分的验证,确保在大部分HTTPS或者未知端口的HTTP服务器上也可以正常的工作.

Xajax使用UTF8编码所有的请求和响应,以确保支持绝大部分的字符和语言. Xajax已经成功测试了多种不同的UNICODE字符,包括Spanish, Russian, Arabic, and Hebrew

几乎所有xajax生成的javascript都可以通过动态的外部javascript包含到你的web程序之中. 当你在浏览器之中查看程序的源代码时,不会有JavaScript的函数定义混杂在HTML标记之中.

Xajax可以使用在Smarty模板系统之中,仅仅需要创建一个smarty变量就可以包含xajax的javascript:
$smarty->assign('xajax_javascript', $xajax->getJavascript());
然后你可以使用在header模版之中使用
{$xajax_javascript}
从而把xajax应用到你的站点.

如何在我的PHP脚本之中使用xajax?
Xajax的设计是如此的富有特色,以至于不管是已有的web程序还是新的项目,它都能够被极其简单的部署和应用. 仅仅需要七步,你就可以在几乎任何PHP脚本之中加入xajax的强大功能:

包含xajax类库:
require_once("xajax.inc.php");
实例化xajax 对象:
$xajax = new xajax();
注册你需要通过xajax调用的PHP函数的名称:
$xajax->registerFunction("myFunction");
编写注册的PHP函数,并且在函数之中使用xajaxResponse 对象返回XML指令:
function myFunction($arg)
{
// 对$arg做一些基本处理例如从数据库检索数据
// 然后把结果赋值给变量,例如$newContent

// 实例化xajaxResponse 对象
$objResponse = new xajaxResponse();

// 添加指令到响应之中,用于指派
//指定元素(例如id="SomeElementId")的innerHTML属性的新的内容
$objResponse->addAssign("SomeElementId","innerHTML", $newContent);

//返回xajaxResponse 对象生成的XML响应
return $objResponse->getXML();
}
在你的脚本输出任何信息之前,调用xajax用于接管请求:
$xajax->processRequests();
在页面的 标签之间, 告诉xajax生成所必需的JavaScript:
< ?php $xajax->printJavascript(); ?>
在程序中,从JavaScript事件或者函数调用前面注册的函数:

在线加密解密


代码转化(转成&#x***这样的十六进制)

WAP专用转码器



2006年世界杯日程表~


日期
时间 场次 对阵 城市 直播 比分

6月10日

星期六

00:00 1 德国 VS 哥斯达黎加 慕尼黑 CCTV-1/CCTV-5 4:2
03:00 2 波兰 VS 厄瓜多尔 盖尔森基兴 CCTV-1/CCTV-5 0:2
21:00 3 英格兰 VS 巴拉圭 法兰克福 CCTV-5 1:0

6月11日

星期日

00:00 4 特立尼达和多巴哥 VS 瑞典 多特蒙德 CCTV-1/CCTV-5
03:00 5 阿根廷 VS 科特迪瓦 汉堡 CCTV-1/CCTV-5
21:00 6 塞黑 VS 荷兰 莱比锡 CCTV-5

6月12日

星期一

00:00 7 墨西哥 VS 伊朗 纽伦堡 CCTV-1/CCTV-5
03:00 8 安哥拉 VS 葡萄牙 科隆 CCTV-1/CCTV-5
21:00 12 澳大利亚 VS 日本 凯泽斯劳滕 CCTV-5

6月13日

星期二

00:00 10 美国 VS 捷克 盖尔森基兴 CCTV-1/CCTV-5
03:00 9 意大利 VS 加纳 汉诺威 CCTV-1/CCTV-5
21:00 14 韩国 VS 多哥 法兰克福 CCTV-5

6月14日

星期三

00:00 13 法国 VS 瑞士 斯图加特 CCTV-1/CCTV-5
03:00 11 巴西 VS 克罗地亚 柏林 CCTV-1/CCTV-5
21:00 15 西班牙 VS 乌克兰 莱比锡 CCTV-5

6月15日

星期四

00:00 16 突尼斯 VS 沙特阿拉伯 慕尼黑 CCTV-1/CCTV-5
03:00 17 德国 VS 波兰 多特蒙德 CCTV-1/CCTV-5
21:00 18 厄瓜多尔 VS 哥斯达黎加 汉堡 CCTV-5

6月16日

星期五

00:00 19 英格兰 VS 特立尼达和多巴哥 纽伦堡 CCTV-1/CCTV-5
03:00 20 瑞典 VS 巴拉圭 柏林 CCTV-1/CCTV-5
21:00 21 阿根廷 VS 塞黑 盖尔森基兴 CCTV-5

6月17日

星期六

00:00 22 荷兰 VS 科特迪瓦 斯图加特 CCTV-1/CCTV-5
03:00 23 墨西哥 VS 安哥拉 汉诺威 CCTV-1/CCTV-5
21:00 24 葡萄牙 VS 伊朗 法兰克福 CCTV-5

6月18日

星期日

00:00 26 捷克 VS 加纳 科隆 CCTV-1/CCTV-5
03:00 25 意大利 VS 美国 凯泽斯劳滕 CCTV-1/CCTV-5
21:00 28 日本 VS 克罗地亚 纽伦堡 CCTV-5

6月19日

星期一

00:00 27 巴西 VS 澳大利亚 慕尼黑 CCTV-1/CCTV-5
03:00 29 法国 VS 韩国 莱比锡 CCTV-1/CCTV-5
21:00 30 多哥 VS 瑞士 多特蒙德 CCTV-5

6月20日

星期二

00:00 32 沙特阿拉伯 VS 乌克兰 汉堡 CCTV-1/CCTV-5
03:00 31 西班牙 VS 突尼斯 斯图加特 CCTV-1/CCTV-5
22:00 33 厄瓜多尔 VS 德国 柏林 CCTV-5
22:00 34 哥斯达黎加 VS 波兰 汉诺威 CCTV-2

6月21日

星期三

03:00 35 瑞典 VS 英格兰 科隆 CCTV-5
03:00 36 巴拉圭 VS 特立尼达和多巴哥 凯泽斯劳滕 CCTV-1
22:00 39 葡萄牙 VS 墨西哥 盖尔森基兴 CCTV-5
22:00 40 伊朗 VS 安哥拉 莱比锡 CCTV-2

6月22日

星期四

03:00 37 荷兰 VS 阿根廷 法兰克福 CCTV-5
03:00 38 科特迪瓦 VS 塞黑 慕尼黑 CCTV-1
22:00 41 捷克 VS 意大利 汉堡 CCTV-5
22:00 42 加纳 VS 美国 纽伦堡 CCTV-2

6月23日

星期五

03:00 43 日本 VS 巴西 多特蒙德 CCTV-5
03:00 44 克罗地亚 VS 澳大利亚 斯图加特 CCTV-1
22:00 47 沙特阿拉伯 VS 西班牙 凯泽斯劳滕 CCTV-2
22:00 48 乌克兰 VS 突尼斯 柏林 CCTV-5

6月24日

星期六

03:00 45 多哥 VS 法国 科隆 CCTV-1
03:00 46 瑞士 VS 韩国 汉诺威 CCTV-5


日期
时间 场次 对阵 城市 直播 比分
6月24日 23:00 49 A1 VS B2 慕尼黑 CCTV-2/CCTV-5
6月25日 03:00 50 C1 VS D2 莱比锡 CCTV-1/CCTV-5
6月25日 23:00 51 B1 VS A2 斯图加特 CCTV-2/CCTV-5
6月26日 03:00 52 D1 VS C2 纽伦堡 CCTV-1/CCTV-5
6月26日 23:00 53 E1 VS F2 凯泽斯劳腾 CCTV-2/CCTV-5
6月27日 03:00 54 G1 VS H2 科隆 CCTV-1/CCTV-5
6月27日 23:00 55 F1 VS E2 多特蒙德 CCTV-2/CCTV-5
6月28日 03:00 56 H1 VS G2 汉诺威 CCTV-1/CCTV-5
6月30日 23:00 57 49胜者 VS 50胜者 柏林 CCTV-2/CCTV-5
7月1日 03:00 58 53胜者 VS 54胜者 汉堡 CCTV-1/CCTV-5
7月1日 23:00 59 51胜者 VS 52胜者 盖尔森基兴 CCTV-1/CCTV-5
7月2日 03:00 60 55胜者 VS 56胜者 法兰克福 CCTV-1/CCTV-5
7月5日 03:00 61 57胜者 VS 58胜者 多特蒙德 CCTV-1/CCTV-5
7月6日 03:00 62 59胜者 VS 60胜者 慕尼黑 CCTV-1/CCTV-5
7月9日 03:00 63 61负者 VS 62负者 斯图加特 CCTV-1/CCTV-5
7月10日 02:00 64 61胜者 VS 62胜者 柏林 CCTV-1/CCTV-5

免费享用正版windows xp!

今天心血来潮,想玩玩IE7 beta2和windows media Player 11,软件下载下来后,却发现出现了通不过正版认证的警告!
晕。
总不能白白下载了不能用吧~!
上网看看,发现了一则比较有用的消息:
把C:\Documents and Settings\All Users\WINDOWS\Application Data\Windows Genuine Advantage\data\data.dat改为只读就行了。内容也要可以随意更改。
尝试了一下,发现这样的方法并不行,能通过IE7的认证,但在windows update时还是不行。
原来是微软更新了验证方法。
解决方法:
用破解的LegitCheckControl.dll替换system32下面的LegitCheckControl.dll文件。
这个文件可以在这里下载:
http://www.logocollect.com/blog/pojie.zip

单片机做的计算器完成了!

这次用的是单片机的实验板做的。
一些设备介绍:
[HR][/HR]
单片机:AT89S52
键盘:4×4键盘,一个中断按键,一个复位按键。
显示:4位LED数码管显示。
声音:普通蜂鸣器。
[HR][/HR]
程序主要思想:
用有限的按键显示16进制的简单计算器,实现16位的16进制数的加减乘除计算。要求可以连续计算,把结果做为下一次计算的初值。
要点:
键盘:线反转法键盘扫描,并用查表法获取对应键值。
显示:用多位循环显示来完成多位LED的显示。
声音主要用来做操作提示用。
[HR][/HR]
程序详解:
加法子程序:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADD16:
;16位加法,在本例里,全部的加法都用16位加法完成,超过16位的进位直接丢弃
MOV A,NUM2
ADD A,NUM4
MOV RES2,A ;低位相加
;;;;;;;;;;;;;;;;;;;;;;;
MOV A,NUM1
ADDC A,NUM3
MOV RES1,A ;高位相加
RET

减法子程序:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUB16:
;16位减法

MOV A,NUM2 ;被减数低位
CLR C ;清借位位
SUBB A,NUM4 ;低位相减
MOV RES2,A ;结果高位
;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,NUM1
SUBB A,NUM3
MOV RES1,A ;结果低位

RET

乘法子程序:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MUL16:
;16位乘法。注:这里要用大数乘以小数!也就是如果有16位的数出现时,用8×16位,不能用16×8位

MOV A,NUM2 ;16位数的低8位
MOV B,NUM4 ;乘数
MUL AB
MOV R1,A ;积的低8位
MOV R2,B ;积的高8位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,NUM1 ;16位数的高8位
MOV B,NUM4 ;乘数
MUL AB
MOV R3,A ;LOW
MOV R4,B ;HIGHT
;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,R2
ADD A,R3 ;
MOV RES1,A ;结果高位
MOV RES2,R1 ;结果低位

RET

除法子程序:
(十六位除以八位的)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIV16:
;八位八位的来(NUM1 NUM2)除(NUM4)
;先高八位除
MOV A,NUM1
MOV B,NUM4
DIV AB
MOV R1,A ;1
;;;;;;;;;;;;;;;;;;
MOV A,#0F0H
ANL A,NUM2 ;取高四位
ORL A,B ;余数与低八位的高四位合并
SWAP A
MOV R6,A
;;;;;;;;;;;;;;;;;;
MOV A,R6
MOV B,NUM4
DIV AB
MOV R2,A ;2
;;;;;;;;;;;;;;;;;;;
MOV A,#0FH
ANL A,NUM2 ;取低四位
SWAP A
ORL A,B ;余数与低八位的低四位再合并!
SWAP A
MOV R7,A
;;;;;;;;;;;;;;;;;;;
MOV A,R7
MOV B,NUM4
DIV AB
MOV R3,A ;3
;;;;;;;;;;;;;;;;;;;;;;
MOV A,R2
SWAP A
ORL A,R3
;;;;;;;;;;;;;;;;;;;;;;;;
MOV RES1,R1 ;商的高八位
MOV RES2,A ;商的低八位
RET

(十六位除以十位的)

DIV16:
MOV A,R5
JNZ BEGIN
MOV A,R4
JZ OVER

BEGIN: MOV A,R7
JNZ BEGIN1
MOV A,R6
JNZ BEGIN1
RET
BEGIN1: CLR A
MOV R2,A
MOV R3,A
MOV R1,#10H
DIV1: CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
DIV2: MOV A,R2
SUBB A,R4
MOV R0,A
MOV A,R3
SUBB A,R5
JC NEXT
INC R6
MOV R3,A
MOV A,R0
MOV R2,A
NEXT: DJNZ R1,DIV1
AJMP NOOVER
ADD1: MOV A,R6
ADD A,#01H
MOV R6,A
MOV A,R7
ADDC A,#00H
MOV R7,A
NOOVER: MOV OVER,#00H
RET
OVER: MOV OVER,#0FFH
RET

显示:

DISPLAY: MOV R0,IS_OP
CJNE R0,#0H,BACK
MOV A,LED1 ;函数功能: 显示一位
ACALL GETLED_CODE
MOV P0 ,A
CLR P2.7
ACALL DLMS
SETB P2.7
;
MOV A,LED2
ACALL GETLED_CODE
MOV P0 ,A
CLR P2.6
ACALL DLMS
SETB P2.6
;
MOV A,LED3
ACALL GETLED_CODE
MOV P0,A
CLR P2.5
ACALL DLMS
SETB P2.5
;
MOV A,LED4
ACALL GETLED_CODE
MOV P0 ,A
CLR P2.4
ACALL DLMS
SETB P2.4
RET

键盘检测:

KEY_DT: ACALL DISPLAY
ACALL SC_L ;开始列扫描
CJNE A,#0FH,KEY_01 ;如果有按键跳到KEY_01
AJMP KEY_DT
KEY_01: MOV R6,#0AH
KEY_02: ACALL DISPLAY
DJNZ R6,KEY_02
ACALL SC_L
CJNE A,#0FH,KEY_03
AJMP KEY_DT
KEY_03: MOV B,A
ACALL SC_H
ADD A,B
MOV KEY1,A
ACALL K_CODE
ACALL K_DSPL
MOV TEMP_KEY,A
MOV R6,#0AH
KEY_04: ACALL DISPLAY
DJNZ R6,KEY_04
MOV A,TEMP_KEY
BACK: RET
SC_L: MOV A,#0FH
MOV P1,A
MOV A,P1
ANL A,#0FH
RET
SC_H: MOV A,#0F0H
MOV P1,A
MOV A,P1
ANL A,#0F0H
RET
K_CODE: MOV A,#00H
MOV DPTR,#KCODE
K_CD0: MOV B,A
MOVC A,@A+DPTR
CJNE A,KEY1,K_CD1
AJMP K_CD2
K_CD1: MOV A,B
INC ACC
CJNE A,#10H,K_CD0
K_CD2: MOV A,B
RET
K_DSPL: CJNE A,#10H,K_DSP1
AJMP K_BACK
K_DSP1: MOV LED1,LED2
MOV LED2,LED3
MOV LED3,LED4
MOV LED4,A

K_BACK: RET
KCODE: DB 0E7H ,0D7H ,0B7H ,077H
DB 0EBH ,0DBH ,0BBH ,07BH
DB 0EDH ,0DDH ,0BDH ,07DH
DB 0EEH ,0DEH ,0BEH ,07EH

GETLED_CODE: MOV DPTR ,#LED_CODE
MOVC A ,@A+DPTR
RET

LED_CODE: DB 0D7H, 14H ,0CDH ; 0 1 2
DB 5DH, 1EH , 5BH ; 3 4 5
DB 0DBH , 15H,0DFH ; 6 7 8
DB 5FH , 9FH,0DAH ; 9 A B
DB 0C3H,0DCH, 0CBH ; C D E
DB 8BH,98H,8FH ; F N P
DB 0D6H,00H ; V NONE

GETCODE: MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
RET

完整的程序:

;定义一些程序保留的内存地址
NUM1 EQU 30H ;高
NUM2 EQU 31H ;低
NUM3 EQU 32H ;高
NUM4 EQU 33H ;低
;;;;;;;;;;;;;;;
RES1 EQU 34H
RES2 EQU 35H
;;;;;;;;;;;;;;;
DISP1 EQU 36H
DISP2 EQU 37H
;;;;;;;;;;;;;;;
KEY1 EQU 38H
KEY2 EQU 39H
KEY3 EQU 40H
KEY4 EQU 41H
;;;;;;;;;;;;;;;;;;;
LED1 EQU 42H
LED2 EQU 43H
LED3 EQU 44H
LED4 EQU 45H
;;;;;;;;;;;;;;;;;;;;;;
TEMP_KEY EQU 46H
OP EQU 47H
IS_OP EQU 48H

;AJMP F
ACALL CLEAR
AJMP CALC
;需要的子程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADD16:
;16位加法,在本例里,全部的加法都用16位加法完成,超过16位的进位直接丢弃
MOV A,NUM2
ADD A,NUM4
MOV RES2,A ;低位相加
;;;;;;;;;;;;;;;;;;;;;;;
MOV A,NUM1
ADDC A,NUM3
MOV RES1,A ;高位相加
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUB16:
;16位减法

MOV A,NUM2 ;被减数低位
CLR C ;清借位位
SUBB A,NUM4 ;低位相减
MOV RES2,A ;结果高位
;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,NUM1
SUBB A,NUM3
MOV RES1,A ;结果低位

RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MUL16:
;16位乘法。注:这里要用大数乘以小数!也就是如果有16位的数出现时,用8×16位,不能用16×8位

MOV A,NUM2 ;16位数的低8位
MOV B,NUM4 ;乘数
MUL AB
MOV R1,A ;积的低8位
MOV R2,B ;积的高8位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,NUM1 ;16位数的高8位
MOV B,NUM4 ;乘数
MUL AB
MOV R3,A ;LOW
MOV R4,B ;HIGHT
;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,R2
ADD A,R3 ;
MOV RES1,A ;结果高位
MOV RES2,R1 ;结果低位

RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; DIV16:
; 八位八位的来(NUM1 NUM2)除(NUM4)
; 先高八位除
; MOV A,NUM1
; MOV B,NUM4
; DIV AB
; MOV R1,A ;1
;;;;;;;;;;;;;;;;;;;
; MOV A,#0F0H
; ANL A,NUM2 ;取高四位
; ORL A,B ;余数与低八位的高四位合并
; SWAP A
; MOV R6,A
;;;;;;;;;;;;;;;;;;;
; MOV A,R6
; MOV B,NUM4
; DIV AB
; MOV R2,A ;2
;;;;;;;;;;;;;;;;;;;;
; MOV A,#0FH
; ANL A,NUM2 ;取低四位
; SWAP A
; ORL A,B ;余数与低八位的低四位再合并!
; SWAP A
; MOV R7,A
;;;;;;;;;;;;;;;;;;;;
; MOV A,R7
; MOV B,NUM4
; DIV AB
; MOV R3,A ;3
;;;;;;;;;;;;;;;;;;;;;;;
; MOV A,R2
; SWAP A
; ORL A,R3
;;;;;;;;;;;;;;;;;;;;;;;;;
; MOV RES1,R1 ;商的高八位
; MOV RES2,A ;商的低八位
; RET
DIV16:
MOV A,R5
JNZ BEGIN
MOV A,R4
JZ OVER

BEGIN: MOV A,R7
JNZ BEGIN1
MOV A,R6
JNZ BEGIN1
RET
BEGIN1: CLR A
MOV R2,A
MOV R3,A
MOV R1,#10H
DIV1: CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
DIV2: MOV A,R2
SUBB A,R4
MOV R0,A
MOV A,R3
SUBB A,R5
JC NEXT
INC R6
MOV R3,A
MOV A,R0
MOV R2,A
NEXT: DJNZ R1,DIV1
AJMP NOOVER
ADD1: MOV A,R6
ADD A,#01H
MOV R6,A
MOV A,R7
ADDC A,#00H
MOV R7,A
NOOVER: MOV OVER,#00H
RET
OVER: MOV OVER,#0FFH
RET

DISPSUB: ACALL KEY_DT
DJNZ R3,DISPSUB ; 限制输入4个,多余的不接受

AJMP WAIT_OP
DISPLAY: MOV R0,IS_OP
CJNE R0,#0H,BACK
MOV A,LED1 ;函数功能: 显示一位
ACALL GETLED_CODE
MOV P0 ,A
CLR P2.7
ACALL DLMS
SETB P2.7
;
MOV A,LED2
ACALL GETLED_CODE
MOV P0 ,A
CLR P2.6
ACALL DLMS
SETB P2.6
;
MOV A,LED3
ACALL GETLED_CODE
MOV P0,A
CLR P2.5
ACALL DLMS
SETB P2.5
;
MOV A,LED4
ACALL GETLED_CODE
MOV P0 ,A
CLR P2.4
ACALL DLMS
SETB P2.4
RET

KEY_DT: ACALL DISPLAY
ACALL SC_L ;开始列扫描
CJNE A,#0FH,KEY_01 ;如果有按键跳到KEY_01
AJMP KEY_DT
KEY_01: MOV R6,#0AH
KEY_02: ACALL DISPLAY
DJNZ R6,KEY_02
ACALL SC_L
CJNE A,#0FH,KEY_03
AJMP KEY_DT
KEY_03: MOV B,A
ACALL SC_H
ADD A,B
MOV KEY1,A
ACALL K_CODE
ACALL K_DSPL
MOV TEMP_KEY,A
MOV R6,#0AH
KEY_04: ACALL DISPLAY
DJNZ R6,KEY_04
MOV A,TEMP_KEY
BACK: RET
SC_L: MOV A,#0FH
MOV P1,A
MOV A,P1
ANL A,#0FH
RET
SC_H: MOV A,#0F0H
MOV P1,A
MOV A,P1
ANL A,#0F0H
RET
K_CODE: MOV A,#00H
MOV DPTR,#KCODE
K_CD0: MOV B,A
MOVC A,@A+DPTR
CJNE A,KEY1,K_CD1
AJMP K_CD2
K_CD1: MOV A,B
INC ACC
CJNE A,#10H,K_CD0
K_CD2: MOV A,B
RET
K_DSPL: CJNE A,#10H,K_DSP1
AJMP K_BACK
K_DSP1: MOV LED1,LED2
MOV LED2,LED3
MOV LED3,LED4
MOV LED4,A

K_BACK: RET
KCODE: DB 0E7H ,0D7H ,0B7H ,077H
DB 0EBH ,0DBH ,0BBH ,07BH
DB 0EDH ,0DDH ,0BDH ,07DH
DB 0EEH ,0DEH ,0BEH ,07EH

GETLED_CODE: MOV DPTR ,#LED_CODE
MOVC A ,@A+DPTR
RET

LED_CODE: DB 0D7H, 14H ,0CDH ; 0 1 2
DB 5DH, 1EH , 5BH ; 3 4 5
DB 0DBH , 15H,0DFH ; 6 7 8
DB 5FH , 9FH,0DAH ; 9 A B
DB 0C3H,0DCH, 0CBH ; C D E
DB 8BH,98H,8FH ; F N P
DB 0D6H,00H ; V NONE

GETCODE: MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
RET

CLEAR:
MOV LED1,#13H
MOV LED2,#13H
MOV LED3,#13H
MOV LED4,#13H
ACALL DISPLAY
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;延时
DLMS: MOV R5,#4
DL01: MOV R7,#250
DL02: DJNZ R7,DL02
DJNZ R5,DL01
RET
;;;延时255ms
DL255MS: MOV R6,#0FFH
ACALL DLMS
DJNZ R6,DL255MS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READ_NUM_KEY:
;读取一次数字输入,必须输入四个
;ACALL CLEAR
ACALL KEY_DT
MOV R1,A
ACALL KEY_DT
MOV R2,A
ACALL KEY_DT
MOV R3,A
ACALL KEY_DT
MOV R4,A
RET
;;;;;;;;;;;;;;;
WAIT_OP:
ACALL KEY_DT
MOV OP,A
OP0:
CJNE A,#0,OP1 ;+
ACALL BELL
RET
OP1:
CJNE A,#1,OP2 ;-
ACALL BELL
RET
OP2:
CJNE A,#2,OP3 ;*
ACALL BELL
RET
OP3:
CJNE A,#3,NONE ;/
ACALL BELL
RET
NONE:
AJMP WAIT_OP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;响铃
BELL:
CLR P3.7
MOV R3,#02FH
BELL_DL:ACALL DLMS
DJNZ R3,BELL_DL
SETB P3.7
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;转换成数值
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;开始计算
DO_CALC:
MOV A,OP
CALC0:
CJNE A,#0h,CALC1 ;+
ACALL ADD16
RET
CALC1:
CJNE A,#1h,CALC2 ;-
ACALL SUB16
RET
CALC2:
CJNE A,#2h,CALC3 ;*
ACALL MUL16
RET
CALC3:
;/

MOV R7,NUM1
MOV R6,NUM2
MOV R5,NUM3
MOV R4,NUM4
ACALL DIV16

MOV RES1,R7
MOV RES2,R6
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示结果
ECHO_RES:
;MOV RES1,#67H
;MOV RES2,#89H
MOV A,RES1
SWAP A ;高低位交换
ANL A,#0FH ;取低位,就是刚才的高4位
MOV LED1,A
MOV A,RES1
ANL A,#0FH
MOV LED2,A
;
MOV A,RES2
SWAP A
ANL A,#0FH
MOV LED3,A
MOV A,RES2
ANL A,#0FH
MOV LED4,A
ACALL DISPLAY
;AJMP ECHO_RES
RET
CALC:
; testing.!
ACALL READ_NUM_KEY
MOV A,R1
SWAP A
ORL A,R2
MOV NUM1,A ;第一个数
MOV A,R3
SWAP A
ORL A,R4
MOV NUM2,A ;第二个数
;;;;;;;;;;;;;;;;;;;;;;;;

;
CONTINUE:
ACALL WAIT_OP
ACALL CLEAR
ACALL BELL
ACALL READ_NUM_KEY
MOV R4,A
MOV A,R1
SWAP A
ORL A,R2
MOV NUM3,A ;第三个数
MOV A,R3
SWAP A
ORL A,R4
MOV NUM4,A ;第四个数

ACALL DO_CALC ;!!!开始计算

ACALL KEY_DT
ACALL BELL
ACALL ECHO_RES
ACALL KEY_DT
ACALL CLEAR
MOV NUM1,RES1
MOV NUM2,RES2
AJMP CONTINUE
RET

[URL=http://blog.eaxi.com/upload/最终程序.rar]最终程序.rar[/URL]

幸福的生活

[F]Big smile[/F][F]Big smile[/F][F]Big smile[/F]

刚才看了一下CD的博客,看到了诱人的饭菜,不禁感叹!好幸福的一家人哦。

有老婆在身边的日子,真幸福。
我什么时候才可以天天过这样的生活哦?