液晶显示4*4矩阵键盘按键号程序设计

液晶显示4*4矩阵键盘按键号程序设计,第1张

//这是51hei单片机开发板让纯冲附带的一个程序,矩阵键盘接p3口,其中p3.0-p3.4为行,P3.5->p3.7为列

//每按一下键数字便可显示在1602液晶上面,并且蜂鸣器会发出响声.

//全部源代码下载: http://www.51hei.com/f/jz1602.rar

#include<reg52.h>裤庆

#include <Intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6

sbit wela=P2^7

sbit rs=P2^2

sbit lcden=P2^0

sbit rw=P2^1

sbit BEEP=P2^3

uchar num,temp,date,i

uchar code table_1[]=" shu ru tiao ma "

uchar code table_2[]=" Pro_8888 "

uchar code dis_tab[17]=

{

0x30, //0在1602中的十六进制码

0x31, //1在1602中的十六进制码

0x32, //2在1602中的十六进制码

0x33, //3在1602中的十六进制码

0x34, //4在1602中的十六进制码

0x35, //5在1602中的十六进制码

0x36, //6在1602中的十六进制码

0x37, //7在1602中的十六进制码

0x38, //8在1602中的十六进制码

0x39, //9在1602中的十六进制码

0x41, //A在1602中的十六进制码

0x42, //B在1602中的十六进制码

0x43, //C在1602中的十六进制码

0x44, //D在1602中的十六进制码

0x2A, //*在1602中的十六进制码

0x23, //#在1602中的十六进制码

0x20, // 在1602中的十六进制码

}

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

void beep()

{

uchar i

for (i=0i<50i++)

{

delay(4)

BEEP=0 //BEEP取反

}

BEEP=1 //关闭蜂鸣器

delay(100) //延时

}

void lcd_wait_busy() //1602忙检测函数

{

P0=0xff //数据口全部置1,为读状态做准备

rs=0 //选择指令寄存器

rw=1 //选择读

lcden=1 //使能线电平变化

while((P0&0x80)==0x80)//读忙状态,不忙时退出

lcden=0 //恢复使能线电平

}

// 1602写命令函数

void lcd_write_com(unsigned char combuf)

{

rs=0 //选择指令寄存器

rw=0 //选择写

P0=combuf //把命令字送入P2

lcden=1 //使能线电平变化,命令送入1602的8位数据口

_nop_()

lcden=0 //恢复使能线坦歼电平

}

// 1602写命令函数(带忙检测)

void lcd_write_com_busy(unsigned char combuf)

{

lcd_wait_busy() //调用忙检测函数

lcd_write_com(combuf) //调用写命令函数

}

// 1602写数据函数(带忙检测)

void lcd_write_data(unsigned char databuf)

{

lcd_wait_busy() //调用忙检测函数

rs=1 //选择数据寄存器

rw=0 //选择写

P0=databuf //把数据字送入P2

lcden=1 //使能线电平变化,命令送入1602的8位数据口

_nop_()

lcden=0 //恢复使能线电平

}

// 1602显示地址写函数

void lcd_write_address(unsigned char x,unsigned char y)

{

y&=0x01 //行地址限制在0-1

if(y==0x00)

lcd_write_com_busy(x|0x80) //第一行的列地址写入

else

lcd_write_com_busy((x+0x40)|0x80) //第二行的列地址写入

}

// 指定地址写入函数

void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf)

{

lcd_write_address(x,y)//写入地址

lcd_write_data(buf) //写入显示数据

}

// 液晶初始化指令

void lcd_init()

{

uchar num

dula=0

wela=0

lcden=0

lcd_write_com_busy(0x38)//设置16*2显示,5*7点阵,8位数据接口

lcd_write_com_busy(0x0d)//关显示 显示光标 光标闪烁

lcd_write_com_busy(0x06)//当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动

lcd_write_com_busy(0x01)//显示清屏:1,数据指针清零 2,所有显示清零

lcd_write_com_busy(0x80)//80h+地址码(0-27h,40h-67h) 设置数据地址指针

for(num=0num<16num++)

{

lcd_write_data(table_1[num])

delay(5)

}

lcd_write_com_busy(0x80+0x40)

}

