0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用單片機(jī)驅(qū)動(dòng)標(biāo)準(zhǔn)PC機(jī)鍵盤?C51程序詳細(xì)說明

Wildesbeast ? 來源:福星電子網(wǎng) ? 作者:福星電子網(wǎng) ? 2020-01-18 11:07 ? 次閱讀

功能:實(shí)現(xiàn)pc機(jī)鍵盤(p/s2接口)與8位單片機(jī)連接使用

原理:鍵盤時(shí)鐘接在p3.2口,既8051的外部中斷int0上,鍵盤數(shù)據(jù)接到p1.0上

每次按鍵,鍵盤會(huì)向單片機(jī)發(fā)脈沖使單片機(jī)發(fā)生外部中斷,數(shù)據(jù)有p1.0口一位一位傳進(jìn)來

傳回的數(shù)據(jù)格式為:1位開始位(0),8位數(shù)據(jù)位(所按按鍵的通碼,用來識別按鍵),1位校驗(yàn)位(奇校驗(yàn))

1位結(jié)束位(1)

實(shí)現(xiàn):將鍵盤發(fā)回的數(shù)據(jù)放到一個(gè)緩沖區(qū)里(數(shù)組),當(dāng)按鍵結(jié)束后發(fā)生內(nèi)部中斷來處理所按的按鍵

缺點(diǎn):由于51單片機(jī)的容量有限所以緩沖區(qū)不可以開的太大,這就導(dǎo)致可以記錄鍵盤的按鍵次數(shù)過少,

也就是容錯(cuò)性一般。不過如果正常使用鍵盤是不會(huì)出錯(cuò)的

//#include“reg51.h”

#include “intrins.h”

#include “ku.h” //按鍵通碼與ascii對照表

sbit sda= p1^0; //鍵盤數(shù)據(jù)線

unsigned char dat=0,dat1=0,dat2=0; //接收鍵盤數(shù)據(jù)變量? 存儲(chǔ)通碼變量 接受連續(xù)通碼變量

unsigned char count=0,num=9,temp[5],shu=0; //中數(shù)次數(shù) 中斷控制變量 緩沖區(qū)數(shù)組 緩沖區(qū)指針

unsigned char key=0; //按鍵最終值

void zhongduan() interrupt 0 //外部中斷0 用來接受鍵盤發(fā)來的數(shù)據(jù)

{

dat》》=1; //接受數(shù)據(jù) 低-》高

if(sda) dat|=0x80;

count++;

if(count==num)

{

if(count==9)

{

dat1=dat; //中斷9次后為鍵盤所按按鍵的通碼(開始位始終為0在第一次中斷時(shí)右移中忽略)

num=20; //使中斷可以繼續(xù)中斷11次

}

if(count==20)

{

dat2=dat; //取回第二個(gè)通碼

if(dat1==0xe0 || dat2==0xf0) //第一個(gè)通碼是0xe0則證明所按按鍵為功能鍵,第二個(gè)通碼是0xf0證明按鍵結(jié)束

{

temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //將所按按鍵存到緩沖區(qū)中

ie=0x82; //關(guān)閉外部中斷并打開內(nèi)部中斷來處理所按按鍵

tr0=1;

}

else

{

temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //如果shift鍵被按下則記錄與它同時(shí)按下的那個(gè)鍵

count=0;

}

if((temp[0]==18 || temp[0]==89) && (temp[2]==18 || temp[2]==89) ) tr0=1; //如果緩沖區(qū)中有兩個(gè)間隔的shift鍵則證明需要的銨鍵結(jié)束

}

}

}

void getkey() interrupt 1 //內(nèi)部中斷0 用來處理緩沖區(qū)里的數(shù)據(jù)

{

unsigned char i=0;

tr0=0;

th0=0;

tl0=0;

count=0; //中斷記數(shù)則0

if((temp[0]==18 || temp[0]==89) && temp[1]!=0xf0 ) //shift被按下

{

for(i=0;i《21;i++)

{

if(addshift[i][0]==temp[1]) //搜索shift被按下的表

{

key=addshift[i][1];

ie=0x83; //打開外部中斷

return;

}

}

}

else if(temp[0]==0xe0) //所按下的按鍵是功能鍵

{

for(i=0;i《80;i++)

{

if(noshift[i][0]==temp[1]) //功能鍵的通碼在緩沖區(qū)的第二位

{

key=noshift[i][1];

ie=0x83;

return;

}

}

}

else //普通按鍵

{

for(i=0;i《80;i++)

{

if(noshift[i][0]==temp[0]) //普按鍵的通碼在緩沖區(qū)的第一位

{

key=noshift[i][1];

ie=0x83;

return;

}

}

}

for(i=0;i《5;i++)

{

temp[i]=0;

}

}

PC機(jī)鍵盤按鍵通碼與ASCII對照表

