当前位置:首页 » 操作系统 » 源码和通码

源码和通码

发布时间: 2023-03-23 00:44:47

㈠ 代码和源码的区别

. 组件的特点?

l 优点:
n 调用方便,节省代码
n 安全性高
n 支持事务处理,多组件联合
n 运行速度快
n 升级、修改组件不需修改页面,因此扩展性好
l 缺点:
n 开发及调试困难

2. 如何使用VB开发?

⑴.打开VB>>New Project>>ActiveX DLL

⑵.修改项目名称为course

⑶.修改类模块的名字为conn_db

⑷.Project>> References,引用COM+ Service Type Library和Microsoft Active Server Pages Object Library。

⑸.修改类代码如下:

from www.knowsky.com

'建立数据库连接并输出数据库字段
Dim Response As Response
Dim Request As Request
Dim Server As Server
Dim Application As Application
Dim Session As Session

Private Sub Class_Initialize()
Dim objContext As ObjectContext
Set objContext = GetObjectContext()
Set Response = objContext("Response")
Set Request = objContext("Request")
Set Server = objContext("Server")
Set Application = objContext("Application")
Set Session = objContext("Session")
End Sub

Sub conn_db()
Set conn = CreateObject("adodb.connection")
conn.open "course_dsn", "course_user", "course_password"
Set rs = CreateObject("adodb.recordset")
rs.open "select * from user_info", conn, 1, 1

If rs.recordcount > 0 Then
For i = 1 To rs.recordcount
Response.write "<br>" & rs("user_name") & "<br>"
If rs.EOF Then Exit For
rs.movenext
Next
End If
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
End Sub

⑹.添加一新类cutstr

⑺.修改类代码如下:

'截取字符串
Function cutstr(str, length)
If Len(str) > length Then
cutstr = Left(str, length) & "..."
Else
cutstr = str
End If
End Function

⑻.File>>Save

⑼.File>>make course.dll

3. 注册组件:MTS和regsvr32.exe

有两种方式注册组件:MTS和使用regsvr32.exe。MTS是值得推荐的,因为它具有下列优点:
n 动态卸载平衡,提高组件和基于组件的应用程序的升级性。
n 包含公布和提交事件和队列组件的能力,使得更容易与多个组件联合。

要想使组件具有MTS的特性,必须对组件做少许改动。在NT和98下开发时,必须在项目中引用Microsoft Transaction Server Type Library,在Windows 2000下开发,必须引用COM+ Service Type Library。

⑴.regsvr32注册:

regsvr32.exe是system32下面的一个可执行文件,它将组件信息读入注册表,以便Asp调用。
使用命令行进入组件dll文件所在的目录,执行“regsvr32 dll_file_name”即可。

运行regedit,在HKEY_CLASSES_ROOT下就会找到course.conn_db项和course.cutstr项,表明组件注册成功。

⑵.使用MTS注册:

①.开始>>程序>>管理工具>>组件服务

②.展开目录至如下状态:

③.按照向导,下一步,直到如下对话框,点击“创建一个空的应用程序”:

④.在接下来的对话框中,为应用程序起名为“course”,其他默认,直至完成

⑤.展开course应用程序,右键,新建一个组件

⑥.按照提示,继续,出现如下对话框时,选择“导入已被注册的组件”

⑦.选择我们开发的组件,下一步,直至完成

⑧.这时候,可以发现course应用程序下已经多了两个组件:

4. 在Asp中调用组件

asp_use_com.asp
<%
'asp调用com组件
set cutstr_obj=server.createobject("course.cutstr")
response.write cutstr_obj.cutstr("abcdefghijk",3)&"<br>"
set cutstr_obj=nothing

set conn_obj=server.createobject("course.conn_db")
conn_obj.conn_db()
set conn_obj=nothing
%>

效果:
abc...

ahyi

tuth

说明调用成功。

5. 卸载组件

⑴.使用regsvr32注册的组件,使用-u开关卸载:

注意:先进入组件dll所在的目录,然后使用“regsvr32 –u dll_file_name”卸载;卸载后重启IIS即可。

⑵.使用MTS注册的组件,先在“组件服务”中删除对应的应用程序,然后再执行步骤 ⑴ 以彻底卸载组件。

6. Dll组件存放位置和权限设定

⑴.我们只需要把编译生成的Dll文件拷贝出来即可,其他的文件不用做处理
⑵.要把Dll放到Web站点之外,如system32目录里,防止被下载
⑶.Dll的文件权设置为System读取,Internet用户遍历文件夹/运行文件
⑷.Dll在IIS中去掉所有的权限,如读取,脚本自愿访问
经过上述处理,可以确保Dll文件的安全。

7. 其他

如何在组件中使用Asp的对象以方便的将Asp代码移植为COM组件?

五、IIS最优化配置

1.Web站点选项卡:IP、端口、虚拟主机、连接、日志
2.ISAPI筛选器:加入PHP和JSP支持
3.主目录配置选项卡:I IS权限设定(结合文件权)、执行许可、应用程序保护、映射、缓冲、父路径、出错信息
4.其他选项卡:自定义错误、Http头、目录安全性、文档
5.文件压缩带来的好处和坏处

六、其他

1. 发送邮件(JMail;Ms smtp)

使用Microsoft Smtp发送电子邮件
⑴.安装Microsoft SMTP Service
⑵.设置Microsoft SMTP Service
⑶.代码部分:
mail_smtp.asp
<%
sub sendmail(fromwho,towho,subject,body)
dim mymail
set mymail = server.createobject("cdonts.newmail")
mymail.from = fromwho
mymail.to = towho
mymail.subject = subject
mymail.body = body
mymail.send
set mymail = nothing
end sub
%>

该子程序接受4个与下列各条对应的参数。
l 邮件发送者的email地址
l 邮件接收者的email地址
l 邮件主题
l 邮件内容

使用方法:
<%
fromWho=…
toWho=…
Subject=…
Body=…

IF toWho <> "" THEN
sendMail fromWho, toWho, Subject, Body
END IF
%>

使用Jmail发送Email
略,有兴趣可以和我探讨,Jmail这个软件我也有。

2. 解压Zip文件(Wscript.Shell和Winzip command line;java组件)

