图一是矩阵按键控制数码管,图二是LCD1206的显示,现在想在矩阵按键控制数码管的基础上改为矩阵按键控制液晶,怎样改代码
图一
12864LCD属于点阵图形液晶显示模块,不但能显示字符,还能显示汉字和图形,分带汉字库和不带那字库两种,价格也有差别。带汉字库的12864LCD使用起来非常方便,不需要编写复杂的汉字显示程序,只要按时序写入两个字节的汉字机内码,汉字就能显示出来了,驱动程序简单许多。本文例程就是基于带汉字库的12864液晶显示模块。DM12864M 汉字图形点阵液晶显示模块,可显示汉字及图形,内置 8192 个中文汉字(16X16 点阵)、128个字符 64X256 点阵显示 RAM。
对于如何将矩阵按键控制数码管的代码改为可以控制液晶屏幕,需要进行以下步骤:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define BAUDRATE 9600
#define FOSC 11059200L
void InitUart();
void SendByte(uchar dat);
uchar RcvByte();
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
uchar code duanma[17]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71,0x00}; //code 用于常量定义,存储在rom中的,用于存储程序的只读变量
void delay(uint time)
{
uint i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--);
}
void write_8bit_com(uchar com)
{
RS=0;
RW=0;
P1=com;
EN=1;
EN=0;
delay(1);
}
void write_8bit_dat(uchar dat)
{
RS=1;
RW=0;
P1=dat;
EN=1;
EN=0;
delay(1);
}
void InitLcd()
{
write_8bit_com(0x38); //开显示,设置16*2的显示格式,为5*7点阵
delay(10);
write_8bit_com(0x0c); //开显示,并且不显示光标
delay(10);
write_8bit_com(0x06); //设置输入方式,光标移动后自动加1
delay(10);
write_8bit_com(0x01); //清屏
delay(10);
}
void write_string(uchar x,uchar y,uchar *s)
{
uchar i=0;
if(x<16)
{
if(y) //y=1,显示第二行
write_8bit_com(0xc0+x);
else //y=0,显示第一行
write_8bit_com(0x80+x);
}
while(s[i]!='\0')
{
write_8bit_dat(s[i]);
i++;
}
}
void display_number(int num)
{
uchar i;
uchar wei[8]={0};
if(num<0)
{
write_8bit_dat('-');
num=-num;
}
for(i=0;i<8;i++)
{
wei[7-i] = num % 10;
num /= 10;
if(num == 0)
break;
}
for(;i<8;i++)
wei[7-i]=0;
for(i=0;i<8;i++)
{
if(wei[i]==0&&i<7) //添加空格,使数字对齐
write_8bit_dat(' ');
else
write_8bit_dat(wei[i]+'0');
}
write_8bit_dat(' ');
}
void main()
{
InitUart();
InitLcd();
while(1)
{
uchar c;
int num;
write_string(0,0,"Input a number:");
num=0;
while(1)
{
c=RcvByte();
if(c=='\r') //等待回车符,表示输入结束
break;
if('0'<=c&&c<='9') //只接受数字
{
num=num*10+(c-'0');
display_number(num);
}
}
write_string(0,1,"The number you input:");
display_number(num);
delay(1000);
write_8bit_com(0x01); //清屏
}
}
void InitUart()
{
SM0=0;
SM1=1;
TMOD|=0x20;
TH1=256-(FOSC/(12*32*BAUDRATE));
TR1=1;
REN=1;
EA=1;
ES=1;
TI=1;
}
void SendByte(uchar dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
uchar RcvByte()
{
uchar c;
while(!RI);
RI=0;
c=SBUF;
SendByte(c); //将接收到的字节回送给PC
return c;
}
void Uart() interrupt 4
{
if(RI)
RI=0;
if(TI)
TI=0;
}
void display_number(int num)
{
uchar i;
uchar wei[8]={0};
if(num<0)
{
write_8bit_dat('-');
num=-num;
}
for(i=0;i<8;i++)
{
wei[7-i] = num % 10;
num /= 10;
if(num == 0)
break;
}
for(;i<8;i++)
wei[7-i]=0;
for(i=0;i<8;i++)
{
write_8bit_dat(duanma[wei[i]]); //液晶屏使用数码管显示码表
}
write_8bit_dat(' ');
}
void main()
{
InitUart();
InitLcd();
while(1)
{
uchar c;
int num;
write_string(0,0,"Input a number:");
num=0;
while(1)
{
c=RcvByte();
if(c=='\r') //等待回车符,表示输入结束
break;
if('0'<=c&&c<='9') //只接受数字
{
num=num*10+(c-'0');
display_number(num);
}
}
write_string(0,1,"The number you input:");
display_number(num);
delay(1000);
write_8bit_com(0x01); //清屏
}
}
通过将数字和数码管的显示码表对应起来,就可以在液晶屏上显示数字了。以上两部分代码需要搭配使用,才能实现正确的功能。