第一,判断你的液晶是字符型还是点阵型
第二,如果是字符型的话,不能显示你就要找你驱动的问题
第三,如果是点阵型的话,那么你要进行一个字模转换,这样才能显示。你看看你的液晶的datasheet。
路要一步一步的走,对于你提的这个问题,可以分为几个步骤:1对独立按键、矩阵键盘原理的了解,再通过编写程序验证。2读懂12864时序图,自己编写12864驱动。3进一步编写12864驱动,使其能显示汉字、图像等。4将程序整合,程序模块化。如果你能够抛开程序参考,对着数据手册独立的完成这些功能,你的能力将会提高很多。单片机、传感器神马的这些东西说道底就是看数据手册、配置寄存器、看时序图等,最后验证。再往上走就是研究算法了一步一个脚印
#include <reg52h>
#include <intrinsh>
#define uint unsigned int
#define uchar unsigned char
#define Nop() _nop_()
/引脚端口定义/
sbit LCD12864_RS_PORT = P1^7; /LCD12864引脚定义/
sbit LCD12864_RW_PORT = P1^6;
sbit LCD12864_E_PORT = P2^3;
#define LCD12864_DA_PORT P0
sbit led_en_port = P2^5; /发光二极管寄存器LE引脚/
sbit sled_en_port = P3^6; /数码管寄存器LE引脚/
uchar hanzi_buff1[]={" 液晶显示 "};
//////////////////以下是LCD12864驱动程序////////////////
void LCD12864_WaitIdle()
//LCD12864 忙 信号检测
{
LCD12864_DA_PORT = 0xff;
LCD12864_RS_PORT = 0;
LCD12864_RW_PORT = 1;
LCD12864_E_PORT = 1;
while((LCD12864_DA_PORT&0x80)==1); /等待BF 不为1/
LCD12864_E_PORT = 0;
}
void LCD12864_COM_Write( uchar com_da)
/ 检测忙信号写入命令字
com_da 为待写入的命令字/
{
LCD12864_WaitIdle();
LCD12864_RS_PORT = 0;
LCD12864_RW_PORT = 0;
LCD12864_DA_PORT = com_da;
LCD12864_E_PORT = 1;
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
LCD12864_E_PORT = 0;
}
void LCD12864_NoWaitIdle_COM_Write(uchar com_da)
/ 不检测忙信号写入命令字
com_da 为待写入的命令字/
{
LCD12864_RS_PORT = 0;
LCD12864_RW_PORT = 0;
LCD12864_DA_PORT = com_da;
LCD12864_E_PORT = 1;
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
LCD12864_E_PORT = 0;
}
void LCD12864_Data_Write(uchar da)
/ 数据写入
da 为待写入的8位数据/
{
LCD12864_WaitIdle(); /检测忙信号/
LCD12864_RS_PORT = 1;
LCD12864_RW_PORT = 0;
LCD12864_DA_PORT = da;
LCD12864_E_PORT = 1;
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
LCD12864_E_PORT = 0;
}
void lcd_delay_ms(uchar x)
{
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
void LCD12864_Reset()
/LCD12864初始化/
{
lcd_delay_ms(100); /适当延时待LCD自动复位完成/
LCD12864_NoWaitIdle_COM_Write(0x30); /使用8位并口通讯/
lcd_delay_ms(10);
LCD12864_NoWaitIdle_COM_Write(0x30); /使用8位并口通讯/
lcd_delay_ms(10);
LCD12864_NoWaitIdle_COM_Write(0x0c); /显示开及光标设置/
lcd_delay_ms(10);
LCD12864_NoWaitIdle_COM_Write(0x01); /显示清屏/
lcd_delay_ms(30);
LCD12864_NoWaitIdle_COM_Write(0x06); /DDRAM的地址计数器(AC)加1/
lcd_delay_ms(30);
}
void LCD12864_HANZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL)
//ST7920 汉字字符写入
//参数说明: xpos 待写入的X位置
//ypos 待写入的Y位置
//daH 待写入的汉字的高八位 daL待写入的汉字的低八位
{
uchar xy_pos;
if((xpos>=8)||(ypos>=4) ) return; /X位置超出显示范围退出/
if(ypos==0) xy_pos = 0x80 + xpos;
else if(ypos==1) xy_pos = 0x90 + xpos; /计算转换地址/
else if(ypos==2) xy_pos = 0x88 + xpos;
else if(ypos==3) xy_pos = 0x98 + xpos;
LCD12864_COM_Write(xy_pos); /写地址/
lcd_delay_ms(1);
LCD12864_Data_Write(daH); /写高八位数据/
lcd_delay_ms(1);
LCD12864_Data_Write(daL); /写低八位数据/
lcd_delay_ms(1);
}
//////////////////以上是LCD12864驱动程序////////////////
void main()
{
uchar i;
LCD12864_Reset(); /LCD初始化/
LCD12864_DA_PORT = 0xff; /释放P0端口/
led_en_port = 0;/关闭发光二极管显示/
sled_en_port = 0;/关闭数码管显示/
while(1)
{
for (i=0;i<6;i++)
LCD12864_HANZI_WRITE(i,0,hanzi_buff1[i2],hanzi_buff1[i2+1]);
}
}
不知道你cmd2,cmd3函数内部怎么实现的,就给个函数名和形参怎么判断函数的功能?
要知道,告诉函数+形参相当于什么都没说
我通过参数和注释大概猜想一下吧
前面的X便宜4位加上Y,目的应该是将俩个参数放到一块内存里面方便调用
调用的时候(假设内存是a)
a>>4为x的值,a只去俩位为y的值,我猜想
第二个函数无符号字符减去32,32刚好是大写字母和小写字母的差值(比如,A的ASCII值为97,a的ASCII值为65,刚好差32),应该目的是为了大写字母转换为小写字母,或者就是按你注释上面说的字符表刚好与ASCII每位差32,0xc0是16进制,具体怎么用得看函数体。
我遇到了这个问题刚解决,在绘图前将12864清屏
void LCD_clean()
{ uchar i=0,j=0;
write_LCD_command(0x34);
write_LCD_command(0x36);
for(i=0;i<32;i++)
for(j=0;j<32;j++)
{
write_LCD_command(0x80+i);
write_LCD_command(0x80+j);
write_LCD_data(0x00);
write_LCD_data(0x00);
}
}
以上就是关于关于51单片机控制12864显示温度的程序全部的内容,包括:关于51单片机控制12864显示温度的程序、求写stc89c52迷你单片机12864代码程序、求个51单片机控制KNY12864M液晶屏的简单程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)