⑴.安装Winzip 8.1以上
⑵.安装Winzip command line
⑶.将工作目录的文件权设置为Internet用户可以读取、写入和修改
⑷.代码部分:
unzip_a_zipfile.asp
<%
'用shell对象启动程序
'zip_path是具体zip文件的路径,如c:\test.zip
'path是存放解压后文件的路径
'ond是命令行参数
set wshshell = server.createobject("wscript.shell")
issuccess = wshshell.run ("wzunzip -ond "&zip_path&" "&path,1,true)

'删除zip文件
set myfileobject=server.createobject("scripting.filesystemobject")
myfileobject.deletefile zip_path

'判断是否成功以继续操作
if issuccess = 0 then
'成功
...
else
'失败
...
end if
%>

3. 操作XML文件

本次交流时间有限,有时间再做详细探讨

4.文件上传

⑴.安装文件上传组件Asp fileup(支持多文件上传,文件类型及大小判断,文件上传后改名等)
⑵.重起IIS以使上传组件生效
⑶.设置上传目录的文件权为Internet用户可以读取、写入和修改
⑷.代码部分
upload_file.htm
<style type="text/css">
<!--
.input {background-color: #FFFFFF; border-bottom: black 1px solid;border-left: black 1px solid; border-right: black 1px solid;border-top: black 1px solid; color: #000000;font-family: Georgia; font-size: 9pt;color: midnightblue;}
a:link {color: #1B629C; text-decoration: none}
a:hover {color: #FF6600; text-decoration: underline}
a:visited {text-decoration: none}
-->
</style>

<center>
<form enctype="multipart/form-data" method="post" action="upload_file.asp" name="Upload">
<input type="hidden" name="CopyrightInfo" value="http://www.chinaasp.com">
请选择文件:<input type="file" name="file1" class="input"><br><br>
请选择文件:<input type="file" name="file2" class="input"><br><br>
</form>
<br><br>
<a href="javascript :document.Upload.submit();"> 提 交 </a>
</center>

upload_file.asp
<%
on error resume next

'定义获得文件后缀的函数
function getfileextname(filename)
pos=instrrev(filename,".")
if pos>0 then
getfileextname=mid(filename,pos+1)
else
getfileextname=""
end if
end function

'定义获取文件正名的函数
function getfilename(filename)
lens=len(filename)-len(getfileextname(filename))-1
getfilename=left(filename,lens)
end function

'创建文件上传组件的对象
set fileup=server.createobject("chinaasp.upload")

'循环读取用户上传的文件,并保存在服务器上
for each f in fileup.files

'当用户没有选择文件或文件大小超过10m时返回到选择上传文件的页面
if f.filename="" or f.filesize>10485500 then response.redirect "upload_file.htm"

'获取保存的路径
path=server.mappath("upload_file.asp")
path=left(path,len(path)-15)

'保存文件
f.saveas path&getfilename(f.filename)&"."&getfileextname(f.filename)

next

response.redirect "upload_file.htm"
%>

5.驱动器/目录/文件操作

本次交流时间有限,有时间再做详细探讨

6. Asp编写与调试经验:cookies和session如何选择、cookies数量陷阱、页面过期和缓冲设定、移植性如何保证、如何应付内部服务器500错误……

1.Cookies和Session的选择:
⑴.共同特点
⑵.不同之处:
①.工作方式
②.过期条件
③.对服务器的性能影响

2.Cookies数量陷阱:
IIS可以保存一般的cookies不超过20个,再定义新的Cookies以前的Cookies的值就丢失了,这样对大型应用显然局限性非常大,如何解决这个问题呢?
答案是使用二维Cookies。

例子:

测试一维Cookies数量极限:
test_cookies_1.asp
<%
for i=1 to 50
response.cookies("cookies_"&i)=i
next
%>

test_cookies_2.asp
<%
for i=1 to 50
response.write request.cookies("cookies_"&i)&"<br>"
next
%>

效果:
先访问test_cookies_1.asp,再访问test_cookies_2.asp,,发现了什么?

test_cookies_3.asp
<%
for i=1 to 50
response.cookies("cookies_"&i)=i
next

for i=1 to 50
response.write request.cookies("cookies_"&i)&"<br>"
next
%>

效果:
没有Cookies丢失!!!!

测试二维Cookies数量极限:
test_cookies_4.asp
<%
for i=1 to 301
response.cookies("tuht")("cookies_"&i)=i
next
%>

test_cookies_5.asp
<%
for i=1 to 301
response.write request.cookies("tuht")("cookies_"&i)&"<br>"
next
%>

效果:
使用这种方式可以使用201*20=4020个Cookies!!!!

3.页面过期和缓冲设定
<%
'过期和缓冲处理
response.buffer=true
response.cachecontrol="no-chache"
response.expiresabsolute=now()-1
response.expires=0
%>
html中还可以做设定:
<meta content="no-cache" http-equiv="Pragma">
<meta HTTP-EQUIV="Expires" CONTENT="0">

4.移植性的保证
⑴.包含文件
<!--#include file="top.asp" -->
⑵.使用server.mappath寻找文件路径,避免在页面中直接使用绝对路径
⑶.尽量使用组件封装业务逻辑

5.调试内部服务器500的错误
⑴.设置IIS显示具体的错误信息
⑵.分步调试,由上而下
⑶.打印某些重要的变量的值,检查是否为我们预期
⑷.根据经验来判断错误

7. 操作Word文档

⑴.安装Office 2000,其中Word 2000必选
⑵.设置IE中Internet的安全性:ActiveX控件和插件全部启用
⑶.设置工作目录的文件权为Internet及System读取/修改/写入
⑷.编写模版course.dot
⑸.具体代码:
opr_doc_inc.asp
<%
Response.write "Dim Var_Num" & chr(13)
Response.write " Var_Num = 2 " & chr(13)
Response.write "Dim varstrings(2)" & chr(13)
Response.write "varstrings(0)=" & chr(34) & "起草人:" & chr(34) & chr(13)
Response.write "varstrings(1)=" & chr(34) & "日期:" & chr(34) & chr(13)
Response.write "Dim varValues(2)" & chr(13)
Response.write "varValues(0)=" & chr(34) &"起草人:涂海涛"& chr(34) & chr(13)
Response.write "varValues(1)=" & chr(34) & "日期:"&date()& chr(34) & chr(13)
%>

Sub instead(word)
Set myRange = word.ActiveDocument.Content
for i=0 to Var_Num - 1
call myRange.Find.Execute(varStrings(i),false,false,false,false,false,false,false,false,varValues(i),2)
Next
End Sub

opr_doc.asp
<%
'获取保存的路径
path=server.mappath("opr_doc.asp")
path=left(path,len(path)-11)
filenames=path&"test.doc"

w1="word.activedocument.saveAs"&chr(32)&chr(34)&filenames&chr(34)
w2="wApp.Documents.open"&chr(32)&chr(34)&filenames&chr(34)
%>
<script language="vbscript">
On Error Resume Next
'生成指定文件名的Word文档
Dim word
set word = CreateObject("Word.Application")
if Err.number > 0 Then
Alert "发生错误,请确认文件是否存在"
else
word.visible = False
word.documents.open "<%response.write path%>course.dot"
<%Response.write w1%>
word.documents.close
set word=nothing
end if

<!--#include file="opr_doc_inc.asp"-->

Dim wApp
Set wApp = CreateObject("Word.Application")
If Err.number > 0 Then
Alert "发生错误,请确认文件是否正确创建"
else
wApp.visible = True
<%Response.write w2%>
call instead(wApp)
set wApp=nothing
end if
</script>

效果:看看生成了doc文件吗?这个新建的doc文件和模版文件有什么区别?起草人和日期发生了变化了吗?保存一下,看看新生成的doc文件的内容。

附:
1.以上全部代码在Windows 2000 Server SP2+IIS 5.0+MS SQL Server 2000+Office 2000下测试通过
2.配置数据库:数据库名course,用户course_user,密码course_password,ODBC驱动为course_dsn,端口为2433,描述表结构的脚本在共享目录下。
3.Asp fileup、Jmail、Winzip 8.1、Winzip command line这几个软件请自行下载。
4.数据库脚本文件:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[output_1]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[output_1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[return_1]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[return_1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_1]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[user_info_1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_2]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[user_info_2]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_3]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[user_info_3]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[user_info]
GO

CREATE TABLE [dbo].[user_info] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[user_name] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[user_info] WITH NOCHECK ADD
CONSTRAINT [PK_user_info] PRIMARY KEY CLUSTERED
(
[user_name]
) ON [PRIMARY]
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [output_1]
@sid int output
AS
set @sid=2
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [return_1]
(@user_name varchar(40),@password varchar(20))
AS
if exists(select id from user_info where user_name=@user_name and password=@password)
return 1
else
return 0
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [user_info_1]
(@user_name varchar(40),@password varchar(20))
AS
select id from user_info where user_name=@user_name and password=@password
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [user_info_2]
(@user_name varchar(40),@password varchar(20))
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
delete from user_info where user_name=@user_name and password=@password
COMMIT TRANSACTION
SET XACT_ABORT OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [user_info_3] AS
select * from user_info
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

㈡ 源代码是什么东东

1、源码是使用html编写的,通过IE把它翻译为网页,它是所有网页的核心,但是html 并不是计算机语言,只是网页的另一种描述.源代码是一种语言,组织排版网页上的元素(图片,视频,音乐,文字等)的一种标准语言。
2、如果您要制作网页,您可以选用如Frontpage或Dreamwaver等工具,这些工具都是所见即所得性质的,就是说您在工具界而上制作的,就能直接在浏览中原样显示出来。但,这些工具同时还提供了源代码视图,也就是说,如果一些功能没有办法直接通过工具来实现,那你要编辑源代码了。
3、当然,您也可以直接用记事本来编辑网页,直接输入代码,然后另存为.htm或.asp或其他为后缀名的文件。您保存下来的这些文件就是网页了,而您在记事本里编辑的那些,就是源代码。

㈢ 什么是源码

源码是一种语言,属于自由言论,受法律保护。

在计算机科学中,源码(通常只是源或代码)的任何声明或在一些人类可读的计算机编程语言的书面声明的集合。源码是程序员最经常用于指定的行动的机制,由计算机完成。
源码通常是在一个或多个文本文件中,或存储在数据库中,有时一个程序作为存储程序,也可能出现在书籍或其他媒体印刷代码段。大量的源码文件可以组织成一个目录树,在这种情况下,它也被称为树的来源。
计算机程序的源码需要从人类可读的格式转换为某些类型的计算机的可执行文件的二进制形式。源码可能会被编译器转换成一个可执行文件。
对于特定的软件作品的源码可以包含在单个文件或多个文件。虽然这种做法并不常见,一个程序的源码可以写在不同的编程语言。一些软件的组成部分可能分别用任意编程语言编写和编译,如Java语言:每个类是单独编译成一个文件,在运行时解释的联系。
源码主要是用来作为输入的过程,产生一个可执行程序(即编译或解释)。它也可以用来作为人与人之间沟通的方法和算法(例如,代码段)。
程序员通常通过现有的源码,了解编程技术。源码在共享开发者之间常常是作为一种促进因素,使他们的编程技能更加成熟。有些人认为源码是一种艺术语言的表达。
如果没有源码,将软件移植到其他的计算机平台通常是极端困难的。
可执行程序的反编译可用于生成源码,无论是在汇编代码或在高级语言。
在美国,截至2003年,法院尚未决定是否将源码视为言论自由的宪法保护的形式。源码可能作为自由发言的论点,这是因为源码传达的信息对程序员是一种语言,可以用来分享,像其他艺术如幽默那样,它是一种沟通的受保护的形式。相反的观点认为,源码主要实现函数功能,函数功能表现得比艺术功能更多,因而在美国宪法第一修正案中没有受到权利的保护。
首批法院关于源码的性质案件,涉及言论自由,加州数学教授丹伯恩斯坦,曾在他创建的源码大学的因特网上公布了一个加密程序。当时,加密算法被列为国家安全,美国政府军火出口到其他国家的加密被认为是国家安全问题,必须由国务院批准。电子前沿基金会代表美国政府控告伯恩斯坦,法院裁定其源码是自由发言,受第一修正案的保护。

㈣ 源码是什么意思啊

源码指编写的最原始程序的代码。

用户平时使用软件时就是程序把“源码”翻译成我们可直观的形式表现出来供用户使用的。任何一个网站页面,换成源码就是一堆按一定格式书写的文字和符号。

源码主要功用

1、生成目标代码,即计算机可以识别的代码。

2、对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的程序员都忽视软件说明的编写,因为这部分虽然不会在生成的程序中直接显示,也不参与编译。

但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。

(4)源码和通码扩展阅读:

计算机里面运行的所有东西都是用程序编出来的,而编写程序要用到计算机语言,用计算机语言直接编出来的程序就叫源码,比如用VisualBasic编写的源码文件一般为.bas文件,而用C++编写的一般为.cpp文件,源代码不能直接运行,必须编译后才能运行。源码经过编译处理后就可以直接在操作系统下运行了。

从字面意义上来讲,源文件是指一个文件,指源代码的集合.源代码则是一组具有特定意义的可以实现特定功能的字符(程序开发代码)。“源代码”在大多数时候等于“源文件”。

㈤ 原码是什么

问题一:什么是原码 原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其纯塌余位表示数值的大小。
原码的优点:简单直观;例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011
缺点:原码不能直接参加运算,可能会出错。例如数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为130。显然出错了。
所以原码的符号位不能直接参与运算,必须和其他为分开,这就增加了硬件的开销和复杂性
具体定义还分小数和整数:
①小数原码的定义
[X] =
X 0≤X <1
1- X -1 < X ≤ 0
例如: X=+0.1011 , [X]原= 01011
X=-0.1011 [X]原= 11011
②整数原码的定义
[X]原 =
X 0≤X <2n
2n-X - 2n < X ≤ 0

问题二:请问原码和源码有什么区别? 20分 没有区别。顶多是习惯性的:源代码,更倾向于代码、复杂高深的代码。
源码算是源代码的简称,包括源代码、及相关可直接运行的文件,即源文件。
一般情况下,源码=源文件。

问题三:什么是原码,补码,反码 1)原码表示 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。 例如,X1= +1010110 X2= 一1001010 其原码记作: [X1]原=[+1010110]原=01010110 [X2]原=[-1001010]原=11001010 在原码表示法中,对0有两种表示形式: [+0]原=00000000 [-0] 原=10000000 2)补码表示 机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,隐悔则X的补码表示记作[X]补。 例如,[X1]=+1010110 [X2]= 一1001010 [X1]原=01010110 [X1]补=01010110 即 [X1]原=[X1]补=01010110 [X2] 原= 11001010 [X2] 补=10110101+1=10110110 机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数做携圆是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。 例如,[X1]=+1010110 [X2]= 一1001010 [X1]原=01010110 [X1]补=01010110 即 [X1]原=[X1]补=01010110 [X2] 原= 11001010 [X2] 补=10110101+1=10110110 (3)反码表示法 机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。 例如:X1= +1010110 X2= 一1001010 [X1]原=01010110 [X1]反=[X1]原=01010110 [X2]原=11001010 [X2]反=10110101 反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。 例1. 已知[X]原=10011010,求[X]补。 分析如下: 由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到。现给定的机器数为负数,故有[X]补=[X]原十1,即 [X]原=10011010 [X]反=11100101+1 [X]补=11100110 例2. 已知[X]补=11100110,求[X]原。 分析如下: 对于机器数为正数,则[X]原=[X]补 对于机器数为负数,则有[X]原=[[X]补]补 现给定的为负数,故有: [X]补=11100110 [[X]补]反=10011001+1 [[X]补]补=10011010=[X]原+1 [[X]补]补=10011010=[X]原 总结一下,原码(为负时,正时都不变)全部取反即得到反码,反码加 1就得到补码了,就是这么简单。

问题四:一个二进制数11010100的原码,补码是什么? 计算机里表示正负不是用+、-号表示的
11010100如果是原码就没有所谓的+或-
因为原码的最高位表示的是符号位,1为负数,0为正数
负数的补码是除符号外其余各位按位取反后加1,为10101100
如果11010100是二进制码
它本身是个正数,它的原码要看用几位二进制表示,如果是八位就超出范围了因为最高位要作为符号位后七位才能用来表示数值,用十六的二进制表示则最高位用0表示,数值前多出的用0补则11010100的十六位二进制原码为0000000011010100,正数的补码就是原码
而-11010100的十六位二进制原码最高位符号位后面的作为数值位补0,则1000000011010100,负数的补码则是符号位不变其余各位按位取反最后末尾加1,则有-11010100的十六位二进制补码为1111111100101100

问题五:1,0001011的原码是什么 如果是8位的话,第一位表示符号位,
负数为1,正数为0,
-1原码就是 10000001
第一个1对应于负号,
最后一个1对应于“2的零次方”=1
就是这样算的,换成二进制表示再加个符号位而已

问题六:-1.1的原码是什么 如果-1.1是真值的话,那他的原码为:11.1

问题七:原码这里,是什么意思 源代码(也称源程序),是指一系列人类可读的计算机语言指令。 在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。 代码组合 源代码作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。例如,一个程序如果有C语言库的支持,那么就可以用C语言;而另一部分为了达到比较高的运行效率,则可以用汇编语言编写。 较为复杂的软件,一般需要数十种甚至上百种的源代码的参与。为了降低种复杂度,必须引入一种可以描述各个源代码之间联系,并且如何正确编译的系统。在这样的背景下,修订控制系统(RCS)诞生了,并成为研发者对代码修订的必备工具之一。 还有另外一种组合:源代码的编写和编译分别在不同的平台上实现,专业术语叫做软件移植。 质量 对于计算机而言,并不存在真正意义上的“好”的源代码;然而作为一个人,好的书写习惯将决定源代码的好坏。源代码是否具有可读性,成为好坏的重要标准。软件文档则是表明可读性的关键。 源代码主要功用有如下贰种作用: 依、生成目标代码,即计算机可以识别的代码。 贰、对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的程序员都忽视软件说明的编写,因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。 (需要指出的是,源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。 ) 如果按照源代码类型区分软件,通常被分为两类:自由软件和非自由软件。自由软件一般是不仅可以免费得到,而且公开源代码;相对应地,非自由软件则是不公开源代码。所有一切通过非正常手段获得非自由软件源代码的行为都将被视为非法

问题八:-11011011的原码,补码,反码分别是什么 -91原码:11011011反码:10100100补码:10100101-80原码:11010000反码:10101111补码:10110000-73原码:11001001反码:10110110补码:10110111-53原码:1110101反码:1001010补码:1001011真值为正时。其原码,反码,补码完全相同。真值为负时,其原码就是把负号改为1,其余不变。反码就是负号改为1,其余取反。补码就是在反码的基础上加1,加1时记得是逢2进1。

问题九:原码,反码和补码表示的规则分别是什么 一. 机器数和真值
在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.
1、机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。
2、真值

为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3
而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = C000 0001 = C1
二. 原码, 反码, 补码的基础概念和计算方法.
在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]

