12232液晶显示

来源:互联网 发布:淘宝日系店铺 编辑:程序博客网 时间:2024/04/29 13:01

终于把这个程序调好啦,此程序可以按一个数字键,同时显示在液晶屏幕上拉!

刚开始用写一个地址命令到液晶,再写一个数据到液晶,调不通,老是出现一个键按下去,显示多个一样的数字键值!

最后用下面的程序,将按键写一个显示一个,就OK啦!

/* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /*

if ((keyscan()>=1)&&(keyscan()<=9)) //数字键0-9 * #
{
if(num<6)
number[num]=keyscan()+0x30; // 数字
num++;
lcd_mesg1(number);
}

/* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /*

#include<STC_NEW_8051.h>

sbit RS=P5^1; // 命令或数据
sbit WRD=P4^4; //写入、读出命令引脚
sbit E=P5^0; //使能

//sbit PSB=P2^0; //串行、并行
//sbit RES=P2^2; //复位
#define uchar unsigned char 
#define uint unsigned int 
void TransferData(char data1,bit DI);
void delayms(unsigned int n);
void delay(unsigned int m);
void lcd_mesg(unsigned char code *addr1);
void lcd_mesg1(unsigned char *addr2);
void lcd_num(unsigned char addr2); 
//下面来定义要显示的汉字,8*4
unsigned char code IC_DAT[]={" 欢迎您 "};
unsigned char code IC_DAT2[]={"我终于搞定啦"};
uchar keyscan(),num=0,number[6]; ///扫描程序
uchar key_code;
// uchar addr=0x90;
void initinal(void) //初始化,12864有要求的要写上
{
delayms(400);
//PSB=1; //并口工作模式
delayms(10);
//RES=0; //复位
//delay(10);
//RES=1; //复位置高
//delayms(10);
TransferData(0x30,0); //选择基本指令集,8位
delayms(100);
//TransferData(0x30,0);
//delay(37);
//TransferData(0x08,0);
//delay(100);
TransferData(0x10,0);//游标或显示移位控制
delayms(100);
TransferData(0x0C,0); //开显示(无游标、不反白)
delayms(100);
TransferData(0x01,0); //清屏指令:清屏且AC值为00H
delayms(100);
TransferData(0x06,0); //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
delayms(100);
}

void main(void) //分两屏来不断显示上面定义的IC_DAT和IC_DAT2汉字
{
P0M1=0X00; //STC12C5A60s2,端口改为强推挽
P0M0=0XFF;
P1M1=0X00;
P1M0=0XFF;
P2M1=0X00;
P2M0=0XFF;
P3M1=0X00;
P3M0=0XFF;
P4M1=0X00;
P4M0=0XFF;
initinal();
while(1)

//调用LCD字库初始化程序
delay(100);
lcd_mesg(IC_DAT);
delayms(500); 
if ((keyscan()>=1)&&(keyscan()<=9)) //数字键0-9 * #
{
if(num<6)
number[num]=keyscan()+0x30; // 数字
num++;
lcd_mesg1(number);
}
}
/*
while(1)

lcd_mesg(IC_DAT);
delayms(500); 
//延时程序必要的,长与短,自己调节 
TransferData(0x90,0);
key_code=keyscan();

//------------------------------------------------------
//键值处理程序,包含数字输入键和字母输入键以及功能键操作
//------------------------------------------------------
switch(key_code)
{
case 0:
{
TransferData(0x30,1);
delayms(100);
}break;
case 1:
{
TransferData(0x31,1);
delayms(100);
}break;
case 2:
{
TransferData(0x32,1);
delayms(100);
}break;
case 3:
{
TransferData(0x33,1);
delayms(100);
}break;
case 4:
{
TransferData(0x34,1);
delayms(100);
}break;
case 5:
{
TransferData(0x35,1);
delayms(100);
}break;
case 6:
{
TransferData(0x36,1);
delayms(100);
}break;
case 7:
{
TransferData(0x37,1);
delayms(100);
}break;
case 8:
{
TransferData(0x38,1);
delayms(100);
}break;
case 9:
{
TransferData(0x39,1);
delayms(100);
}break;

default:P2=0xff;

}
// key_code++;
}*/

void lcd_mesg(unsigned char code *addr1) //显示汉字函数,8*4=32
{
//unsigned char i;
TransferData(0x80,0);
delay(100);
while(*addr1 !='\0')
{

TransferData(*addr1,1);
addr1++;

}

void lcd_mesg1(unsigned char *addr2) //显示汉字函数,8*4=32
{
//unsigned char i;
TransferData(0x90,0);
delay(100);
while(*addr2 !='\0')
{

TransferData(*addr2,1);
addr2++;

}

void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据
{
WRD=0;
RS=DI;
delay(1);
P0=data1;
E=1;
delay(1);
E=0;
}

void delayms(unsigned int n) //延时子程序
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<2000;j++);
}

void delay(unsigned int m)
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}
uchar keyscan() ///扫描程序
{ uchar temp,num;
P2=0xfe;//第一行
temp=P2;//每次都要读P2口
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)//松手检测
{
temp=P2;
temp=temp&0xf0;
}
}
}

P2=0xfd;//第二行
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2; 
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}


P2=0xfb; // 读这一行 
temp=P2; //当有键被按下时,读回来的P2口的值
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}


P2=0xf7;//第四行
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
return num;

}


原创粉丝点击