设计一个2×2行列(同在p1.0)式键盘电路并用汇编语言编写键扫描子程序

设计一个2×2行列(同在p1.0)式键盘电路并用汇编语言编写键扫描子程序,第1张

22矩阵键盘是不是接P10~P13,程序如下:

KEYS:

MOV P1,#0FH

KEYS1:

CLR P10

SETB P11

JB P12,KEYS11

MOV A,#1

RET

KEYS11:

JB P13,KEYS2

MOV A,#2

RET

KEYS2:

SETB P10

CLR P11

JB P12,KEY21

MOV A,#3

RET

KEY21:

JB P13,KEYN

MOV A,#4

RET

KEYN:

MOV A,#0

RET

下列程序已经调好,按键显示电路可见:

//单片机:使用51系列兼容的即可;

//4×4矩阵键盘:接在P1口;

//两位数码显示器: P0口输出七段码,P2口输出位选码。

/========================================

//C语言程序如下。

/

文件名: KEY_LEDc

功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。

/

#include <reg51h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

uchar code table[10] = ;

uchar sec, t_50ms;

/

名称 : Delay_1ms()

功能 : 延时子程序,延时时间为 1ms x

输入 : x (延时一毫秒的个数)

输出 : 无

/

void Delay_1ms(uint x)

{

uint i;

uchar j;

for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);

}

/

名称: Display(uchar k)

功能: 将参数分成十位、个位分别显示

输入: k (键盘数值)

输出: P0口输出七段码,P2口输出位选码

/

void Display(uchar k)

{

P2 = 0; //消隐

P0 = table[k / 10];

P2 = 0x02; Delay_1ms(5); //显示5ms十位

P2 = 0; //消隐

P0 = table[k % 10];

P2 = 0x01; Delay_1ms(5); //显示5ms个位

}

/

名称: Keyscan()

功能: P1外接4×4按键, 按照扫描法读出键值

输出: 按键值0~15/如无键按下, 返回16

/

uchar Keyscan(void)

{

uchar i, j, temp, Buffer[4] = ;

for(j = 0; j < 4; j++) { //循环四次

P1 = Buffer[j]; //在P1高四位分别输出一个低电平

temp = 0x01; //计划先判断P10位

for(i = 0; i < 4; i++) { //循环四次

if(!(P1 & temp)) //从P1低四位,截取1位

return (i + j 4); //返回取得的按键值

temp <<= 1; //判断的位,左移一位

} }

return 16; //判断结束,没有键按下,返回16

} //呵呵,实质性的语句不过8行,就是这么简练!

/

名称: GetKey()

功能: 读出按键、消抖、等待按键释放

输出: 按键值0~15/如无键按下, 返回16

/

uchar GetKey(void)

{

uchar Key_Temp1, Key_Temp2; //两次读出的键值

P1 = 0xff;

Key_Temp1 = Keyscan(); //先读入按键

if(Key_Temp1 == 16) return 16; //没有键按下,返回16

Display(sec); //用显示代替延时

Key_Temp2 = Keyscan(); //再读一次按键

if(Key_Temp1 != Key_Temp2) return 16; //不同,返回16

while(Keyscan() < 16) //等待按键释放

Display(sec); //等待期间显示

return Key_Temp1;

}

/

名称 : Main()

功能 : 主函数

/

void Main(void)

{

uchar Key_Value; //读出的键值

sec = 0;

TMOD = 0x01;

TH1 = (65536-50000)/256;

TL1 = (65536-50000)%256;

TR0 = 1;

ET0 = 1;

EA = 1;

while(1) {

Display(sec); //显示

if (GetKey() == 10) {

TR0 = 0;

while (TR0 == 0) {

Display(sec); //显示

Key_Value = GetKey();

if (Key_Value < 10) {

sec %= 10;

sec = sec 10 + Key_Value;

}

if (Key_Value == 10) TR0 = 1;

} } }

}

/

名称 : T0_INT()

功能 : T0中断函数

/

void T0_INT() interrupt 1

{

TH1 = (65536-50000)/256;

TL1 = (65536-50000)%256;

t_50ms++;

if(t_50ms >= 20) {

t_50ms = 0;

sec++;

sec %= 60;

}

}

//

这是完整的矩阵键盘代码没错,不过并不难理解,假设按下的是连接P11和P15的按键,那么各行代码的二进制结果为:

第一行:P1 = 1111 0000

第二行:KH = 1101 0000

第三行:P1 = 0000 1111

第四行:KL = 0000 1101

第五行:Key = 1101 0000 | 0000 1101 = 1101 1101

高位和低位“0”的位置不同,位或得到的结果也不同,这样就能得到不同的键值,作为判断按键位置的依据。

#define LCD1602_FLAG

#define LCD1602_PORT P0

#include<reg51h>

#include<stddefh>

#define uchar unsigned char

sbit lcd1602_rs=P2^0;

sbit lcd1602_e=P2^2;

