娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

MSP430學(xué)習(xí)筆記9-PS2鍵盤解碼

發(fā)布者:532829319hmk最新更新時(shí)間:2020-02-03 來源: elecfans關(guān)鍵字:MSP430  PS2  鍵盤解碼 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

    PS2鍵盤解碼的基本原理是通過外部中斷讀取鍵盤輸出的串行信號(hào),在根據(jù)掃描碼進(jìn)行查表解碼。鍵盤發(fā)送往主機(jī)的信號(hào)總是在時(shí)鐘的下降沿因此此中斷是在下降沿觸發(fā),且時(shí)鐘信號(hào)是由鍵盤給出,因此使用P1口中斷(已經(jīng)在初始化端口時(shí)設(shè)置)。發(fā)送的數(shù)據(jù)位11位,第一位是起始位,總為0,緊接是8個(gè)數(shù)據(jù)位,然后是奇校驗(yàn)位,最后是停止位總為1.


    本程序只能對(duì)基本按鍵(即鍵被按下時(shí)產(chǎn)生三個(gè)字節(jié)的掃描碼的按鍵)做出解碼,包括所有的可顯示字符鍵和Table,Back Space和Ente三個(gè)特殊功能鍵。基本按鍵的掃描碼由三個(gè)字節(jié)組成,第1個(gè)字節(jié)為接通碼,第2、3字節(jié)為斷開碼;其中第1字節(jié)和第3字節(jié)相同,中間字節(jié)為斷開標(biāo)志0xf0。例如:通碼和斷碼是以什么樣的序列發(fā)送到你的計(jì)算機(jī)使得字符G 出現(xiàn)在你的字處理軟件里呢?因?yàn)檫@是一個(gè)大寫字母需要發(fā)生這樣的事件次序按下Shift 鍵按下G 鍵釋放G 鍵釋放Shift 鍵,與這些時(shí)間相關(guān)的掃描碼如下:Shift 鍵的通碼12h G鍵的通碼34h G 鍵的斷碼F0h 34h Shift 鍵的斷碼F0h 12h 因此發(fā)送到你的計(jì)算機(jī)的數(shù)據(jù)應(yīng)該是12h 34h F0h 34h F0h 12h如果按鍵按著不放會(huì)連續(xù)發(fā)送通碼命令,可以連續(xù)顯示字符(沒有驗(yàn)證,實(shí)驗(yàn)驗(yàn)證是可以的)。


    具體的說明都已經(jīng)在程序中做了注釋,主程序,中斷服務(wù)函數(shù)中讀取鍵盤發(fā)送的值:

/*****************************************************

程序功能:接收并解碼來自標(biāo)準(zhǔn)鍵盤的基本按鍵的掃描碼

然后在1602液晶上顯示。按Back Space鍵可以前向刪除顯

示字符,按Space鍵可以后向刪除顯示字符。


-----------------------------------------------------

撥碼開關(guān)的SN74LVC2454和LCD位撥至ON

讀取鍵盤的信號(hào)需要電平轉(zhuǎn)換,注意設(shè)置SN74LVC2454的轉(zhuǎn)換方向

跳線設(shè)置:將跳線座J13的B8腳和P1.7腳短接

-----------------------------------------------------

測(cè)試說明:敲定標(biāo)準(zhǔn)鍵盤上的按鍵,觀察液晶顯示

*****************************************************/

#include 

#include "cry1602.h"

#include "cry1602.C"

#include "PS2Keyboard.h"

#include "PS2Keyboard.C"


#define SIDval  P5IN & BIT6

#define BufferSize  32      //顯示緩存大小

unsigned char bitcount=11;          //位計(jì)數(shù)變量

unsigned char kb_buffer[BufferSize];    //顯示緩存

unsigned char input=0;       //數(shù)據(jù)壓入緩存位置指針

unsigned char output=0;      //數(shù)據(jù)彈出緩存位置指針   

unsigned char pebit=0xff;    //奇偶校驗(yàn)標(biāo)志位

