衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機鍵盤輸入的程序

Wildesbeast ? 來源:21IC ? 作者:21IC ? 2020-06-21 11:38 ? 次閱讀

這是讀取鍵盤的子程序

主要內容為:如何定義位,如何得到按鍵狀態,防止鍵盤干擾的方法

以及如何處理讀入的鍵值

思路:首先在某一引腳輸出一個電平,然后讀入引腳的電平,如果剛好相反

那么可能有按鍵發生,但是不排除干擾,為了防止干擾,需要軟件延時20ms

消除干擾,然后,等待用戶釋放,否則,可能重復的到某種結果,發生意外情況

應該說鍵盤輸入是單片機外部指令輸入的重要途徑,因此如何設計鍵盤以及鍵盤的工作原理、讀鍵盤的方法、鍵盤的抗干擾設計等在單電能機系統設計中占有重要地位。這個例子在系統硬件的基礎上設計了軟件查詢程序、軟件延時程序(防止干擾),大致講述了一種查詢式鍵盤的工作原理與讀取方式。

下面是匯編語言寫的單片機鍵盤輸入程序

**************************************************

led1 bit p1.0 ;LED 顯示位定義

led2 bit p1.1

led3 bit p1.2

led4 bit p1.3

led5 bit p1.4

led6 bit p1.5

led7 bit p1.6

led8 bit p1.7

s1 bit p0.0 ;數碼管位定義

s2 bit p0.1

s3 bit p0.2

s4 bit p0.3

s5 bit p0.4

s6 bit p0.5

s7 bit p0.6

s8 bit p0.7

led_data equ p2 ;數碼管顯示數據定義

key1 bit p3.5 ;按鍵引腳定義

key2 bit p3.6 ;

key3 bit p3.7 ;

key equ 46h ;按鍵寄存單元

org 00h

jmp main

org 030h

main:mov sp,#30h ;首先定義

lcall REST;初始化子程序

lp:lcall pro_key ;調用鍵盤查詢子程序

lcall KEYPR ;用來顯示所查詢到的鍵值

jmp lp;反復調用,不斷查詢

REST:

mov a,#00h

mov b,#00h

mov p0,#0

mov p1,0ffh ;

mov p2,#0

mov key,#00h

mov p2,#255

clr beep

RET

KEYPR:

mov a,key ;鍵值在累加器KEY中

jz PROEND ;如果 A= 0,表示沒有按鍵,返回

cjne a,#1,k1;A= 1 ,用戶按了第一個鍵

mov a,#1 ;處理 A = 1的情況

mov dptr,#tab_nu ;查表

movc a,@a+dptr

mov led_data,a ;顯示 “1”

setb s1 ;在第一位

clr s2;其余兩位不顯示

clr s3

jmp PROEND;處理完成,子程序返回

;以下分別處理KEY = 2,3 的情況

k1:cjne a,#2,k2

mov a,#2

mov dptr,#tab_nu

movc a,@a+dptr

mov led_data,a

clr s1

setb s2

clr s3

jmp PROEND

k2:cjne a,#3, PROEND

mov a,#3

mov dptr,#tab_nu

movc a,@a+dptr

mov led_data,a

clr s1

clr s2

setb s3

PROEND:ret

**** 本內容跟帖回復才可瀏覽 *****

;************ 定時20 ms *************

delay20ms: push psw ;保存原來的寄存器單元

clr psw.3;設置新的寄存器

clr psw.4;

mov r0,#2;延時參數1

mov r1,#250;延時參數2

mov r2,#2;延時參數3

dl1:djnz r0,dl1 ;延時循環1

mov r0,#250 ;重新設置循環數據

dl2:djnz r1,dl1 ;開始第二道循環

mov r0,#240;

mov r1,#248;

dl3:djnz r2,dl1;第三道循環

nop;修正定時精度

pop psw ;恢復原來的寄存器組

ret ;返回

;*********** end *******************

;這是數字顯示表格,其中 帶小數點的數字比不帶小數點的數字大16

; 比如 0 的顯示代碼為 0;那么 0.的顯示代碼為 16;如此類推

tab_nu:

db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ;數字0-7 不帶小數點代碼

db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ;數字8-f 不帶小數點代碼

db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ;數字0-7 帶小數點代碼

db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ;數字8-f 帶小數點代碼

end;告訴編譯器本程序到此結束,一定需要加上,否則編譯通不過。

;c語言

**************************************************

//按不同的按鍵,會顯示不同的結果

#include 《8051.h》

#define uchar unsigned char

#define key1 P3_4 //鍵盤定義

#define key2 P3_5

#define key3 P3_6

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

void delay(uchar times);

void display(uchar disseg,uchar disdata);