void key_wdat(uchar i) //按键写数据

{

// dula=0

// wela=0

// lcden=0

//液晶初始化指令

// write_com(0x38)//设置16*2显示,5*7点阵,8位数据接口

// write_com(0x0d)//关显示 显示光标 光标闪烁

// write_com(0x06)//当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动

// write_com(0x01)//显示清屏:1,数据指针清零 2,所有显示清零

// write_com(0x80+0x40)//80h+地址码(0-27h,40h-67h) 设置数据地址指针

lcd_wait_busy()

lcd_write_data(i)

delay(100)

}

// 删除液晶第1或2行全部数据

void clear(uchar t)

{

if(t==1)

{

lcd_write_com_busy(0x80)

}

if(t==2)

{

lcd_write_com_busy(0x80+0x40)

}

for(i=0i<15i++)

{

lcd_write_data(dis_tab[16])

}

lcd_write_com_busy(0x80+0x40)

}

// 产品显示函数 待写 如何从键盘输入中提取出三位的产品号码???????????????????

/*

void display_product()

{

}

*/

// 4*4矩阵键盘检测

void keyscan()

{

lcden=1//???

//

P3=0xfe

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

delay(5)

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xee:key_wdat(dis_tab[7])beep() // 7

break

case 0xde:key_wdat(dis_tab[8])beep() // 8

break

case 0xbe:key_wdat(dis_tab[9])beep() // 9

break

case 0x7e:key_wdat(dis_tab[17])beep() //

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

}

}

}

//

P3=0xfd

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

delay(5)

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xed:key_wdat(dis_tab[4])beep() // 4

break

case 0xdd:key_wdat(dis_tab[5])beep() // 5

break

case 0xbd:key_wdat(dis_tab[6])beep() // 6

break

case 0x7d:key_wdat(dis_tab[17])beep() //

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

}

}

}

//

P3=0xfb

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

delay(5)

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xeb:key_wdat(dis_tab[1])beep() // 1

break

case 0xdb:key_wdat(dis_tab[2])beep() // 2

break

case 0xbb:key_wdat(dis_tab[3])beep() // 3

break

case 0x7b:key_wdat(dis_tab[17])beep() //

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

}

}

}

//

P3=0xf7

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

delay(5)

temp=P3

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xe7:key_wdat(dis_tab[0])beep() // 0

break

case 0xd7:key_wdat(dis_tab[17])beep() //

break

case 0xb7:clear(2)beep() // 删除液晶第二行

break

case 0x77:beep() // enter

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

}

}

}

}

//

void main()

{

lcd_init()

while(1)

{

keyscan()

}

while(1)

}

电脑面51行明877A现台电脑面没源代码

4×4矩阵式键盘识别技术

实验任务

图4.14.2所示用AT89S51并行口P1接4×4矩阵键盘P1.0-P1.3作输入线P1.4-P1.7作输线;数码管显示每按键0-F序号应按键序号排列图4.14.1所示

图4.14.1

硬件电路槐乱罩原铅闹理图

图4.14.2

系统板硬件连线

单片机系统区域P3.0-P3.7端口用8芯排线连接4X4行列式键盘区域C1-C4 R1-R4端口;

单片机系统区域P0.0/AD0-P0.7/AD7端口用8芯排线连接四路静态数码显示模块区域任a-h端口;要求:P0.0/AD0应着aP0.1/AD1应着b……P0.7/AD7应着h

程序设计内容

4×4矩阵键盘识别处理

每按键行值列值 行值列值组合识别按键编码矩阵行线列线别通两并行接口CPU通信每按键状态同需变数字量01关端(列线)通电阻接VCC接通程序输数字0实现键盘处理程序任务:确定键按判断哪键按键陪磨功能;要消除按键闭合或断抖两并行口输扫描码使按键逐行态接另并行口输入按键状态由行扫描值馈信号共同形键编码识别按键通软件查表查该键功能

程序框图

图4.14.3

汇编源程序

KEYBUF EQU 30H

ORG 00H

START: MOV KEYBUF,#2

WAIT:

MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK1

