//每按一下键数字便可显示在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
}
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)