1602是字符型的液晶,只能显示字符,想显示的话,还是用12864吧。
先把12864的底层驱动写好。你写一个显示的函数,函数的参数包括显示的横坐标、纵坐标、和一个指针(指向存储数据的首地址)。检测到按键时,更改指针的指向,就可以了。
标准的一般都是这个程序
#include <reg52h>
#include <mathh>
#define lcd_data P1
sbit cs1=P2^3;
sbit cs2=P2^4;
sbit di=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
void delay(int t)
{
int i,j,k;
for(i=0;i<t;i++)
{ for(j=0;j<255;j++)
k++;}
}
void write_com_l(unsigned int command)
{
cs1=1;
rw=0;
di=0;
lcd_data=command;
e=1;
e=0;
cs1=0;
}
void write_data_l(unsigned int data0)
{
cs1=1;
rw=0;
di=1;
lcd_data=data0;
e=1;
e=0;
cs1=0;
}
void write_com_r(unsigned int command)
{
cs2=1;
rw=0;
di=0;
lcd_data=command;
e=1;
e=0;
cs2=0;
}
void write_data_r(unsigned int data0)
{
cs2=1;
rw=0;
di=1;
lcd_data=data0;
e=1;
e=0;
cs2=0;
}
void disp0()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0xaa);
write_data_r(0xaa);
}
}
}
void disp1()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0x55);
write_data_r(0x55);
}
}
}
void disp2()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0x0f);
write_data_r(0x0f);
}
}
}
void disp3()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0xf0);
write_data_r(0xf0);
}
}
}
void init_lcd() //初始化LCD清屏
{
write_com_l(0x3e);
write_com_r(0x3e);
write_com_l(0x3f);
write_com_r(0x3f);
write_com_l(0xc0);
write_com_r(0xc0);
write_com_l(0xb8);
write_com_r(0xb8);
write_com_l(0x40);
write_com_r(0x40);
for(;1;)
{
disp0();
delay(0x0ff);
disp1();
delay(0x0ff);
disp2();
delay(0x0ff);
disp3();
delay(0x0ff);
}
}
void main()
{
IE=0x81;
init_lcd();
}
void innt0 () interrupt 0
{
do {}while(1);
}
1602液晶的程序我有,要做数字锁的话其实用到液晶也不多。
因为你显示密码是时候不应该都是现实吗?
你只需把键盘写入的数据存在一个数组中,然后跟密码数组对比就好了。
还有就是值得注意的是数据类型问题。
输入的键值看你处理的方式而定,密码存放的格式,还有输出显示的是ascll码。注意转换。
下面附带一段51的1602LCD的C程序,自己仔细琢磨。
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar table[16]="abcdefghijklmnyz";
uchar table1[16]="0123456789abcdef";
sbit lcden=P2^0;
sbit lcdrs=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{ wela=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{ wela=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void main()
{
init();
for(num=0;num<16;num++)
{
write_data(table[num]);
delay(20);
}
write_com(1);
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table1[num]);
delay(20);
}
while(1);
}
两种实现,一是用 framebuffer,二是开 X 服务。
相对来说,低性能的嵌入式用 framebuffer 更好。如果性能好可以用 X 服务实现图形显示。前者基于内核的显示驱动,后者看 X 服务的驱动了。
X 服务可以跑很多软件不需要重新开发,但 c/s 架构效率不是很好。
framebuffer 是软件直接 *** 作硬件的存储器,性能实现比较好。但很多功能都要自己写代码实现。
显示在 fb 里面我要是没记错,就是把解码成你的软件支持的格式,之后把这部分数据写入 fb 内存。
怎么弄就别找我了。建议看看相关的开发文章。
还有就是 QT 库本身就有直接 fb 输出的函数库,GTK 似乎也有,但目前好像还不是完全可用。用他们作为过渡函数库还不错的。但要注意他们的软件协议!
lcdMsg("电流",2,2);
void lcdMsg(unsigned char addr,unsigned char line,unsigned char row) //传送一个字符串
{
lcdDingwei(line,row);
while(addr>0)
{
lcdTransferData(addr,1);
addr++;
}
void lcdTransferData(char data1,bit DI) //传送数据或者命令,当DI=0,传送命令,当DI=1,传送数据
{
lcdBuzy();
RW=0;
RS=DI;
P0=data1;
EN=1;
EN=0;
}
void lcdBuzy()
{
P0=0xff;
RW=1;
RS=0;
EN=1;
while(P0&0x80);
EN=0;
}
void lcdDingwei(unsigned char line,unsigned char row) //定位在哪行哪列显示
{
unsigned int i;
switch(line)
{
case 1: i=0x80+row;break;
case 2: i=0x90+row;break;
case 3: i=0x88+row;break;
case 4: i=0x98+row;break;
default: i=0x80;break;
}
lcdTransferData(i,0);
}
以上就是关于我想问下,用键盘控制使LCD(1602)上显示不同的图形,C语言怎么编程全部的内容,包括:我想问下,用键盘控制使LCD(1602)上显示不同的图形,C语言怎么编程、求无字库12864液晶显示图像的51单片机程序,C语言版的、1602液晶显示屏显示程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)