unsigned char recdata=0;     //接收到的數(shù)據(jù)

unsigned char tishi[]={"this is a demo!"};


/****************主函數(shù)****************/

void main(void)

{

    uchar disptmp,i;

    uchar x = 0,y = 0;

    uchar first = 1;

    

    WDTCTL = WDTPW + WDTHOLD;       //關(guān)閉看門狗

    P6DIR |= BIT2;P6OUT &= ~BIT2;   //打開電平轉(zhuǎn)換

    P2DIR |= BIT3;P2OUT |= BIT3;    //方向5V-->3.3V

    /*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/

    BCSCTL1 &= ~XT2OFF;                 // 打開XT2高頻晶體振蕩器

    do

    {

        IFG1 &= ~OFIFG;                 //清除晶振失敗標(biāo)志

        for (i = 0xFF; i > 0; i--);     //等待8MHz晶體起振

    }

    while ((IFG1 & OFIFG));             // 晶振失效標(biāo)志仍然存在?

    BCSCTL2 |= SELM_2;                  //主時(shí)鐘選擇高頻晶振

    

    LcdReset();                 //復(fù)位液晶

    DispNchar(0,0,15,tishi);    //液晶顯示提示信息

    Init_KB();                  //初始化鍵盤端口

    _EINT();                    //打開全局中斷

  

    while(1)

    {

        LPM3;                   //進(jìn)入低功耗模式

        

        if(first)

        {

            first = 0;

            LcdWriteCommand(0x01, 1);   //顯示清屏

            LcdWriteCommand(0x0f, 1);   //打開游標(biāo)

        }

        

        disptmp = GetChar();    //讀取鍵值對(duì)應(yīng)的ASCII碼

        if(disptmp != 0xff)     //取出了一個(gè)有效字符

        {

            if(disptmp == 8) //如果是退格鍵

            {

                if((x == 0) && (y == 0))//如果游標(biāo)在第1行第1位

                {

                    x = 15;

                    y = 1;

                    Disp1Char(x,y,0x20); //0x20是空格的ASCII碼

                    LocateXY(x,y);

                }

                else if((x == 0) && (y == 1))//如果游標(biāo)在第2行第1位

                {

                    x = 15;

                    y = 0;

                    Disp1Char(x,y,0x20); 

                    LocateXY(x,y);

                }

                else

                {

                    Disp1Char(--x,y,0x20); 

                    LocateXY(x,y);

                }

            }

            else if((disptmp == 9) || (disptmp == 13)) //如果是Table鍵或Enter鍵

            {

                _NOP();   

            }

            else    //其余字符顯示

            {

                Disp1Char(x++,y,disptmp);

                if(x == 16)           //如果一行顯示完畢

                {

                    x = 0;

                    y ^= 1;

                    LocateXY(x,y);  //重新定位游標(biāo)位置

                }

            }

        }

    }

}


/*******************************************

函數(shù)名稱:PORT1_ISR 

功    能:P1端口的中斷服務(wù)函數(shù),在這里接收來

          自鍵盤的字符


說明:鍵盤發(fā)送往主機(jī)的信號(hào)總是在時(shí)鐘的下降沿

因此此中斷是在下降沿觸發(fā),且時(shí)鐘信號(hào)是由鍵盤

給出,因此使用P1口中斷(已經(jīng)在初始化端口時(shí)

設(shè)置)。發(fā)送的數(shù)據(jù)位11位,第一位是起始位,總

為0,緊接是8個(gè)數(shù)據(jù)位,然后是奇校驗(yàn)位,最后是

停止位總為1.

參    數(shù):無

返回值  :無

********************************************/

#pragma vector=PORT1_VECTOR

__interrupt void  PORT1_ISR(void)

{

    if(P1IFG & BIT7)            //如果是clock的中斷

    {

        P1IFG &=~ BIT7;         //清除中斷標(biāo)志 

        

        if(bitcount == 11)        //接收第1位

        {

            if(SIDval)          //起始位總為0如果是1就不是起始位

                return;         //返回

            else  

                bitcount--;     //是起始位就接著接收下一位,進(jìn)行計(jì)數(shù)

        } 

        else if(bitcount == 2)    //接收奇偶校驗(yàn)位

        {   

            if(SIDval)          //如果校驗(yàn)位等于1

                pebit = 1;      //這個(gè)程序中只是對(duì)校驗(yàn)位進(jìn)行讀取,正確與否并為做判斷

            else

                pebit = 0;

            bitcount--;

        }

        else if(bitcount == 1)    //接收停止位

        {

            if(SIDval)          //若停止位正確

            {

                bitcount = 11;    //復(fù)位位計(jì)數(shù)變量

                if( Decode(recdata) )    //解碼獲得此鍵值的ASCII值并保存

                    LPM3_EXIT;           //退出低功耗模式

                recdata = 0;          //清除接收數(shù)據(jù)

            }

            else                //如果出錯(cuò)

            {

                bitcount = 11;

                recdata = 0;    

            }

        }

        else                    //接收8個(gè)數(shù)據(jù)位

        {

            recdata >>= 1;

            if(SIDval)  recdata |= 0x80;

            bitcount--;

        }

   }

}


解碼程序PS2Keyboard.C:

#include

#include "PS2Keyboardcode.h"


#define BufferSize  32

extern uchar kb_buffer[BufferSize];

extern uchar input;

extern uchar output;

extern uchar flag;

/*******************************************

函數(shù)名稱:PushBuff

功    能:將一個(gè)字符壓入顯示緩存,如果緩存以

          滿則覆蓋前面的數(shù)據(jù)

參    數(shù):c--要顯示的字符

返回值  :無

********************************************/

[1] [2]
關(guān)鍵字:MSP430  PS2  鍵盤解碼 引用地址:MSP430學(xué)習(xí)筆記9-PS2鍵盤解碼

上一篇:MSP430學(xué)習(xí)筆記6-動(dòng)態(tài)數(shù)碼管的顯示
下一篇:MSP430學(xué)習(xí)筆記3-PWM的產(chǎn)生

推薦閱讀最新更新時(shí)間:2025-04-25 08:59

MSP430學(xué)習(xí)筆記9-PS2鍵盤解碼
PS2鍵盤解碼的基本原理是通過外部中斷讀取鍵盤輸出的串行信號(hào),在根據(jù)掃描碼進(jìn)行查表解碼。鍵盤發(fā)送往主機(jī)的信號(hào)總是在時(shí)鐘的下降沿因此此中斷是在下降沿觸發(fā),且時(shí)鐘信號(hào)是由鍵盤給出,因此使用P1口中斷(已經(jīng)在初始化端口時(shí)設(shè)置)。發(fā)送的數(shù)據(jù)位11位,第一位是起始位,總為0,緊接是8個(gè)數(shù)據(jù)位,然后是奇校驗(yàn)位,最后是停止位總為1. 本程序只能對(duì)基本按鍵(即鍵被按下時(shí)產(chǎn)生三個(gè)字節(jié)的掃描碼的按鍵)做出解碼,包括所有的可顯示字符鍵和Table,Back Space和Ente三個(gè)特殊功能鍵。基本按鍵的掃描碼由三個(gè)字節(jié)組成,第1個(gè)字節(jié)為接通碼,第2、3字節(jié)為斷開碼;其中第1字節(jié)和第3字節(jié)相同,中間字節(jié)為斷開標(biāo)志0xf0。例如:通碼和斷碼是以
[單片機(jī)]
用4BIT OTP單片機(jī)實(shí)現(xiàn)USB/PS2 MOUSE的設(shè)計(jì)
   引言:   USB  低速設(shè)備的設(shè)計(jì)發(fā)展到現(xiàn)在已經(jīng)有了相當(dāng)?shù)某墒於取?各家IC公司都推出了USB DEVICE端的解決方案, 一般以8 BIT CPU CORE + USB SIE為主流構(gòu)架。 SH69P04是中穎電子(Sinowealth)本著豐富USB產(chǎn)品應(yīng)用,降低USB IC成本而設(shè)計(jì)的4BIT OTP單片機(jī), 用以開發(fā)USB DEVICE設(shè)備。   SH69P04的功能及特點(diǎn)                        圖1    如圖1, SH69P04集成了USB SIE, 支持USB和PS2端口復(fù)用。 內(nèi)建1.5K可控上拉電阻為用戶節(jié)約成本, 并能建立和PC穩(wěn)定的通訊。 專門為MOU
