8255数码管显示0到9_汇编语言--键盘扫描及显示实验(含代码解释)
生活随笔
收集整理的這篇文章主要介紹了
8255数码管显示0到9_汇编语言--键盘扫描及显示实验(含代码解释)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
實(shí)驗(yàn)題目
將8255單元與鍵盤及數(shù)碼管顯示單元連接,編寫實(shí)驗(yàn)程序,掃描鍵盤輸入,并將掃描結(jié)果送數(shù)碼管顯示。鍵盤采用4X4鍵盤,每個(gè)數(shù)碼管顯示值可為0-F共16個(gè)數(shù)。
實(shí)驗(yàn)具體內(nèi)容如下:將鍵盤進(jìn)行編號(hào),記作0~F,當(dāng)按下其中一一個(gè)按鍵時(shí),將該按鍵對(duì)應(yīng)的編號(hào)在一一個(gè)數(shù)碼管上顯示出來,當(dāng)再按下一個(gè)按鍵時(shí),便將這個(gè)按鍵的編號(hào)在下-一個(gè)數(shù)碼管上顯示出來,數(shù)碼管上可以顯示最近4次按下的按鍵編號(hào)。
電路圖
實(shí)驗(yàn)代碼
;======================================================= ; 文件名: Keyscan.asm ; 功能描述: 鍵盤及數(shù)碼管顯示實(shí)驗(yàn),通過8255控制。 ; 8255的 B口控制數(shù)碼管的段顯示, ; A口控制鍵盤列掃描及數(shù)碼管的位驅(qū)動(dòng), ; C口控制鍵盤的行掃描。 ; 按下按鍵,該按鍵對(duì)應(yīng)的位置將按順序顯示在數(shù)碼管上。 ;=======================================================IOY0 EQU 0600H ;片選IOY0對(duì)應(yīng)的端口始地址 MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_CON EQU IOY0+03H*2 ;8255的控制寄存器地址SSTACK SEGMENT STACKDW 16 DUP(?) SSTACK ENDS DATA SEGMENT; DATBLE是 將需要輸入按鍵的值對(duì)應(yīng)需要給的顯示器的值 ; 比如按鍵1表示的值是1 但是我們送給顯示器的是06H ; 該程序是通過判斷按鍵按下 獲取其代表的偏移量(相對(duì)于DTABLE) ; 比如按鍵1的偏移量是1 我們掃描按鍵 得出一個(gè)值 1 ; 然后利用該值在DTABLE中找到需要輸出值的對(duì)應(yīng)顯示代碼值 ; 從B口送出去即可DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71H DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AX; 把3000H--3005H中的值全部初始化為00H; 說明初始偏移量全為0(3000H--3005H)MOV SI,3000HMOV AL,00HMOV [SI],AL ;清顯示緩沖MOV [SI+1],ALMOV [SI+2],ALMOV [SI+3],ALMOV [SI+4],ALMOV [SI+5],ALMOV DI,3005HMOV DX,MY8255_CON ;8255控制字初始化MOV AL,81H ;1000 0001 A、B口輸出 C口輸入OUT DX,ALBEGIN: ; 調(diào)用顯示子程序 CALL DIS ;清屏 CALL CLEAR ;掃描 看是否有鍵按下CALL CCSCAN ;有鍵按下 跳INK1JNZ INK1 JMP BEGININK1: CALL DISCALL DALLYCALL DALLYCALL CLEARCALL CCSCAN; 若結(jié)果不為0 ZF=0 則說明一定有鍵按下 則跳轉(zhuǎn) 判斷哪個(gè)鍵按下JNZ INK2 JMP BEGIN;確定按下鍵的位置 INK2: MOV CH,0FEH ; FEH=1111 1110(對(duì)應(yīng)關(guān)系:PA7 PA6..PA1 PA0 ) ; PA5-PA0=1111 10 (這里對(duì)應(yīng)關(guān)系要弄明白) ;PA0對(duì)應(yīng)的按鍵則是 從左到右第一列(這里不會(huì)暈哦) MOV CL,00H ; 初始對(duì)于行的偏移量 為0 ;列循環(huán) 即掃描列 從第一列開始 COLUM: MOV AL,CHMOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DX L1: TEST AL,01H ;is L1?JNZ L2MOV AL,00H ;L1JMP KCODE L2: TEST AL,02H ;is L2?JNZ L3MOV AL,04H ;L2JMP KCODE L3: TEST AL,04H ;is L3?JNZ L4MOV AL,08H ;L3JMP KCODE L4: TEST AL,08H ;is L4?JNZ NEXTMOV AL,0CH ;L4; 找到按鍵后 此時(shí)AL存的的第一列每一行的初始值 0 4 8 C ; CL 存的是對(duì)應(yīng)行的偏移量 ; 假設(shè) AL為08H CL為2 則表示的總偏移量為 8+2=10H ; 說明在table中該數(shù)字的偏移量為10H ; 輸出該數(shù)字 利用偏移量就行 因?yàn)閿?shù)字其實(shí)是存在table中的 KCODE: ADD AL,CLCALL PUTBUFPUSH AX KON: CALL DISCALL CLEARCALL CCSCANJNZ KONPOP AX NEXT: INC CL ; CL相當(dāng)于 行偏移量MOV AL,CHTEST AL,08H ; 08H=0000 1000 當(dāng)AL為1111 0111 && 0000 1000 結(jié)果為0 ; ZF=1 說明行偏移量達(dá)到最大值 3JZ KERR ; 4次列循環(huán)結(jié)束 跳KERRROL AL,1MOV CH,ALJMP COLUM KERR: JMP BEGIN; 鍵盤掃描子程序 ; 原理是 先向全部列輸出低電平 ; 然后從C口讀入 行電平 ; 如果沒有按鍵按下 所有行應(yīng)該均為高電平 ; 反之 若有按鍵按下 則開始仔細(xì)判斷出到底是哪個(gè)按鍵按下 具體判斷方法是: ; 先向第一列輸出低電平(從左到右) ; 然后從C口讀入行電平 利用 AND ; 判斷哪一行是否為低電平即可(后面為了計(jì)算方便取反了行電平) ; 若行全為高 為開始向下一列輸出低電平 循環(huán)4次即可 CCSCAN: MOV AL,00H MOV DX,MY8255_A OUT DX,AL ; 向所有列輸出 低電平MOV DX,MY8255_C IN AL,DX ;讀所有行電平;原來沒有任何鍵按下 4行全為1;這里取反 變成 0000 便于后面的判斷NOT AL; 假設(shè)沒有按鍵按下 ; 0000&1111=0; 結(jié)果為0 ZF=1 AND AL,0FHRET;清屏子程序 ;就是使得所有的燈熄滅 00H表示全不亮 瞬間 很快 CLEAR: MOV DX,MY8255_B MOV AL,00HOUT DX,ALRET; 顯示子程序 (這里稍微有點(diǎn)繞) DIS: PUSH AX MOV SI,3000H; 0DFH=1101 1111 對(duì)應(yīng)PA7 PA6 PA5...PA1 PA0; 由電路圖 得出 X1-PA0 X2-PA1.....; 6個(gè)顯示器 從左到右依次是 X1 X2 X3... X5 X6; 所以 對(duì)應(yīng)的PA: PA0 PA1 PA2...PA4 PA5; 這里初始是0DFH 代表 1 1 1 1 1 0 ; 意思是 第六個(gè)顯示 開始顯示數(shù)字; 哈哈 這里其實(shí)是從X6到X1依次顯示的; 每個(gè)數(shù)字顯示間隔很快 我們會(huì)認(rèn)為是6個(gè)數(shù)字一起顯示 其實(shí)是逐個(gè)顯示MOV DL,0DFHMOV AL,DLAGAIN: PUSH DX; 把AL送給A口 覺得開放哪個(gè)燈 (這里要看電路圖 A口也控制燈的開放)MOV DX,MY8255_A OUT DX,ALMOV AL,[SI] ; 把3000H--3005H中存的偏移量(相對(duì))取出MOV BX,OFFSET DTABLE ; 獲取DTABLE的首地址AND AX,00FFH ;因?yàn)楹竺鏁?huì)有加法運(yùn)算 先把a(bǔ)h清0 這樣ax就是 ; al的值,防止出錯(cuò)ADD BX,AX ; 獲取需要的值的偏移量(這個(gè)是絕對(duì)偏移量)MOV AL,[BX] ; 獲取顯示數(shù)字需要的值 例 顯示0需要3FHMOV DX,MY8255_B ; 送往B口 顯示數(shù)字OUT DX,ALCALL DALLY ;延時(shí)INC SI ;移動(dòng)SI 讀取下一個(gè)偏移量POP DXMOV AL,DL ; DL: 控制哪個(gè)燈的開放 開始是0DF 1101 1111; 取后6位(看電路圖 只連了6根線)即01 1111; 賦值給ALTEST AL,01H ; 測試AL 看是否為11 1110 ; 6個(gè)燈 一次顯示需要循環(huán)6次; 這里第六次結(jié)束是 AL=11 1110; 對(duì)于燈 就是x1燈顯示完(燈:X6->X1)JZ OUT1 ; 6次循環(huán)完成后 跳出ROR AL,1 ; 循環(huán)右移; 例 第一個(gè)燈亮 AL=01 1111 ; 則 第二個(gè)燈亮 為 10 1111; 所以需要循環(huán)右移; 反映在燈上 則是左移(不要繞進(jìn)去了哦)MOV DL,ALJMP AGAIN ; 跳回 繼續(xù)顯示 需循環(huán)6次 OUT1: POP AXRET; 子程序 延時(shí)作用 RET為子程序結(jié)束標(biāo)記 DALLY: PUSH CX MOV CX,0006H T1: MOV AX,009FH T2: DEC AXJNZ T2LOOP T1POP CXRET; 將獲得的偏移量存入3000H--30005H中 ; 便于后面的顯示 ; 顯示其實(shí)就是從3000H--3005H中讀取偏移量 ; 然后在table中找到真正的值即可 PUTBUF: MOV SI,DI ;存鍵盤值到相應(yīng)位的緩沖中MOV [SI],AL ;先存入地址3005H 再遞減 也就是下一個(gè)存入偏移量的是3004HDEC DICMP DI,2FFFHJNZ GOBACKMOV DI,3005H GOBACK: RETCODE ENDSEND START 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的8255数码管显示0到9_汇编语言--键盘扫描及显示实验(含代码解释)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# 微服务学习_资深架构师学习笔记:什
- 下一篇: 如何在linux安装mysql7版本的,