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

用AT89C51单片机
(通信1班

刘一 2012043101)
(需要Protues图 不需要代码)

//这是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=z;x>0;x--)
for(y=110;y>0;y--);
}

void beep()
{
uchar i;
for (i=0;i<50;i++)
{
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=0;num<16;num++)
{
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=0;i<15;i++)
{
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);
}追问

我需要protues图还有事12864液晶显示器啊

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-06-15
(需要Protues图 不需要代码)

--看来,楼主自己,有代码。

电路、和程序,是配套的。
楼主如果希望得到合适的电路,就应该给出你所有代码。

有没有高手能写写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...

汇编语言设计的单片机4*4矩阵键盘
CLR P1.3 ;开显示 LJMP MAIN ;返回调用子程序反复循环显示 KEY: LCALL KS ;调用检测按键子程序 JNZ K1 ;有键按下继续 LCALL DELAY2 ;无键按下调用延时去抖动程序 AJMP KEY ;返回继续检测有无按键按下 K1: LCALL DELAY2 LCALL DELAY2 ...

89c51单片机4*4矩阵键盘编程。
CLR P1.4 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ SW1 LCALL DELAY10MS JZ SW1\/\/确认有键按下,但不知道哪个,此时可以之间让蜂鸣器叫 MOV P3.0,#1\/\/蜂鸣器发声(赋1还是赋0取决你用的蜂鸣器)MOV A,P1 ANL A,#0FH CJNE A,#0EH,K1 MOV COUNT,#0 LJMP DK K1: CJNE A,#0DH,K2 ...

用89C51单片机设计4*4矩阵式键盘计算器程序 要汇编的
MOV KEYBUF,#0 ;否者判断为0号键 AJMP DK ;转DK1查表程序NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H就转到NK2 MOV KEYBUF,#1 ;否者判断为1号键 AJMP DK ;转DK2查表程序NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H就转到NK3 MOV KEYBUF,#2 ;否者判断为2号键 AJMP DK ;转DK3...

传感器&模块系列:4x4矩阵键盘
实验设备清单中,树莓派pico是核心组件,其小巧的体积和强大的处理能力使其成为微控制器领域的佼佼者。实验原理揭示了4x4矩阵键盘的运作机制,通过巧妙的电路设计,实现按键的矩阵式排布,进而简化硬件布局与编程逻辑。实验步骤围绕测试代码展开,读者将学习如何编写并保存代码至树莓派pico中,这一过程不仅考验...

51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能?
if(key_l!=0xf0){ delay_nms(5);key_l=P1;……在第4行加 while( key_l!=0xf0 );等待按键释放,按键不放开就一直在此处等待,知道按键释放,此语句执行完。再往下执行

通过单片机外接一个4*4矩阵键盘,设置“0-9”启动”10个按键,进行30秒倒...
1.编码按钮分别为0,1,2,……,9十个按键:可以用矩阵键盘实现,2.用发光二极管作为输出指示灯,灯亮代表锁“开”,灯灭代表锁“不开”,用一个IO口,接上二极管,接上限流电阻,接地。密码正确,另该IO口值为1,否则为0;3.设置开锁密码,并按此密码设计电路。密码可以是0~9十位数。若按...

...现在想用4X4键盘控制,请问下面显示程序应该怎么改啊?折磨死了_百度...
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、...

4*4矩阵键盘输入1602显示1-16,怎么9之后显示“:<;”之类的符号,没有显...
首先,LCD1602是一位一位(也就是ASCII值)显示的,你的那个a是0~16,你加了0x30,你可以查看ascii表,当a=10时加0x30就等于 3A 对应的ascii表为 :所以不会看到打印的是 :那我们怎么打印出两位数呢?我们就要把a大于9的那部分提取出来。if(a!=16){ if(a>9){ write_cmd(0x80);w...

单片机编程问题(C语言),很入门的问题,明天比赛,急急急!多少分都可以...
\/\/C语言程序如下。\/ 文件名: KEY_LED.c 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。\/ include <reg51.h> include <intrins.h> define uint unsigned int define uchar unsigned char uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x...

相似回答