A. 誰用單片機做過3*8的鍵盤,8279晶元的
先找晶元內的資料,看使用,命令有何特別,估計和51差不多吧
找本51的教程,裡面的鍵盤設計,照著連就行了,如果覺得匯編費勁就找c51,用c編
B. 我要用51單片機做一個16*16的鍵盤掃描,要什麼晶元擴展I/O口
可以用MUX(multiplexer,復用器),比如橫行16位用一個16進一出的MUX,那麼加上選擇為就是一共只需要5個IO口,四個用來選擇,一個用來讀取數據,或者用32進一出的MUX只需要用6個IO口(不過不知道有沒有這么多輸入的MUX晶元),在程序里設置輸出選擇位就可以一位一位的鍵盤的輸入,缺點是會有一點延時。。。
C. 單片機 矩陣鍵盤 8255 LCD1602
查看8255數據手冊,了解它的控制字,有PA,PB,PC三個介面。矩陣鍵盤一般接PC口比較好,將其設置為4位輸出,4位輸入方式,1602接PA或PB口,設為輸出方式。8255是專用IO口擴展晶元,不用其他晶元了。1602用單片機控制,不用判忙,因為比起1602,單片機速度慢多了。
D. 求單片機(鍵盤輸入LED顯示)實驗代碼注釋
這是鍵盤顯示晶元8279的驅動程序。
程序中,原來有一些注釋,其中的8279,都誤寫成了8259。
盡量加寫了一些注釋,其中對8279的一些命令、數據,沒有多寫,建議樓主參考8279的資料。
CPORT EQU 5FFFH ;8259 {應該是8279} 控制埠地址
DPORT EQU 5EFFH ;?? 應該是8279 數據埠地址
DBUF EQU 30H
ORG 0000H
LJMP START ;主程序入口地址
ORG 0013H
LJMP INT1 ;中斷處理子程序入口
START: ;主程序
MOV SP, #6FH ;???設定棧底
MOV DPTR, #CPORT ;8259 {應該是8279} 控制埠
MOV A, #0DCH ;清除命令字
MOVX @DPTR, A ;清除{8279}的顯示內容
CLEAN :
MOVX A, @DPTR ;讀{8279的}狀態字
JB ACC.7, CLEAN ;判斷顯示RAM是否可操作
MOV A, #00H ;{8279}的方式命令字
MOVX @DPTR,A ;寫入{8279}
MOV A, #2AH ;{8279}的分頻系數
MOVX @DPTR,A ;寫入{8279}
;=========================以上是設定8279的工作方式
MOV R7, #6H
MOV R0, #DBUF
MOV A, #10H ;設置顯示緩存區內容
===========================================================
;以下部分
CDBUF:
MOV @R0, A
INC R0
DJNZ R7, CDBUF
;=========================以上是清除顯示緩存區內容
LCALL DISP ;調用顯示子程序
CLR IT1 ;IT1清0,開外中斷1
NOP ;空操作
SETB EA
NOP ;空操作
SETB EX1 ;置EX1(外部中斷1中斷允許位)為1
NOP ;空操作
CLEAN1:
LJMP CLEAN1 ;等待中斷
INT1: ;外部中斷程序
PUSH ACC ;保護現場
PUSH DPH
PUSH DPL
MOV DPTR, #CPORT ;8279的控制埠
MOV A, #40H ;01000000B
MOVX @DPTR, A ;將40H當做命令寫入8279
MOV DPTR, #DPORT ;8279的數據埠
MOVX A, @DPTR ;讀出按鍵數值
MOV R7, #6H
MOV R0, #DBUF
MOV @R0, A ;按鍵數值寫入顯示緩沖區
LCALL DISP ;顯示
LCALL L_SHIFT ; 顯示緩沖區內容移位
POP DPL ;恢復現場
POP DPH
POP ACC
RETI ;中斷程序結束
L_SHIFT: ; 顯示緩沖區內容移位
MOV R7, #6H ; 移位6次
MOV R0, #DBUF+4
MOV R1, #DBUF+5
NEXT0:
MOV A, @R0 ;取第四個
MOV @R1, A ;送到第五個
DEC R0
DEC R1 ;修改地址號碼
DJNZ R7, NEXT0 ;循環6次移位
RET
以上部分
================================================================
DISP:
MOV DPTR, #CPORT
MOV A, #092H
MOVX @DPTR, A
MOV R0, #DBUF ;R0中存放的是緩沖區的首地址
MOV R7, #06H
NEXTC:
MOV A, @R0
INC R0
MOV DPTR, #DCODE
MOVC A, @A+DPTR
MOV DPTR, #DPORT
MOVX @DPTR, A
DJNZ R7, NEXTC
RET ;返回
DCODE: DB 0C0H,0F9H,0A4H,0B0H ; 字型編碼表
DB 099H,092H,082H,0F8H
DB 080H,090H,088H,083H
DB 0C6H,0A1H,086H,08EH,0FFH
END
E. 利用STC89S51單片機做鍵盤。
#include "KBCODE.H"
#define LCM_RS P2_0
#define LCM_RW P2_1 //定義LCD引腳
#define LCM_E P2_2
#define LCM_Data P0
#define Busy 0x80 //用於檢測LCM狀態字中的Busy標識
#define Key_Data P3_2 //定義Keyboard引腳
#define Key_CLK P3_3
void LCMInit(void);
void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);
void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadStatusLCM(void);
unsigned char code cdle_net[] = {"RICHMCU PS2 TEST"};
unsigned char code email[] = {"www.RICHMCU.COM"};
unsigned char code Cls[] = {" "};
static unsigned char IntNum = 0; //中斷次數計數
static unsigned char KeyV; //鍵值
static unsigned char DisNum = 0; //顯示用指針
static unsigned char Key_UP=0, Shift = 0;//Key_UP是鍵松開標識,Shift是Shift鍵按下標識
static unsigned char BF = 0; //標識是否有字元被收到
void main(void)
{
unsigned char TempCyc;
Delay400Ms(); //啟動等待,等LCM講入工作狀態
LCMInit(); //LCM初始化
DisplayListChar(0, 0, cdle_net);
DisplayListChar(0, 1, email);
for(TempCyc=0; TempCyc<10; TempCyc++) {
Delay400Ms(); //延時
}
DisplayListChar(0, 1, Cls);
IT1 = 0; //設外部中斷1為低電平觸發
EX1 = 1; //開中斷
EA = 1;
while(1) {
if(BF)
Decode(KeyV);
else {
EA = 1; //開中斷
}
}
}
//寫數據
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在這後加小的延時
LCM_E = 0; //延時
LCM_E = 1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
{
if(BuysC) ReadStatusLCM(); //根據需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//讀狀態
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 1;
while(LCM_Data & Busy); //檢測忙信號
return(LCM_Data);
}
void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
Delay5Ms();
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
Delay5Ms();
WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示游標移動設置
WriteCommandLCM(0x0F,1); // 顯示開及游標設置
}
//按指定位置顯示一個字元
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大於15,Y不能大於1
if(Y)
X |= 0x40; //當要顯示第二行時地址碼+0x40;
X |= 0x80; //算出指令碼
WriteCommandLCM(X, 1); //發命令字
WriteDataLCM(DData); //發數據
}
//按指定位置顯示一串字元
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大於15,Y不能大於1
while (DData[ListLength]>0x19) {//若到達字串尾則退出
if(X <= 0xF) {//X坐標應小於0xF
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字元
ListLength++;
X++;
}
}
}
//5ms延時
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--)
;
}
//400ms延時
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--) {
TempCycB=7269;
while(TempCycB--)
;
}
}
void Keyboard_out(void) interrupt 2
{
if((IntNum > 0) && (IntNum < 9)) {
KeyV >>= 1; //因鍵盤數據是低>>高,結合上一句所以右移一位
if(Key_Data) {
KeyV |= 0x80; //當鍵盤數據線為1時為1到最高位
}
}
IntNum++;
while(!Key_CLK); //等待PS/2CLK拉高
if(IntNum > 10) {
IntNum = 0; //當中斷10次後表示一幀數據收完,清變數准備下一次接收
BF = 1; //標識有字元輸入完了
EA = 0; //關中斷等顯示完後再開中斷
}
}
void Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
{
unsigned char TempCyc;
if(!Key_UP) { //當鍵盤松開時
switch(ScanCode) {
case 0xF0 : //當收到0xF0,Key_UP置1表示斷碼開始
Key_UP = 1;
break;
case 0x12: // 左 SHIFT
Shift = 1;
break;
case 0x59: // 右 SHIFT
Shift = 1;
break;
default:
if(DisNum > 15) {
DisplayListChar(0,1,Cls); //清LCD第二行
DisNum = 0;
}
if(Shift == 1) { //如果按下SHIFT
for(TempCyc = 0;(Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if(Shifted[TempCyc][0] == ScanCode) {
DisplayOneChar(DisNum,1,Shifted[TempCyc][1]);
}
DisNum++;
}
else { //沒有按下SHIFT
for(TempCyc = 0; (UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59);TempCyc++); //查表顯示
if(UnShifted[TempCyc][0] == ScanCode) {
DisplayOneChar(DisNum,1,UnShifted[TempCyc][1]);
}
DisNum++;
}
break;
}
}
else {
Key_UP = 0;
switch(ScanCode) { //當鍵松開時不處理判碼,如G 34H F0H 34H 那麼第二個34H不會被處理
case 0x12: // 左 SHIFT
Shift = 0;
break;
case 0x59: // 右 SHIFT
Shift = 0;
break;
default:
break;
}
}
BF = 0; //標識字元處理完了
}
F. 請教單片機矩陣鍵盤使用什麼晶元
單片機矩陣鍵盤沒有驅動晶元的,要不就用編碼器,用編碼器比較麻煩,用到的IO口也很多,還不用用單片機8個IO4行4列來實現單片機的矩陣鍵盤請參考一下電路圖:希望我的回答對你有幫助!
G. 單片機鍵盤3*4式的工作原理
本文論述了基於RTOS的液晶屏游戲的硬體開發的全過程。
在緒論部分介紹了當前嵌入式系統在我國的發展現狀以及未來的發展趨勢。其次,介紹了液晶屏游戲的硬體系統的工作原理及各組成部分的設計情況以及PROTEL繪圖的特點和注意點。在第二章介紹了電路的中各個元器件在電路中實現功能。首先進行硬體選型,從性價比、實現的功能等分析單片機及其性能。系統硬體結構組成分析,包括鍵盤模塊、顯示模塊、鍵盤識別、顯示驅動。選型完畢後,開始設計電路。對電路進行初步搭建。在第三章介紹了PROTEL繪圖的全過程,以及在繪制原理圖和PCB圖時的注意點。
最後做硬體與軟體聯調,完成所要求的功能,對調試結果進行說明,指出需要改進的問題和方法。另外,本文中還介紹了顯示器、鍵盤、RS232晶元、889C61X2單片機工作原理及電氣性能。在本文的第三部分,利用Protel99SE軟體對整塊電路進行了原理圖和PCB圖的設計,還利用VISIO軟體繪制了流程圖。本文最後附有整塊電路的原理圖、
H. 如何進行單片機鍵盤電路的設計
其實比較好寫的..
行是,P3.0-P3.3,例是,P3.4-P3.7,最後得到的鍵值存在,KEYS中數為,0-15,
有什麼問題可以再問...
START:
MOV P1,#00H
MOV P2,#0FH
CLR KEYCARD
LOOP:
ACALL KEY_CHECK
JNB KEYCARD,LOOP ;為0從重新掃描
ACALL KEY_MARK ;為1有按鍵,調用KEY_MARK
AJMP LOOP
KEY_CHECK: ;鍵盤掃描
MOV P3,#0FH
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_C1
CLR KEYCARD
RET
KEY_C1:
ACALL DELAY ;有鍵接下,消抖
SETB KEYCARD
RET
KEY_MARK:
MOV A,#0EFH ;第一例,行掃描,
KEY_M1: ;鍵值掃描
MOV P3,A
MOV KEYS,A
MOV A,P3
ANL A,#0FH ;取與
CJNE A,#0FH,KEY_M2 ;在第一例則跳,KEY_M2
MOV A,KEYS ;並非在第一例剛移位
SETB C
RLC A
JC KEY_M1 ;C=1,重新掃描..
CLR KEYCARD ;掃完一圈後,完成..
RET
KEY_M2: ;鍵值計算
MOV R0,#KEYS ;將KEYS的地址裝入R0
XCH A,@R0 ;交換KEYS,A
XCHD A,@R0 ;交換低4位..
MOV KEYS,A
MOV R0,#0
LCALL KEY_ZHI
KEY_MX: ;等待按鍵釋放
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_MX
CLR KEYCARD
RET
KEY_ZHI:
MOV A,R0
INC R0
MOV DPTR,#KEY_VALUE
MOVC A,@A+DPTR
CJNE A,KEYS,KEY_ZHI ;查找鍵值.
DEC R0
MOV KEYS,R0
MOV P1,KEYS ;KEYS中的數為:0-15
RET
DELAY:
MOV R7,#20 ;延時大約2ms
D1: MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
KEY_VALUE: DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH,0EBH,0DBH,0BBH,07BH,07EH,07DH,077H
END
I. CH455鍵盤控制晶元,檢測到有效按鍵而產生按鍵代碼時,如果單片機沒有進行讀取而又檢測到新的有效按鍵
以叫口掃描法,先給P1口賦值0F0H由高四位讀入數據,保存;再給P1口賦值0FH由低四位讀入數據,兩次的數據即為相應按鍵的鍵值,比如此時「0」的鍵值是0EEH,而「1」是0EDH。
第二種是回送法,先給P1口賦值0F0H由高四位讀入數據,再判斷哪顆線上讀到了低電平,再將p1.0~p1.3,和沒有讀到低電平的到位線置成1,得到低電平的線保持為0,再讀低四位線上的數據,就得到了鍵值。此時得到的鍵值和上一種方法是相同的。
J. 單片機的鍵盤介面連接分為哪幾類說明各自的工作原理。鍵盤消抖是什麼有哪幾種方法
一般而言,單片機與鍵盤介面有3種方式:1、靜態介面方式;2、動態矩陣掃描方式;3、採用鍵盤管理晶元方式;第一種方式最簡單,主要用於按鍵不多的情況,每個按鍵佔用一條口線,第二種方式多用於按鍵較多的情況,比如用一個8位口就可以實現4x4鍵盤掃描,這種方式的優點是節省口線,缺點是佔用了較多的MCU資源,第三種方式是把管理鍵盤的任務交給了專用晶元,效率較高適用於按鍵多MCU處理任務重的應用場合。
鍵盤消抖顧名思義就是要消除鍵盤按下或抬起瞬間由於觸點抖動引起的不確定狀態,主要有軟體和硬體消抖兩種方法,軟體消抖就是監測到有鍵按下時並不立即響應,而是延時一段時間後再次判鍵把不確定狀態躲過去,硬體消抖是通過RS觸發器或施密特觸發器將鍵盤與單片機介面隔離,使得單片機讀取的是經過硬體濾波後的確定狀態。