當前位置:首頁 » 操作系統 » 源碼和通碼

源碼和通碼

發布時間: 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-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:521
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:868
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91