MOV KEYBUF,#0

LJMP DK1

NK1: CJNE A,#0DH,NK2

MOV KEYBUF,#1

LJMP DK1

NK2: CJNE A,#0BH,NK3

MOV KEYBUF,#2

LJMP DK1

NK3: CJNE A,#07H,NK4

MOV KEYBUF,#3

LJMP DK1

NK4: NOP

DK1:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK1A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK1A

NOKEY1:

MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK5

MOV KEYBUF,#4

LJMP DK2

NK5: CJNE A,#0DH,NK6

MOV KEYBUF,#5

LJMP DK2

NK6: CJNE A,#0BH,NK7

MOV KEYBUF,#6

LJMP DK2

NK7: CJNE A,#07H,NK8

MOV KEYBUF,#7

LJMP DK2

NK8: NOP

DK2:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK2A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK2A

NOKEY2:

MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK9

MOV KEYBUF,#8

LJMP DK3

NK9: CJNE A,#0DH,NK10

MOV KEYBUF,#9

LJMP DK3

NK10: CJNE A,#0BH,NK11

MOV KEYBUF,#10

LJMP DK3

NK11: CJNE A,#07H,NK12

MOV KEYBUF,#11

LJMP DK3

NK12: NOP

DK3:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK3A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK3A

NOKEY3:

MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK13

MOV KEYBUF,#12

LJMP DK4

NK13: CJNE A,#0DH,NK14

MOV KEYBUF,#13

LJMP DK4

NK14: CJNE A,#0BH,NK15

MOV KEYBUF,#14

LJMP DK4

NK15: CJNE A,#07H,NK16

MOV KEYBUF,#15

LJMP DK4

NK16: NOP

DK4:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

DK4A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK4A

NOKEY4:

LJMP WAIT

DELY10MS:

MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

END

C语言源程序

#include

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71}

unsigned char temp

unsigned char key

unsigned char i,j

void main(void)

{

while(1)

{

P3=0xff

P3_4=0

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

for(i=50i>0i--)

for(j=200j>0j--)

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

temp=P3

temp=temp &0x0f

switch(temp)

{

case 0x0e:

key=7

break

case 0x0d:

key=8

break

case 0x0b:

key=9

break

case 0x07:

key=10

break

}

temp=P3

P1_0=~P1_0

P0=table[key]

temp=temp &0x0f

while(temp!=0x0f)

{

temp=P3

temp=temp &0x0f

}

}

}

P3=0xff

P3_5=0

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

for(i=50i>0i--)

for(j=200j>0j--)

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

temp=P3

temp=temp &0x0f

switch(temp)

{

case 0x0e:

key=4

break

case 0x0d:

key=5

break

case 0x0b:

key=6

break

case 0x07:

key=11

break

}

temp=P3

P1_0=~P1_0

P0=table[key]

temp=temp &0x0f

while(temp!=0x0f)

{

temp=P3

temp=temp &0x0f

}

}

}

P3=0xff

P3_6=0

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

for(i=50i>0i--)

for(j=200j>0j--)

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

temp=P3

temp=temp &0x0f

switch(temp)

{

case 0x0e:

key=1

break

case 0x0d:

key=2

break

case 0x0b:

key=3

break

case 0x07:

key=12

break

}

temp=P3

P1_0=~P1_0

P0=table[key]

temp=temp &0x0f

while(temp!=0x0f)

{

temp=P3

temp=temp &0x0f

}

}

}

P3=0xff

P3_7=0

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

for(i=50i>0i--)

for(j=200j>0j--)

temp=P3

temp=temp &0x0f

if (temp!=0x0f)

{

temp=P3

temp=temp &0x0f

switch(temp)

{

case 0x0e:

key=0

break

case 0x0d:

key=13

break

case 0x0b:

key=14

break

case 0x07:

key=15

break

}

temp=P3

P1_0=~P1_0

P0=table[key]

temp=temp &0x0f

while(temp!=0x0f)

{

temp=P3

temp=temp &0x0f

}

}

}

}

}


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

原文地址: http://outofmemory.cn/yw/12449505.html

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

发表评论

登录后才能评论

评论列表(0条)

保存