[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

问题十:6的原码 反码 补码分别是什么? 源码、反码、补码都是00000110

㈥ 什么是源代码,源代码通过怎样的方式可以成为软件

源代码(也称源程序)是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。
在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。编译完成后源代码就成为软件了。
源代码主要有如下两种作用:
1.生成目标代码,即计算机可以识别的代码。
2.对软件进行说明,即对软件的编写进行说明。
提示:源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。

㈦ 请问代码和源代码有什么区别

一、指代不同

1、代码:是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。

2、源代码:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。

二、特点不同

1、代码:原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。

2、源代码:最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。


三、存储方式不同

1、代码:可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。

2、源代码:作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。


㈧ 单片机如何通过ps2向pc传输数据

第一,首先要知道PS/2接口跟PC是怎样连的。PC里的ps/2一般接键盘或鼠标。
PS/2的针脚
:
6*
u
*5
4*
*3
2*
*1
1
n/c
不连
2
DATA
KeyData-
3
VCC
Power,+5VDC
电源5伏
4
GND
GND
地线
5
n/c
不连
6
CLK
Clock-
时钟线
接线黄、红、白、绿对应的针脚如下
键盘
鼠标


3


4


6
绿
绿
2
接下来,你要知道数据是怎样经过ps/2接口传输到pc的?
数据是变成了2进制数后经过ps/2接口传递到PC的,常用串行方式传递数据。
所以单片机要用串行方式和ps/2通讯。即单片机的TXD做移位脉冲,接PS/2的6脚;RXD是数据线,接PS/2的2脚.
还不明白给hychyc_2008发消息。
ps2是11位。
PS/2帧的第一位是起始位,为0,然后是8位数据位,发送键盘扫描码的一个字节(扫描码为1-4个字节),然后是奇偶校验位,最后是停止位,为1。这些是在数据线(即1号引脚线)上发送的。无键按下时,数据线和始终线都保持为1。当有键按下时,时钟线CLOCK送出脉冲,同时数据线送出数据。主机(此处是89c51
MCU)在始终脉冲的下降沿对数据线采样获得数据。键盘扫描码包括通码和断码,当键按下时发送通码,抬起时发送断码。更详细的内容可参考所附的《PS/2
技术参考》。
根据上述原理腔友,我这样设计了实验:将键盘的脉冲线接至89c51的外部中断输入口(INT0或INT1),当键按下和抬慎岁起时有脉冲产生,此脉冲引发MCU
中断。将键盘的DATA线连至89c51的输入口(如P1.0)。在中断处理程序中,从输入口读入数据,然后通过循环移位对读进的数据位进行处理,1(起始位)、10(奇偶校验)、11(停止位)可抛弃,如不嫌麻烦也可将奇偶校验位加以应用。当一个数据帧收完后,将处理后剩下的2-9位(即扫描码)通过串口发至PC机,通过PC机的串口监视软件(如“串口调试助手”)来查看。硬件连线和源码如下:
源码:
ORG
0000H
AJMP
MAIN;转入主程序
ORG
0003H
;外部中断P3.2脚INT0入口地址
AJMP
INT
;转入外部中断服务子程序
;以下为主程序进行CPU中断方式设置
MAIN:MOV
SCON,#50H;设置成串口1方式
MOV
TMOD,#20H;波特率发生器T1工作在模式2上
MOV
PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV
TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV
TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETB
EA
;打开CPU总中断请求
SETB
IT0
;设定INT0的触发方式为脉冲负边沿触发
SETB
EX0
;打开INT0中断请求
SJMP
$
INT:
CLR
EA
;暂时关闭CPU的所有中断请求
CJNE
R0,#0,L1
L3:
INC
R0
SJMP
L5
L1:
CJNE
R0,#9,L2
SJMP
L3
L2:
CJNE
R0,#10,L4
SETB
TR1;启动定时器T1
MOV
SBUF,A
MOV
R0,#0
L5:
SETB
EA
;允许中断
RETI
;退出子程序
L4:
MOV
C,P1.0
RRC
A
SJMP
L3
END
搞定后,当按下和释放键时,会在PC机上显示其扫描伍孝槐码。
忘了说明一点,通电时键盘会自检,此时键盘上三个灯全亮,自检完成后熄灭,并向主机发送十六进制字符AA.。
以上取自某网页。

㈨ 电脑PS2键盘的通码与断码

原理使触点导通或断开。在实际应用中机械开头的结构形式很多,最常用的是交叉接触式。它的优点是结实耐用, 缺点是不防水。敲击比较费力,打字速度快时容易漏字。不过现在比较好的机械键盘都增加了Click功能, click功能实际上就是从机械结构上进行了改进,加大了缓存,防止快速打字时漏掉字符。它的使用寿命5000万到一亿次左右,普通用户10年大约键盘敲击20万次左右。所以一款好的机械键盘够用一辈子了。

塑料薄膜式键盘
塑料薄膜式键盘内有四层,塑料薄膜一层有凸起的导电橡胶,当中一层为隔离层,上下两层有触点。通过按键使橡胶凸起按下,使其上下两层触点接触,输出编码。这种键盘无机械磨损,可靠性较高,目培旦瞎前在市场占相当大的比重,不过很多JS也将这种成本相对较低的键盘当成电容式键盘。它最大的特点就是低价格, 低噪音,低成本。

导电橡胶式键盘
导电橡胶式键盘触点的接触是通过导电的橡胶接通。其结构是有一层带有凸起的导电橡胶,凸起部分导电,而这部分对准每个按键,互相连接的平面部分不导电,当键帽按下去时,由于凸起部分导电,把下面的触点按通,不按时,凸起部分会弹起。目前使用的也较多。

电容式键盘
电容式键盘它是一种类似电容式开关的原理,通过按键改变电极间的距离而产生电容量的变化,暂时形成震荡脉冲允许通过的条件。我们知道,电容的容量是由介质,两极的距离及两极的面积来决定的。所以当键帽按下时,两极的距离发生变化,这就引起电容容量发生改变,当参数设计合适时,按键时就有输出,而不按键就无输出,这个输出再经过整形放大,去驱动编码器。由于电容器无接触,所以这种键在工作过程中不存在磨损、接触不良等问题,耐久性、灵敏度和稳定性都比较好。为了避免电极间进入灰尘,电容式按键开关采用了密封组装。1000万到3000万次寿命。但目前市场上真正的电容式键盘并不多,大部分是前面两种键盘,一款真正的电容键盘价格是比较高的。

无线键盘
当然最先进的就是无线键盘,顾名思义这种键盘与电脑间没有直接的物理连线,通过红外线或无线配空电波将输入信息传送给特制的接收器。接收器的连接与普通键盘基本相同,也只需简单地连接到PS/2或COM口、USB口等上,购买时必须注意区别,一般无线的键盘在标识后有"RF"后缀(radio frequency),表示支持无线电波传输。现在大部分产品频点都在900 MHz,455 MHz, 330MHz。左右。

无线键盘需要使用干电池供电,对于红外线型的无线键盘具有较严格的方向性,尤其是水平位置的关系更为敏感,由于接收器接收角度有限(中心直线范围内6公尺)在键盘距离接收器太近时,会出现失灵的情况,同时灵敏度低时不能快速敲键,否则肯定会漏字符。而采用无线电的键盘要灵活得多,考虑到无线电是辐射状传播的,为了避免在近距离内有同类型(同频率)的键盘工作,导致互相干扰,一般都备有4个以上的频道,如遇干扰可以手动转频。无线键盘为了配合移动的需要,一般体积较小巧并集成有鼠标的功能,注意接收器和主机连接有两个接口,一个是PS2、一个是COM口,把这两个接口一一对应都接在主机上就可以了,但如果你不想使用键盘上的鼠标,那就只需把接收器的PS2口接在主机上就可以了,COM不接!接收器不需要外接电源,而键盘里内置的3号碱性电池可以正常使用3个月。

键盘的发展趋势
就键盘的发展来看,键盘的键位是逐渐的增多(但不是无限制的增加毕竟键盘的面积是有限的),而且是向着多功能多媒体的方向发展。从早期推出的电脑采用83键键盘,随后又推出了84键的设计标准,该标准将键盘分为三个区,即功能区、打字键区、负责光标控制和编辑的副键盘区。其中功能键区的光标键与数字键作为双功能符号键使用,使用一个"Numlock"键来控制这两种功能的切换。虽然两种规格的键盘现在已经不多见了,但是键盘主要区域的划分仍然沿用当时的标准,至今没有什么变化。直到1986年IBM公司推出了101键键盘,才在功能上实现了进一步的扩充,除了添加了F11、F12两个功能键之外,还在键盘的中部多加了一组专用的光标控制和编辑的键,在微软推出WIN95操作系统之后,出现Windows启动键,时至今日大量带各种附加功能键的键盘出现在我们的面前。例如迟野Fn键、快捷键、带鼠标和手写板的键盘等等。

常用的键盘的接口有AT接口、PS/2接口和USB接口,现在绝大部分主板都是提供PS/2键盘接口,也称为"小口"。而兼容机尤其是较老的主板常常提供AT接口也被称为"大口",所幸的是市场上有一种大小口键盘转换连接器,售价只有区区几元钱,它一举解决了两种接口键盘的兼容性问题。一些公司还推出了USB接口的键盘。根据最新公布的 PC2001规范,以后所有通过ISA 总线工作的接口都会随着ISA总线的消亡而被USB取代。USB 允许同时将其他一些设备接入,相当于集成了一个HUB,比如可以将鼠标接入,这实际上节约了主板的COM或PS/2口。有的键盘甚至本身就集成了PS/2 转USB的电路,这样就更方便了。目前阻碍其普及的原因还是价格太高。集成USB HUB的键盘,这类键盘大多采用USB接口,由于外设使用USB的机会增加,为了使用更多的USB设备,需要添加一种USB HUB的装置扩展USB接口数量,但是专业的USB HUB价格比较昂贵,所以人们尝试将USB HUB集成到键盘或显示器中并得到成功。集成USB HUB的键盘往往自身占用一个USB接口,用以保持键盘信号与主机的传输,同时提供2到4个USB接口供其他设备连结,简单地说是一进多出,价格上要比专业的USB HUB便宜得多。
在单片机系统中,经常使用的键盘都是专用键盘。这类键盘都是单独设计制作的,成本高,连线多,且可靠性不高。这些问题在那些要求键盘按键较多的应用系统中显得更加突出。与此相比,在PC系统中广泛使用的PS/2键盘具有价格低、通用可靠,且使用的连线少(仅使用2根信号线)的特点,并可满足多数系统的要求。因此,在单片机系统中应用PS/2键盘是一种很好的选择。
本文在分析PS/2协议和PS/2键盘工作原理与特点的基础上,给出在AT89C51单片机上实现对PS/2键盘支持的硬件连接方法以及驱动程序的设计实现。
1PS/2协议
现在PC机广泛采用的PS/2接口为miniDIN 6引脚的连接器。其引脚如图1所示。
1—数据线(DATA);2—未用;3—电源地(GND);
4—电源(+5 V);5—时钟(CLK);6—未用。
图1PS/2连接器PS/2设备有主从之分,主设备采用female插座,从设备采用male插座。现在广泛使用的PS/2键盘鼠标均工作在从设备方式下。PS/2接口的时钟与数据线都是集电极开路结构的,必须外接上拉电阻。一般上拉电阻设置在主设备中。主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。
(1) 从设备到主设备的通信
当从设备向主设备发送数据时,首先会检查时钟线,以确认时钟线是否是高电平。如果是高电平,从设备就可以开始传输数据;否则,从设备要等待获得总线的控制权,才能开始传输数据。传输的每一帧由11位组成,发送时序及每一位的含义如图2所示。
图2从设备到主设备的通信每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1。从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读入数据线状态。
(2) 主设备到从设备的通信
主设备与从设备进行通信时,主设备首先会把时钟线和数据线设置为“请求发送”状态。具体方式为:首先下拉时钟线至少100 μs来抑制通信,然后下拉数据线“请求发送”,最后释放时钟线。在此过程中,从设备在不超过10 μs的间隔内就要检查这个状态。当设备检测到这个状态时,将开始产生时钟信号。
此时数据传输的每一帧由12位构成,其时序和每一位含义如图3所示。
图3主设备到从设备的通信与从设备到主设备通信相比,其每帧数据多了一个ACK位。这是从设备应答接收到的字节的应答位,由从设备通过拉低数据线产生,应答位ACK总是为0。主设备到从设备通信过程中,主设备总是在时钟为低电平时改变数据线的状态,从设备在时钟的上升沿读入数据线状态。
2PS/2键盘的编码与命令集
(1) PS/2键盘的编码
现在PC机使用的PS/2键盘都默认采用第二套扫描码集。该扫描码集可参考文献\[1\]。扫描码有两种不同的类型:通码(make code)和断码(break code)。当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机。
根据键盘按键扫描码的不同,在此可将按键分为如下几类:
第一类按键,通码为1字节,断码为0xF0+通码形式。如A键,其通码为0x1C,断码为0xF0 0x1C。
第二类按键,通码为2字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式。如right ctrl键,其通码为0xE0 0x14,断码为0xE0 0xF0 0x14。
第三类特殊按键有两个,print screen键通码为0xE0 0x12 0xE0 0x7C,断码为0xE0 0xF0 0x7C 0xE0 0xF0 0x12; pause键通码为0x E1 0x14 0x77 0xE1 0xF0 0x14 0xF0 0x77,断码为空。
组合按键的扫描码发送按照按键发生的次序,如以下面顺序按左SHIFT+A键:1按下左SHIFT键,2按下A键,3释放A键,4释放左SHIFT键,那么计算机上接收到的一串数据为0x12 0x1C 0xF0 0x1C 0xF0 0x12。
在驱动程序设计中,就是根据这样的分类来对不同的按键进行不同处理的。
(2) PS/2键盘的命令集
主机可以通过向PS/2键盘发送命令来对键盘进行设置或者获得键盘的状态等操作。每发送一个字节,主机都会从键盘获得一个应答0xFA(“重发 resend”和“回应echo”命令例外)。下面简要介绍驱动程序在键盘初始化过程中所用的指令(详细键盘命令集见参考文献\[1\]):
0xED主机在本命令后跟随发送一个参数字节,用于指示键盘上num lock, caps lock, scroll lock led的状态;
0xF3主机在这条命令后跟随发送一个字节参数来定义键盘机打的速率和延时;
0xF4用于在当主机发送0xF5禁止键盘后,重新使能键盘。
3PS/2键盘与单片机的连接电路
PS/2键盘与AT89C51单片机的连接方式如图4所示。P1.0接PS/2数据线,P3.2(INT0)接PS/2时钟线。因为单片机的P1、P3口内部是带上拉电阻的,所以PS/2的时钟线和数据线可以直接与单片机的P1、P3相连接。
4驱动程序设计
驱动程序使用Keil C51语言,Keil uVision2编程环境。PS/2 104键盘驱动程序的主要任务,是实现单片机与键盘间PS/2通信,以及将接收到的按键扫描码转换为该按键的键值KeyVal,提供给系统上层软件使用。
(1) 单片机与键盘间PS/2通信的程序设计
在PS/2通信过程中,主设备(单片机)是在时钟信号为低时发送和接收数据信号的。因为单片机到键盘发送的是指令,需要键盘回应,所以这部分程序采用查询方式;而单片机接收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不需要在程序中加入延时程序。单片机的键盘发送接口程序见本刊网站。
(2) 键盘扫描码转换程序设计
由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其ASCII值,控制键如F1、CTRL等为自定义值),只能通过查表的方式。由于按键的三种类型及部分按键对应着两个键值(如A键的键值根据CAPS和SHIFT键状态有0x41(A)和0x61(a)两种),因此综合考虑查表转换速度和资源消耗,设计中使用4个键盘表:键盘扫描码转换基本集和切换集kb_plain_map\[NR_KEYS\]与 kb_shift_map\[NR_KEYS\];包含E0前缀的键盘扫描码转换基本集和切换集kbe0_plain_map\[NR_KEYS\]与 kbe0_shift_map\[NR_KEYS\]。PS/2 104键盘按键扫描码最大值为0x83,所以设置NR_KEYS为132。所有四个键盘表的定义均为如下形式:KB_MAP\[MAKE CODE\]=KEYVAL,如果扫描码对应的按键为空,如KB_MAP\[0x00\],则定义相应键值为NULL_KEY(0x00)。以下是键盘扫描码基本集的部分代码实例:kb_plain_map\[NR_KEYS\]={……
NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39;NULL_KEY;// 扫描码0x40~0x47
file://对应按键空,逗号,K,I,O,0,9,空
file://对应键值 0x00,’,’,’k’,’i’,’o’,’0’,’9’,0x00
……};图4硬件连接电路如此设计键盘转换表的另一个好处在于,以后如需扩展支持有ACPI、Windows多媒体按键键盘时,只需要将键表中相应处修改即可。如ACPI power按键通码为0xE0 0x37,修改kbe0_plain_map\[0x37\]=KB_ACPI_PWR即可。
特殊按键PAUSE使用单独程序处理,如果接收到0xE1就转入这段程序;而print screen键则将其看作是两个通码分别为0xE0 0x12和0xE0 0x7C的“虚键”的组合键来处理。
在驱动程序中声明如下全局变量:led_status其bit0-scroll lock led关0、开1;bit1-num lock led关为0,开为1;bit2-caps lock led关为0,开为1;bit3~bit7总是0;agcs_status记录左右shift ctrl gui alt状态,bit0-左shift键,bit1-左ctrl键,bit2-左gui键,bit3-左alt键,bit4-右shift键,bit5-右 ctrl键,bit6-右gui键,bit7-右alt键,相应键按下则对应位为1,释放为0。E0_FLAG接到0xE0置1;E1_FLAG接收到 0xE1置1;F0_FLAG接收到0xF0置1。按键键值通过KeyVal提供给上层使用。
PS/2键盘扫描码键值转换程序ps2_codetrans()流程如图5所示。
图5扫描码键值转换程序流程第一类按键的扫描码键值转换程序代码:if (F0_FLAG) {//接收扫描码为断码
switch (mcu_revchar){//处理控制键
case 0x11: agcs_status&=0xF7;break;//左alt释放
case 0x12: agcs_status&=0xFE;break;//左shift释放
case 0x14: agcs_status&=0xFD;break;//左ctrl释放
case 0x58: if(led_status&0x04)
led_status&=0x03;//caps lock键
else led_status =0x04;
ps2_ledchange();
break;
case 0x59: agcs_status&=0xEF;break;//右shift释放
case 0x77: if(led_status&0x02)
led_status&=0x05;//num lock键
else led_status =0x02;
ps2_ledchange();
break;
case 0x7E: if(led_status&0x01)
led_status&=0x06;//scroll lock键
else led_status =0x01;
ps2_ledchange();
break;
default:break;
}
F0_FLAG = 0;
}
else {//接收扫描码为通码
if (led_status & 0x04) caps_flag = 1; else caps_flag = 0;
if (led_status & 0x02) num_flag = 1; else num_flag = 0;
if (scga_status & 0x11) shift_flag = 1; else shift_flag = 0;
file://扫描码键值转换
if ((caps_flag == shift_flag) (!num_flag)) KeyVal=kb_plain_map\[mcu_revchar\];
else KeyVal=kb_shift_map\[mcu_revchar\];
switch(mcu_revchar){//处理控制键或状态键
case 0x11: agcs_status = 0x08;//左alt按下
case 0x12: agcs_status = 0x01;//左shift按下
case 0x14: agcs_status = 0x02;//左ctrl按下
case 0x59: agcs_status = 0x10;//右shift按下
default: break;
}
}第二类按键的扫描码键值转换程序与上相似。要注意的是在退出该程序段时对E0_FLAG和F0_FLAG标志的清0。
PAUSE键的处理程序:如果接收到0xE1,置E1_FLAG=1,然后顺次将后续接收到的7个字节数据和PAUSE的通码后7个字节比较,一致则返回KeyVal=KB_PAUSE。在比较完所有7个字节后清除E1_FLAG标志。
键盘初始化程序kb_init()流程:
① 上电后,接收键盘上电自检通过信号0xAA,或者自检出错信号0xFC。单片机接收为0xAA,进入下一步,否则,进行出错处理。
② 关LED指示,单片机发送0xED,然后接收键盘回应0xFA,接着发送送0x00接收0xFA。
③ 设置机打延时和速率。 单片机发送0xF3,接收0xFA,发送0x00(250ms,2.0cps),接收0xFA。
④ 检查LED,发送0xED,接收0xFA,发送0x07(开所有LED),接收0xFA。发送0xED,接收0xFA,发送0x00(关LED),接收0xFA。
⑤ 允许键盘发送0xF4,接收0xFA。
键盘LED改变ps2_ledchange()函数流程:发送0xED→接收0xFA→发送led_status→接收0xFA。
结语
该驱动程序经Keil uVision2编译,在AT89C51单片机上运行通过,实现了对PS/2 104键盘的支持,以及对字符按键大小写切换,num lock切换,控制键及组合按键的支持。该程序对其他嵌入式或单片机系统中PS/2键盘的应用也有借鉴意义。
参考文献
1Adam Chapweske. The ATPS/2 Keyboard Interface.
2Adam Chapweske. PS/2 Mouse/Keyboard Protocol.
3Network Technologies Incorporated. PS/2 Keyboard & Mouse Protocols.
4 Linux 2.4.10内核程序 defkeymap.c dn_keyb.c kbd.c keybdev.c keyboard.c kbd_kern.h kd.h keyboard.h
PS/2帧的第一位是起始位,为0,然后是8位数据位,发送键盘扫描码的一个字节(扫描码为1-4个字节),然后是奇偶校验位,最后是停止位,为1。这些是在数据线(即1号引脚线)上发送的。无键按下时,数据线和始终线都保持为1。当有键按下时,时钟线CLOCK送出脉冲,同时数据线送出数据。主机(此处是89c51 MCU)在始终脉冲的下降沿对数据线采样获得数据。键盘扫描码包括通码和断码,当键按下时发送通码,抬起时发送断码。更详细的内容可参考所附的《PS/2 技术参考》。
根据上述原理,我们可以将键盘的脉冲线接至89c51的外部中断输入口(INT0或INT1),当键按下和抬起时有脉冲产生,此脉冲引发MCU 中断。将键盘的DATA线连至89c51的输入口(如P1.0)。在中断处理程序中,从输入口读入数据,然后通过循环移位对读进的数据位进行处理,1(起始位)、10(奇偶校验)、11(停止位)可抛弃,如不嫌麻烦也可将奇偶校验位加以应用。当一个数据帧收完后,将处理后剩下的2-9位(即扫描码)通过串口发至PC机,通过PC机的串口监视软件(如“串口调试助手”)来查看。硬件连线和源码如下:

