12864按键显示任意两位数

/**********************************************************
用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5
液晶上显示25。用矩阵按键0-9共10个按键。LCD12864用串行方式操作,
如果用并行,请自行修改。
***********************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define NOP _nop_();

sbit LCD_CS=P3^7; //片选,高电平有效(RS)
sbit LCD_SID=P3^6; //串行数据输入端(R/W)
sbit LCD_SCLK=P3^5; //串行同步时钟,上升沿读取SID数据(E)
sbit LCD_PSB=P3^4; //并/串选择 H并行 L串行
sbit LCD_RST=P3^3; //复位,低电平有效

uchar keynum;
uchar code dis1[]={"请输入任意两位数"};
uchar code dis2[16]={"0123456789ABCDEF"};
uchar dis_buf[]={0,0};

uchar getkey();
void display();
void delay(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<110;i++);
}
}
/*写指令程序,指令由3个字节组成,第一个为写指令*/
/*第二个为指令高4位,第三个为指令低4位*/
void send_cmd(uchar cmd_dat)
{
uchar i;
uchar i_dat;
i_dat=0xf8;
LCD_CS=1;
LCD_SCLK=0;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat&=0xf0;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat<<=4;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
LCD_CS=0;
delay(10);
}
/*写数据程序,指令由3个字节组成,第一个为写数据*/
/*第二个为数据高4位,第三个为数据低4位*/
void send_dat(uchar cmd_dat)
{
uchar i;
uchar i_dat;
i_dat=0xfa;
LCD_CS=1;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat&=0xf0;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat<<=4;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
LCD_CS=0;
delay(10);
}
void LCD_INIT()
{
LCD_PSB=0; //串行方式操作
send_cmd(0x30); //基本指令操作
delay(5);
send_cmd(0x0c); //显示开,关游标,游标位置反白禁止
delay(5);
send_cmd(0x06); //光标右移,整体显示不移动
delay(5);
send_cmd(0x01); //清除LCD显示内容
delay(5);
}

uchar getkey()
{
unsigned char row,col,k;
for(row=0;row<4;row++) //行值依次为0xfe, 0xfd, 0xfb, 0xf7
{
P0=~(1<k=0x10;
for(col=0;col<4;col++) //列值扫描
{
if(!(P0&k)) //如果有键按下
return (row*4+col); //返回按键位置
k<<=1;
}
}
return 99; //无键按下返回99
}
void key_dispos() //按键处理并显示程序
{
display(); /

/显示第一行和初始键值
keynum=getkey(); //获取键值
if(keynum<10) //
{
dis_buf[1]=dis_buf[0]; //第一个键值移位显示
dis_buf[0]=keynum; //获得第二个键值
display(); //显示改变后的键值
while(keynum<10) //松手检测
{
keynum=getkey();
}
}

}
void main()
{
P1=0xff;
LCD_INIT();
while(1)
{
key_dispos();
}
}

void display()
{
uint i;
send_cmd(0x80); //第一行显示
i=0;
while(dis1[i]!='\0')
{
send_dat(dis1[i]);
i++;
}

send_cmd(0x90); //第二行显示数据
send_dat(dis2[dis_buf[1]]);
send_dat(dis2[dis_buf[0]]);

}

相关文档
最新文档