导航:首页 > 操作系统 > 单片机键盘芯片

单片机键盘芯片

发布时间:2022-12-14 04:02:17

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触发器或施密特触发器将键盘与单片机接口隔离,使得单片机读取的是经过硬件滤波后的确定状态。

阅读全文

与单片机键盘芯片相关的资料

热点内容
四轴飞行器pid算法 浏览:818
足球预测算法 浏览:446
前端程序员都是什么部门 浏览:218
mac命令删除 浏览:178
安卓的g加g是什么意思 浏览:125
加密vue 浏览:560
解压去焦虑的方法 浏览:551
程序员眼干眼涩睁不开眼 浏览:98
飞机晚点改签算法 浏览:684
编译过程中优化如何分类 浏览:201
旧的网线怎么加密 浏览:366
word转pdf用什么软件 浏览:318
安卓如何设置苹果闹铃 浏览:266
如何修改网站后台服务器数据 浏览:117
手机乐园java 浏览:895
二手车搬运工app哪个好 浏览:477
怎么编成一个mc服务器 浏览:199
施工压缩工期 浏览:552
python导入包代码 浏览:60
武汉解压体验馆创业 浏览:983