這個(gè)庫要配合 單片機(jī)驅(qū)動(dòng)標(biāo)準(zhǔn)pc機(jī)鍵盤的c51程序使用

unsigned char code noshift[80][2]=

{

22 ,49,// { 1 }

30 ,50,// { 2 }

38 ,51,// { 3 }

37 ,52,// { 4 }

46 ,53,// { 5 }

54 ,54,// { 6 }

61 ,55,// { 7 }

62 ,56,// { 8 }

70 ,57,// { 9 }

69 ,48,// { 0 }

28 ,97,// { a }

50 ,98,// { b }

33 ,99,// { c }

35 ,100,// { d }

36 ,101,// { e }

43 ,102,// { f }

52 ,103,// { g }

51 ,104,// { h }

67 ,105,// { i }

59 ,106,// { j }

66 ,107,// { k }

75 ,108,// { l }

58 ,109,// { m }

49 ,110,// { n }

68 ,111,// { o }

77 ,112,// { p }

21 ,113,// { q }

45 ,114,// { r }

27 ,115,// { s }

44 ,116,// { t }

60 ,117,// { u }

42 ,118,// { v }

29 ,119,// { w }

34 ,120,// { x }

53 ,121,// { y }

26 ,122,// { z }

84 ,91,// { [ }

91 ,93,// { ] }

76 ,59,// { ; }

82 ,39,// { ‘ }

65 ,44,// { , }

73 ,46,// { 。 }

74 ,47,// { / }

78 ,45,// { - }

85 ,61,// { = }

93 ,92,// { \ }

14 ,96,// { ` }

90 ,32,// { enter }

5 , 0,// { f1 }

6 , 1,// { f2 }

4 , 2,// { f3 }

12 , 3,// { f4 }

3 , 4,// { f5 }

11 , 5,// { f6 }

131, 6,// { f7 }

10 , 7,// { f8 }

1 , 8,// { f9 }

9 , 9,// { f10 }

120,10,// { f11 }

7 ,11,// { f12 }

102,12,// { back }

224,13,// { home }

105,14,// { end }

125,15,// { pageup }

122,16,// { pagedown }

117,17,// { up }
責(zé)任編輯 LK

114,18,// { down }

107,19,// { left }

116,20,// { right }

113,21,// { del }

112,22,// { insert }

225,23,// { pause }

118,24,// { esc }

13 ,25,// { tab }

88 ,26,// { caps }

20 ,27,// { ctrl }

17 ,28,// { alt }

41 ,29,// { space }

31 ,30,// { win }

47 ,31,// { winright }

};《/P》《P》unsigned char code addshift[47][2]=

{

14,126, // { ~ }

22, 33, // { ! }

30, 64, // { @ }

38, 35, // { # }

37, 36, // { $ }

46, 37, // { % }

54, 94, // { ^ }

61, 38, // { & }

62, 42, // { * }

70, 40, // { ( }

69, 41, // { ) }

78, 95, // { _ }

85, 43, // { + }

93,124, // { | }

84,123, // { { }

91,125, // { } }

76, 58, // { : }

82, 34, // { “ }

65, 60, // { 《 }

73, 62, // { 》 }

74, 63, // { ? }

28 ,65,// { a }

50 ,66,// { b }

33 ,67,// { c }

35 ,68,// { d }

36 ,69,// { e }

43 ,70,// { f }

52 ,71,// { g }

51 ,72,// { h }

67 ,73,// { i }

59 ,74,// { j }

66 ,75,// { k }

75 ,76,// { l }

58 ,77,// { m }

49 ,78,// { n }

68 ,79,// { o }

77 ,80,// { p }

21 ,81,// { q }

45 ,82,// { r }

27 ,83,// { s }

44 ,84,// { t }

60 ,85,// { u }

42 ,86,// { v }

29 ,87,// { w }

34 ,88,// { x }

53 ,89,// { y }

26 ,90,// { z }

};

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628297
  • 鍵盤
    +關(guān)注

    關(guān)注

    4

    文章

    854

    瀏覽量

    39362