uchar keyb();

// 這里定義的是數碼管對應的字符字根

code uchar disbuf_u[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,

0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,

0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};

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

uchar keybuf;

void main()

{

uchar keym = 0; //鍵盤返回結果的緩沖區

keybuf = 0;

P1 = 255; //關閉LED顯示

P0 = 0; //關閉數碼顯示

P2 = 255; //

while(1) //設置一個無限制循環

{

keym = keyb(); //得到按鍵結果

if(keym) keybuf = keym; //如果返回有效的按鍵結果才保存

display(keybuf-1,keybuf); //在相應的位置顯示返回的結果

}

}

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

//下面是延時程序。具體的延時時間不能通過表面程序看出,(為什么?)

//如果我們需要一個精密的延時程序,那么我們可以采用內嵌匯編代碼的方式

void delay(uchar times)

{

int t=100; //延時倍數

uchar i=times;

for(;i!=0;i--)

{for(;t!=0;t--){}}

}

//這里是顯示子程序,入口參數為

// disseg -》 位選 可選范圍 0-7 一共8個數碼管

// disdata -》 段選 可選范圍 0-31 一個32個字符

// 段選 0-15 16個字符 為 “0”-》“F”

// 段選 16-31 16個字符 為 “0.”-》“F.”

void display(uchar disseg,uchar disdata)

{

uchar dataf;

if(disseg 《 8) //只有當要顯示的位數有效,才顯示。否則,不顯示

{

dataf = 1;

while(disseg)

{

dataf 《《= 1;

disseg--;

}

P0 = dataf;

P2 = disbuf_u[disdata];

}

else{P0=0,P2=255;} //關閉數碼管顯示

}

uchar keyb()

{

uchar key,keytmp;

key1 = 1; //將輸出線拉高

key2 = 1;

key3 = 1;

key = P3 ; //讀回來

key = key & 0xf0; //獲得鍵盤結果

if(key == 112 ) return 0; //如果用戶沒有按鍵返回 0

else

{

keytmp = key;

delay(1); //判斷是不是干擾

key = P3 & 0xf0;

if (key != keytmp ) return 0; //是干擾,返回 0

else //不是干擾,等待用戶釋放按鍵

{

do{

key1 = 1; //輸出拉高

key2 = 1;

key3 = 1;

key = P3 & 0xf0; //讀回來

P1_0 = ~P1_0; //如果用戶不釋放,閃爍 p1.0

}while(key != 112 ); //等待用戶釋放

P1_0 = 1; //用戶釋放以后,清除p1.0指示燈

switch(keytmp)

{

case 96: return 3;//返回用戶按鍵結果

case 80: return 2;

case 48: return 1;

}

}

}

}

//

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led
    led
    +關注

    關注

    242

    文章

    23355

    瀏覽量

    663174
  • 單片機
    +關注

    關注

    6043

    文章

    44622

    瀏覽量

    638532
  • 鍵盤
    +關注

    關注

    4

    文章

    859

    瀏覽量

    39868
