请帮忙看一下 我想用矩阵键盘控制lcd1602
时间:10-02
整理:3721RD
点击:
帮忙看看错在哪里,可以显示Enter Password,但是按下键不能显示 * 我想按一个键显示一下* ,就是银行输入密码的那个操作。谢谢了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define KEYP P2
#define SEG P0
char code TAB[]={0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //矩阵键盘的输出数字
char code scan[]={0xef,0xdf,0xbf,0x7f}; //键盘的扫描码
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P1^2;
uchar code table[]="******";
uchar code table1[]="Enter Password";
scanner(); //声明键盘扫描函数
void delay(int z)
{
int i,j;
for(i=0;i<110;i++)
for(j=0;j<z;j++)
;
}
void write_com(uchar com)//用来写指令
{
rs=0;//表示写指令
P0=com;
delay(5);
e=1; //一个高脉冲度字噶钶
delay(5);//高脉冲延时一段时间
e=0;//将使能端啦为低电平
}
void write_date(uchar date)//本函数用来写数据
{
rs=1;//表示写数据
P0=date;
delay(5);
e=1; //一个高脉冲读走数据
delay(5);//高脉冲延时5毫秒
e=0;//将使能端拉为低电平
}
void init()//初始化函数
{
rw=0;//表示写指令或数据 RW=1表示读数据或指令
e=0;
write_com(0x38);//设置为5×7点阵
write_com(0x0c);//设置不显示光标
write_com(0x06);//当读或者写一个字符是地址自动加1指针也自动加1
write_com(0x01);//清屏指令(当为1时清屏)
write_com(0x80);//设置1602在第一行第一个显示
}
scanner()
{
unsigned char col,row;
unsigned char rowkey,kcode;
for(col=0;col<4;col++)
{
KEYP=scan[col];
rowkey=~KEYP&0x0f;
if(rowkey!=0)
{
if(rowkey==0x01) row=0;
else
if(rowkey==0x02) row=1;
else
if(rowkey==0x04) row=2;
kcode=3*col+row;
return kcode;
}
}
}
void main()
{
unsigned char kcode;
int i;
init();
for(i=0;table1[i];i++)
{
write_date(table1[i]);
delay(5);
}
write_com(0x80+0x40+5);
while(1);//将主函数停止在此处
scanner();
switch(kcode)
{
case 1:
write_com(0x80+0x40+5);write_date(table[0]);
case 2:
write_com(0x80+0x40+6);write_date(table[1]);
case 3:
write_com(0x80+0x40+7);write_date(table[2]);
case 4:
write_com(0x80+0x40+8);write_date(table[3]);
case 5:
write_com(0x80+0x40+9);write_date(table[4]);
case 6:
write_com(0x80+0x40+10);write_date(table[5]);
case 7:
write_com(0x80+0x40+11);write_date(table[6]);
case 8:
write_com(0x80+0x40+12);write_date(table[7]);
case 9:
write_com(0x80+0x40+13);write_date(table[8]);
}
}
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define KEYP P2
#define SEG P0
char code TAB[]={0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //矩阵键盘的输出数字
char code scan[]={0xef,0xdf,0xbf,0x7f}; //键盘的扫描码
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P1^2;
uchar code table[]="******";
uchar code table1[]="Enter Password";
scanner(); //声明键盘扫描函数
void delay(int z)
{
int i,j;
for(i=0;i<110;i++)
for(j=0;j<z;j++)
;
}
void write_com(uchar com)//用来写指令
{
rs=0;//表示写指令
P0=com;
delay(5);
e=1; //一个高脉冲度字噶钶
delay(5);//高脉冲延时一段时间
e=0;//将使能端啦为低电平
}
void write_date(uchar date)//本函数用来写数据
{
rs=1;//表示写数据
P0=date;
delay(5);
e=1; //一个高脉冲读走数据
delay(5);//高脉冲延时5毫秒
e=0;//将使能端拉为低电平
}
void init()//初始化函数
{
rw=0;//表示写指令或数据 RW=1表示读数据或指令
e=0;
write_com(0x38);//设置为5×7点阵
write_com(0x0c);//设置不显示光标
write_com(0x06);//当读或者写一个字符是地址自动加1指针也自动加1
write_com(0x01);//清屏指令(当为1时清屏)
write_com(0x80);//设置1602在第一行第一个显示
}
scanner()
{
unsigned char col,row;
unsigned char rowkey,kcode;
for(col=0;col<4;col++)
{
KEYP=scan[col];
rowkey=~KEYP&0x0f;
if(rowkey!=0)
{
if(rowkey==0x01) row=0;
else
if(rowkey==0x02) row=1;
else
if(rowkey==0x04) row=2;
kcode=3*col+row;
return kcode;
}
}
}
void main()
{
unsigned char kcode;
int i;
init();
for(i=0;table1[i];i++)
{
write_date(table1[i]);
delay(5);
}
write_com(0x80+0x40+5);
while(1);//将主函数停止在此处
scanner();
switch(kcode)
{
case 1:
write_com(0x80+0x40+5);write_date(table[0]);
case 2:
write_com(0x80+0x40+6);write_date(table[1]);
case 3:
write_com(0x80+0x40+7);write_date(table[2]);
case 4:
write_com(0x80+0x40+8);write_date(table[3]);
case 5:
write_com(0x80+0x40+9);write_date(table[4]);
case 6:
write_com(0x80+0x40+10);write_date(table[5]);
case 7:
write_com(0x80+0x40+11);write_date(table[6]);
case 8:
write_com(0x80+0x40+12);write_date(table[7]);
case 9:
write_com(0x80+0x40+13);write_date(table[8]);
}
}
求大神援助啊,我是初学者,拜托
while(1);//将主函数停止在此处
你的程序就在这儿等了,执行不到后面去。
谢谢了 小编 我自己改改
对啊,是while那里出现了问题啊,后面加分号干嘛?它是一个循环...
没显示出来啊,求解释