sbit lcd1602_rw=P2^1;

sbit lcd1602_busy=P0^7;

uchar str[]="This is Key Test";

uchar keyval,keystr[16];

void delay(uchar a)

{

uchar i;

while(a--)for(i=0;i<120;i++);

}

/

  函数名称:lcd1602_CheckBusy()

  函数功能:状态查询

/

void lcd1602_CheckBusy()

{

    do

    {

    lcd1602_busy=1;

    lcd1602_rs=0;

    lcd1602_rw=1;

    lcd1602_e=0;

    lcd1602_e=1;

    }

while(lcd1602_busy);

}

/

  函数名称: lcd1602_WriteCmd()

  函数功能:写命令

  入口参数:命令字

  出口参数:无

/

void lcd1602_WriteCmd(const uchar cmd)

{

    lcd1602_CheckBusy();

lcd1602_rs=0;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=cmd;

lcd1602_e=0;

}

/

  函数名称:lcd1602_WriteData()

  函数功能:写数据

  入口参数:c--待写数据

  出口参数:无

/

void lcd1602_WriteData(const uchar c)

{

    lcd1602_CheckBusy();

lcd1602_rs=1;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=c;

lcd1602_e=0;

}

/

  函数名称:lcd1602_Init()

  函数功能:初始化LCD

  入口参数:无

  出口参数:无

/

void lcd1602_Init()

{

    lcd1602_WriteCmd(0x38); //显示模式为8位2行57点阵

    lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,

    lcd1602_WriteCmd(0x06); //flag move to right,screen don't move

    lcd1602_WriteCmd(0x01); //clear screen

}

/

  函数名称:lcd1602_Display()

  函数功能: 字符显示

  入口参数:ptr--字符或字符串指针

  出口参数:无

  说    明:用户可通过以下方式来调用:

            1)lcd1602_Display("Hello,world!");

            2) INT8U 存储类型 txt[]="要显示的字符串";

               或者 INT8U 存储类型 txt[]={'t','x','t',,'\0'};

               INT8U ptr;

               ptr=&txt;

               lcd1602_Display(ptr);

               或 lcd1602_Display(txt);

               或 lcd1602_Display(&txt);

/

void lcd1602_Display(const uchar ptr,uchar line)

{

    uchar data i=0;

uchar data q;

q=ptr;

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80);

while(q!=NULL && (q!='\0') && i<16)

     {

lcd1602_WriteData(q);

q++;

i++;

     }

break;

case 1:

lcd1602_WriteCmd(0xc0);

while(q!=NULL && (q!='\0') && i<16)

     {

lcd1602_WriteData(q);

q++;

i++;

}

break;

}

}

uchar kbscan(void)

{

unsigned char sccode,recode;

P3=0x0f;  //发0扫描,列线输入

if ((P3 & 0x0f) != 0x0f)  //有键按下

{

delay(20);   //延时去抖动

if ((P3&0x0f)!= 0x0f)

{

sccode = 0xef;    //逐行扫描初值

while((sccode&0x01)!=0)

{

    P3=sccode;

if((P3&0x0f)!=0x0f)

{

    recode=(P3&0x0f)|0xf0;

while((P3&0x0f)!=0x0f);//等待键抬起

return((~sccode)+(~recode));

 }

        else

sccode=(sccode<<1)|0x01;

}

}

}

return 0;  //无键按下,返回0

}

uchar getkey(void)

{

uchar key;

key=kbscan();

if(key==0){keyval=0xff;return(0);}

switch(key)

{

case 0x11:keyval=7;break;

case 0x12:keyval=4;break;

case 0x14:keyval=1;break;

case 0x18:keyval=10;break;

case 0x21:keyval=8;break;

case 0x22:keyval=5;break;

case 0x24:keyval=2;break;

case 0x28:keyval=0;break;

case 0x41:keyval=9;break;

case 0x42:keyval=6;break;

case 0x44:keyval=3;break;

case 0x48:keyval=11;break;

case 0x81:keyval=12;break;

case 0x82:keyval=13;break;

case 0x84:keyval=14;break;

case 0x88:keyval=15;break;

default:keyval=0xff;break;

}

if(keyval!=0xff)return(1);

else return(0);

}

main()

{

uchar num;

lcd1602_Init();

lcd1602_Display(str,0);

while(1)

{

if(getkey())

{

if(keyval<10)keystr[num]=keyval+0x30;

else keystr[num]=keyval-10+'A';

lcd1602_Display(keystr,1);

num++;

num%=16;

}

}

}

以上就是关于设计一个2×2行列(同在p1.0)式键盘电路并用汇编语言编写键扫描子程序全部的内容,包括:设计一个2×2行列(同在p1.0)式键盘电路并用汇编语言编写键扫描子程序、用汇编语言实现3*3键盘(1-9),当相应键按下时,LED上显示相应数值、【求解释】单片机最简单的矩阵键盘代码(只有三句)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9814860.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存