收藏 人收藏

    評論

    相關推薦

    單片機Debug工具性能對比 單片機調試常用命令

    單片機(Microcontroller Unit, MCU)調試是嵌入式開發中的一個重要環節,它幫助開發者發現和修復代碼中的錯誤,優化程序性能。不同的單片機和開發環境可能使用不同的調試工具和命令
    的頭像 發表于 12-19 09:56 ?472次閱讀

    單片機編程語言有哪些選擇

    單片機(Microcontroller Unit,MCU)編程是指為單片機編寫程序的過程,這些程序控制單片機的行為和功能。單片機廣泛應用于嵌
    的頭像 發表于 11-01 14:13 ?946次閱讀

    單片機怎么寫入程序

    單片機(Microcontroller Unit,MCU)是一種集成電路芯片,它將計算機的CPU、存儲器、輸入/輸出接口等功能集成在一個芯片上。單片機廣泛應用于嵌入式系統和物聯網設備中。編寫
    的頭像 發表于 10-21 11:21 ?926次閱讀

    單片機的中斷機制

    單片機的中斷機制是一種重要的處理方式,它允許單片機在執行主程序的過程中,能夠暫停當前任務,轉而處理外部或內部緊急事件。這種機制極大地提高了系統的響應速度和處理能力,使得單片機在各種應用
    的頭像 發表于 10-17 18:03 ?965次閱讀

    keil可以讀出單片機程序

    Keil是一款廣泛應用于單片機程序開發的軟件,它提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案。然而,關于Keil是否能直接“讀出”單片機程序
    的頭像 發表于 09-02 10:32 ?1243次閱讀

    單片機燒錄程序用什么軟件

    單片機燒錄程序單片機開發過程中的一個重要環節,涉及到將編寫好的程序代碼通過燒錄器寫入單片機的ROM中,以實現對
    的頭像 發表于 09-02 10:05 ?1651次閱讀

    單片機燒錄程序可以重新燒嗎

    單片機(Microcontroller Unit, MCU)是一種集成電路芯片,它將計算機的CPU、存儲器、輸入/輸出接口等集成在一塊芯片上,用于控制各種電子設備。單片機燒錄程序是指將
    的頭像 發表于 09-02 10:04 ?1549次閱讀

    單片機燒錄程序的線比單片機上的少還能燒錄嗎

    單片機燒錄原理 單片機燒錄是指將編寫好的程序代碼通過一定的方式傳輸到單片機的存儲器中,使其能夠按照程序的指令運行。這個過程通常需要使用燒錄器
    的頭像 發表于 09-02 09:54 ?612次閱讀

    單片機燒錄程序的線叫什么

    單片機燒錄程序時所使用的線,根據不同的燒錄方式和接口標準,可能會有所不同。以下是一些常見的單片機燒錄接口和對應的線: JTAG接口 : JTAG(Joint Test Action Group
    的頭像 發表于 09-02 09:52 ?1360次閱讀

    單片機燒錄程序的基本步驟是什么

    單片機燒錄程序單片機開發過程中非常重要的一步,它涉及到將編寫好的程序代碼通過一定的方式傳輸到單片機內部的存儲器中,使
    的頭像 發表于 09-02 09:47 ?1436次閱讀

    stm32單片機燒錄程序會擦除原來的程序

    在STM32單片機燒錄程序的過程中, 通常情況下會擦除原來的程序 ,并將新程序寫入單片機的閃存(Flash)中。這一過程是通過燒錄工具(如S
    的頭像 發表于 09-02 09:42 ?2514次閱讀

    基于51單片機矩陣鍵盤音樂電子琴電路圖proteus仿真及程序

    本資源內容概要:? ? ? ?這是基于51單片機矩陣鍵盤音樂電子琴電路圖proteus仿真及程序設計包含了電路圖源文件(Altiumdesigner軟件打開)、C語言程序源代碼(kei
    發表于 06-21 14:32 ?4次下載

    單片機接矩陣鍵盤GPIO應該怎么設置?是用上拉輸出或輸入模式嗎?

    單片機接矩陣鍵盤GPIO應該怎么設置?是用上拉輸出或輸入模式嗎?
    發表于 05-11 08:38

    數字電路仿真軟件單片機怎么用

    、調試和測試。 首先,使用單片機仿真軟件前,我們需要了解一些基本概念和背景知識。單片機是一種嵌入式系統的核心部件,它集成了微處理器、存儲器和各種外設輸入輸出接口,用于控制和執行特定的任務。單片
    的頭像 發表于 04-21 10:28 ?1151次閱讀

    單片機編程和plc編程有什么區別

    編程的基本概念 單片機是一種在一個芯片上集成了處理器核心、內存、輸入輸出接口等功能的微控制器。單片機通常用于控制與外部設備的交互,如傳感器、電機、鍵盤等。
    的頭像 發表于 02-22 10:23 ?2955次閱讀
    沁源县| 澳门百家乐官网游戏皇冠网| 澳门百家乐官网大揭密| 永利百家乐官网的玩法技巧和规则| 南京百家乐官网菜籽油| 利澳百家乐官网的玩法技巧和规则 | 百家乐官网视频一下| 海立方百家乐官网的玩法技巧和规则| 百家乐微笑投注| 大发888娱乐场骗局| 北票市| 百家乐官网资深| 百家乐最新投注方法| 百家乐追号工具| 百家乐图形的秘密破解| 网上百家乐| 百家乐官网庄家闲| 游戏机百家乐官网的玩法技巧和规则| 澳门百家乐破解| 尊龙线上娱乐| 澳门百家乐官网娱乐场开户注册| 中原百家乐官网的玩法技巧和规则 | 百家乐赌博在线娱乐| 皇家赌场| 百家乐官网赌神| 百家乐筹码多少钱| 必发娱乐| 女神百家乐官网的玩法技巧和规则 | 永昌县| 百家乐如何投注技巧| bet365备用主页器| 华侨人百家乐官网的玩法技巧和规则 | 百家乐群详解包杀| 网上百家乐官网官方网站| 澳门百家乐官网游戏下| 斗地主百家乐的玩法技巧和规则| 新2百家乐娱乐城| 洪江市| 怎么赢百家乐官网的玩法技巧和规则 | 真钱斗地主| 百家乐小型抽水泵|