关于51单片机控制12864显示温度的程序

关于51单片机控制12864显示温度的程序,第1张

第一,判断你的液晶是字符型还是点阵型

第二,如果是字符型的话,不能显示你就要找你驱动的问题

第三,如果是点阵型的话,那么你要进行一个字模转换,这样才能显示。你看看你的液晶的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液晶屏的简单程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10130715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存