源码:

ORG 0000H
AJMP MAIN;转入主程序
ORG 0003H ;外部中断P3.2脚INT0入口地址
AJMP INT ;转入外部中断服务子程序
;以下为主程序进行CPU中断方式设置
MAIN:MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)

SETB EA ;打开CPU总中断请求
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
SETB EX0 ;打开INT0中断请求
SJMP $

INT: CLR EA ;暂时关闭CPU的所有中断请求
CJNE R0,#0,L1
L3: INC R0
SJMP L5
L1: CJNE R0,#9,L2
SJMP L3
L2: CJNE R0,#10,L4
SETB TR1;启动定时器T1
MOV SBUF,A
MOV R0,#0
L5: SETB EA ;允许中断
RETI ;退出子程序
L4: MOV C,P1.0
RRC A
SJMP L3

END
搞定后,当按下和释放键时,会在PC机上显示其扫描码。
通电时键盘会自检,此时键盘上三个灯全亮,自检完成后熄灭,并向主机发送十六进制字符AA.。

㈩ 怎样理解程序的三种状态:源码、目标码、执行码

#include "stdio.h"main(){printf("教师节快乐! ");}。

代码(code)是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。

代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。

源代码是代码的分支,某种意义上来说,源代码相当于代码。现代程序语言中,源代码可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。轿李弯计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令,这种过程叫编译,它由通过编译器完成。

源代码是相对目标代码和可执行代码而言的。 源代闭闷码就是用汇编语言和高级语言写出来的地代码。目标代码是指源代码经过编译程序产生的能被cpu直接识别二进制代码。可扰岩执行代码就是将目标代码连接后形成的可执行文件,当然也是二进制的。

热点内容
我的世界怎么扩容服务器内存 发布:2024-05-05 17:19:54 浏览:46
java读取文件字符 发布:2024-05-05 17:15:18 浏览:10
三星怎么应用加密 发布:2024-05-05 17:13:18 浏览:151
cad字体在那个文件夹 发布:2024-05-05 17:08:20 浏览:329
什么时候用编译器 发布:2024-05-05 17:08:20 浏览:764
应急救援脚本 发布:2024-05-05 17:08:17 浏览:336
我的世界搭建无正版验证服务器 发布:2024-05-05 17:03:48 浏览:817
我的世界服务器地址宝可梦 发布:2024-05-05 17:00:16 浏览:254
dede企业源码 发布:2024-05-05 16:57:53 浏览:786
如何查看java版本 发布:2024-05-05 16:45:05 浏览:494