[單片機(jī)]
MSP430學(xué)習(xí)總結(jié)——定時(shí)器
一、MSP430定時(shí)器是什么? 和STM32類似,MSP430定時(shí)器也有定時(shí)、輸入捕獲、輸出比較以及產(chǎn)生PWM等功能,下面就來一一介紹這些功能以及怎么去使用。 首先,我們應(yīng)該知道MSP430的定時(shí)器模式分為比較模式和捕獲模式,個(gè)人理解比較模式就是定時(shí)中斷、計(jì)時(shí)等一些常規(guī)的功能,捕獲模式是PWM輸出,捕獲外部信號(hào),用于測(cè)量時(shí)間和脈沖數(shù)量等。MSP430默認(rèn)為比較模式。 MSP430的TA1的寄存器如下圖 二、MSP定時(shí)器的功能 1. 定時(shí)器中斷 定時(shí)器中斷就是間隔一定的時(shí)間,執(zhí)行一次中斷服務(wù)函數(shù),我們通過一段程序來上手定時(shí)器中斷,畢竟例程也是學(xué)習(xí)單片機(jī)的一大工具。 WDTCTL = WDTPW + WDTHOLD
[單片機(jī)]
<font color='red'>MSP430</font>學(xué)習(xí)總結(jié)——定時(shí)器
MSP430第五章:統(tǒng)一時(shí)鐘系統(tǒng)
1.介紹 通用時(shí)鐘系統(tǒng)(UCS)可以讓用戶在性能與功耗中尋找最佳平衡點(diǎn),允許用戶在外部只有晶振的條件下純軟件配置,其包含5個(gè)時(shí)鐘源: XT1CLK:低頻/高頻振蕩器,可以使用32768HZ手表晶振、標(biāo)準(zhǔn)晶振、諧振器、4-32MHZ外部時(shí)鐘源 VLOCLK:內(nèi)部低功耗低頻時(shí)鐘,典型值10KHZ。 REFOCLK:內(nèi)部32768HZ手表晶振,可用作FLL的參考時(shí)鐘。 DCOCLK:內(nèi)部數(shù)控振蕩器(DCO),可被FLL穩(wěn)定。 XT2CLK:可選高頻振蕩器,可用作標(biāo)準(zhǔn)振蕩器,共振器、4-32MHZ外部時(shí)鐘源,也可用作FLL的參考時(shí)鐘。 3個(gè)可用時(shí)鐘信號(hào): ACLK:輔助時(shí)鐘,ACLK可被軟件選用源于XT1CLK, REFOCL
[單片機(jī)]
<font color='red'>MSP430</font>第五章:統(tǒng)一時(shí)鐘系統(tǒng)
MSP430F169(二)——UART中斷(論下)
1. UART中斷工作的機(jī)制 UART只有一個(gè)發(fā)送中斷向量和一個(gè)接收中斷向量,通過判斷中斷向量的標(biāo)志來控制數(shù)據(jù)的收發(fā) 1.1 發(fā)送機(jī)制 當(dāng)用戶想發(fā)送數(shù)據(jù)時(shí),UxIFG產(chǎn)生一個(gè)中斷,表明UxTXBUF已經(jīng)準(zhǔn)備好接收數(shù)據(jù)。當(dāng)UxTXBUF接收字符后或中斷被執(zhí)行,URXIFG將會(huì)復(fù)位。 SWRST = 1或PUC會(huì)置位UxIFG (SWRST: 系統(tǒng)復(fù)位) SWRST = 1或PUC會(huì)復(fù)位UxIE 1.2接收機(jī)制 UxRXBUF每次接收一個(gè)字符并加載時(shí),URXIFGx會(huì)產(chǎn)生一個(gè)中斷標(biāo)記 UxRXBUF被讀取時(shí)或中斷被執(zhí)行時(shí),URXIFG被自動(dòng)復(fù)位 當(dāng)PUC或SWRST = 1時(shí)UxRXIE 復(fù)位 建議接收中斷函數(shù)的代碼要精簡(jiǎn),執(zhí)
[單片機(jī)]
MSP430f5529-GPIO簡(jiǎn)介
理論上來說,在不進(jìn)行端口功能復(fù)用的情況下,每一個(gè)端口都能用作普通GPIO口用。其中P1和P2端口可以用作外部中斷端口。其余的端口作用可以參考開發(fā)板自帶的端口功能圖。 這里介紹外部中斷和普通作用GPIO口寄存器和配置。 430f5529使用的是宏定義的引腳名稱。 這里用P1口做例子: 1.P1IN 可以讀取當(dāng)前P1端口某引腳上的信號(hào)值,用于讀取電平信號(hào),比如檢測(cè)按鍵輸入,通過讀取P1IN 的值判斷按鍵是否按下,如果按下了檢測(cè)到的都是低電平,返回的就是0,反之1。 用法: if (P1IN & BIT0),此為讀取P1.0引腳上電平信號(hào) 2.P1OUT 可
[單片機(jī)]
<font color='red'>MSP430</font>f5529-GPIO簡(jiǎn)介
MSP430F5529 單片機(jī) Memory game 記憶游戲 OLED實(shí)驗(yàn)
為了便于開發(fā),我做了一塊擴(kuò)展板子: https://blog.csdn.net/x1131230123/article/details/108772807 擴(kuò)展板有一些常用器件,這樣開發(fā)MSP430 F5529程序的時(shí)候,就不用杜邦線連接了。當(dāng)然也可以選擇杜邦線連接器件,效果都一樣。 Memory game. Draw 4 geometric shapes in positions on the screen touching each other. Display to the player for 1 second. Move the 4 shapes to random points on the screen. The
[單片機(jī)]
<font color='red'>MSP430</font>F5529 單片機(jī) Memory game 記憶游戲 OLED實(shí)驗(yàn)
msp430入門學(xué)習(xí)03
msp430的架構(gòu)CPu的 MSP430F169單片機(jī)CPU具有如下特征:   16位RSIC精簡(jiǎn)指令集,共27條,支持7種尋址方式   正交化指令設(shè)計(jì),每條指令都支持全部尋址方式   完全的寄存器訪問權(quán)限,包括PC SR SP等   (大的)16位寄存器文件減少到內(nèi)存讀取   16位的地址總線可以實(shí)現(xiàn)對(duì)整個(gè)存儲(chǔ)器的直接訪問   16位的數(shù)據(jù)總線可以直接操作16位的參數(shù)   單周期的寄存器操作    常數(shù)發(fā)生器提供六個(gè)最常用即時(shí)值,可減代碼大小   直接的存儲(chǔ)器到存儲(chǔ)器訪問,無需中間的寄存器   字(16位)和字節(jié)(8位)的地址和指令格式 PC:16位程序計(jì)數(shù)器(PC/R0)指向下一條要執(zhí)行的指令..每條
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京B2-20211791 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 黄石市| 安西县| 南安市| 盐池县| 腾冲县| 清原| 平湖市| 赫章县| 呼玛县| 重庆市| 普兰店市| 平罗县| 徐汇区| 连平县| 汤原县| 连江县| 扶绥县| 西畴县| 南投市| 娄烦县| 阿拉善盟| 南汇区| 沈阳市| 湖口县| 宁德市| 株洲市| 金沙县| 竹山县| 阳城县| 黎川县| 太湖县| 嘉善县| 彭阳县| 信宜市| 南康市| 盘山县| 汉沽区| 比如县| 西畴县| 兖州市| 庆云县|