收藏 人收藏

    評論

    相關(guān)推薦

    C51單片機(jī)矩陣鍵盤掃描去抖程序

    C51單片機(jī)矩陣鍵盤電子掃描去抖程序 這段有1個(gè)C51的項(xiàng)目,用的是新華龍的C51 F020
    發(fā)表于 10-25 15:43 ?1.3w次閱讀
    <b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>矩陣<b class='flag-5'>鍵盤</b>掃描去抖<b class='flag-5'>程序</b>

    C51單片機(jī)相關(guān)的LCD驅(qū)動(dòng)程序源代碼

    C51單片機(jī)相關(guān)的LCD驅(qū)動(dòng)程序源代碼,可供參考調(diào)試
    發(fā)表于 02-22 18:14 ?19次下載

    PC標(biāo)準(zhǔn)鍵盤單片機(jī)系統(tǒng)中的應(yīng)用

    通過實(shí)例對PC鍵盤工作原理及接口做了介紹,并提供了C51編寫的讀鍵函數(shù)及其應(yīng)用實(shí)例。本文提供的接口及C51函數(shù)可直接移植到其他單片機(jī)系統(tǒng)開發(fā)
    發(fā)表于 03-28 17:01 ?0次下載

    C51單片機(jī)鍵盤掃描程序詳細(xì)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51單片機(jī)鍵盤掃描程序詳細(xì)資料免費(fèi)下載。
    發(fā)表于 11-27 16:02 ?20次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>鍵盤</b>掃描<b class='flag-5'>程序</b>的<b class='flag-5'>詳細(xì)</b>資料免費(fèi)下載

    C51單片機(jī)矩陣鍵盤設(shè)計(jì)程序詳細(xì)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51單片機(jī)矩陣鍵盤設(shè)計(jì)程序詳細(xì)資料免費(fèi)下載。
    發(fā)表于 11-27 16:37 ?26次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>矩陣<b class='flag-5'>鍵盤</b>設(shè)計(jì)<b class='flag-5'>程序</b>的<b class='flag-5'>詳細(xì)</b>資料免費(fèi)下載

    51單片機(jī)C51語言的scanf和printf是如何使用的詳細(xì)程序說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)C語言的scanf和printf是如何使用的詳細(xì)程序
    發(fā)表于 08-26 17:30 ?24次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b>語言的scanf和printf是如何使用的<b class='flag-5'>詳細(xì)</b><b class='flag-5'>程序</b><b class='flag-5'>說明</b>

    51單片機(jī)C程序基本架構(gòu)詳細(xì)說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)C程序基本架構(gòu)詳細(xì)說明。
    發(fā)表于 08-15 17:32 ?7次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>C</b><b class='flag-5'>程序</b>基本架構(gòu)<b class='flag-5'>詳細(xì)說明</b>

    單片機(jī)C51編程的警告提示說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51編程的警告提示說明資料免費(fèi)下載。
    發(fā)表于 08-02 17:34 ?2次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b>編程的警告提示<b class='flag-5'>說明</b>

    單片機(jī)C51的interrupt和using用法詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51的interrupt和using用法詳細(xì)資料說明
    發(fā)表于 07-17 17:38 ?5次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b>的interrupt和using用法<b class='flag-5'>詳細(xì)</b>資料<b class='flag-5'>說明</b>

    使用C51單片機(jī)和Proteus仿真進(jìn)行呼吸燈的設(shè)計(jì)程序和資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用C51單片機(jī)和Proteus仿真進(jìn)行呼吸燈的設(shè)計(jì)程序和資料說明。
    發(fā)表于 05-20 08:00 ?7次下載
    使用<b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>和Proteus仿真進(jìn)行呼吸燈的設(shè)計(jì)<b class='flag-5'>程序</b>和資料<b class='flag-5'>說明</b>

    C51單片機(jī)驅(qū)動(dòng)的安裝教程詳細(xì)說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51單片機(jī)驅(qū)動(dòng)的安裝教程詳細(xì)說明
    發(fā)表于 01-13 08:00 ?7次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>驅(qū)動(dòng)</b>的安裝教程<b class='flag-5'>詳細(xì)說明</b>

    C51單片機(jī)64位驅(qū)動(dòng)的應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51單片機(jī)64位驅(qū)動(dòng)的應(yīng)用程序免費(fèi)下載。
    發(fā)表于 01-13 08:00 ?7次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>64位<b class='flag-5'>驅(qū)動(dòng)</b>的應(yīng)用<b class='flag-5'>程序</b>免費(fèi)下載

    單片機(jī)C51語言程序設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51語言程序設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載包括了:單片機(jī)開發(fā)概述,構(gòu)建C
    發(fā)表于 03-16 08:00 ?18次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b>語言<b class='flag-5'>程序</b>設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載

    單片機(jī)C51語言程序設(shè)計(jì)的基礎(chǔ)資料詳細(xì)說明

    單片機(jī)C51語言既具有匯編語言對操作硬件的功能,又兼有高級編程語言的許多優(yōu)點(diǎn)。在現(xiàn)代的單片機(jī)程序設(shè)計(jì)中,單片機(jī)
    發(fā)表于 03-16 17:08 ?38次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b>語言<b class='flag-5'>程序</b>設(shè)計(jì)的基礎(chǔ)資料<b class='flag-5'>詳細(xì)說明</b>

    C51單片機(jī)程序設(shè)計(jì)實(shí)例說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51單片機(jī)程序設(shè)計(jì)實(shí)例說明免費(fèi)下載。雖然本章的例題很簡單,但是只要做完,就可以在如下幾個(gè)方面得到練習(xí):
    發(fā)表于 01-26 11:53 ?32次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>程序</b>設(shè)計(jì)實(shí)例<b class='flag-5'>說明</b>