12864LCD动态显示

12864LCD动态显示
12864LCD动态显示

/*------------------------------------------------------------------------------

PC2 PC3 PC4 PC5 PC6 PC7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7

RS R/W E PSB NC RST DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7

RS高电平写数据,低电平写指令代码.R/W高电平为读,低电平为写

E为使能信号,PSB高电平为并行模式,低电平为串行模式,RST低电平有效

显示地址:80H,81H,......86H,87H.第一行显示地址

90H,91H,......96H,97H.第二行显示地址

88H,89H,......8EH,8FH.第二行显示地址

98H,99H,......9EH,9FH.第三行显示地址

写指令01H:显示清屏,写指令02H: 位址归位,写指令0CH:开显示(无游标,不反白)

写指令30H:基本指令集,写指令80H:设置DDRAM,写指令10H:显示HCGROM

------------------------------------------------------------------------------*/

#include

#include

#define RS_H DDRC |= (1<<2);PORTC |= (1<<2); //RS设为高电平

#define RS_L DDRC |= (1<<2);PORTC &= ~(1<<2); //RS设为低电平

#define RW_H DDRC |= (1<<3);PORTC |= (1<<3); //RW设为高电平

#define RW_L DDRC |= (1<<3);PORTC &= ~(1<<3); //RW设为低电平

#define E_H DDRC |= (1<<4);PORTC |= (1<<4); //E设为高电平

#define E_L DDRC |= (1<<4);PORTC &= ~(1<<4); //E设为低电平

#define RST_H DDRC |= (1<<7);PORTC |= (1<<7); //RST为高电平

unsigned char MainMenu0[] = {"第二课堂胜风电子"};

unsigned char MainMenu1[] = {"数据为:"};

unsigned char Shuzi[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'};

/***********************函数功能:LCD延时子程序入口参数:t********************/ void delay(unsigned int t)

{ unsigned int i,j;

for(i=0;i

for(j=0;j<10;j++);

}

/***********************函数功能:端口初始化***********************************/ void PORT_init()

{ PORTA = 0xFF;

DDRA = 0xFF;

PORTC = 0xCE;

DDRC = 0xCE;

}

/**********************函数功能:LCD测试忙程序*********************************/

/**********************RS=L,RW=H,EN=高脉冲,读取忙碌标志

DB7(BF)*****************/

unsigned char check_busy()

{ unsigned char BF; //忙标志BF

DDRA = 0X00; //端口A设为输入方式

PORTA = 0XFF;

delay(1);

RS_L; //RS=0(命令)

delay(1);

RW_H;

delay(1);

E_H; //EN=1,使能

delay(1);

BF = PINA; //读取A口数据

delay(1);

E_L; //EN=0

delay(1);

DDRA = 0XFF; //端口A设为输出方式

BF &= 0x80; //读取lcd_data第八位

return (BF); //读取结果返回

}

/***********************函数功能:写指令数据到lcd子程序入口参数:cmd**********/ /***********************RS=L,RW=L,EN=高脉冲,DB0-DB7=指令码******************/

void lcdwc(unsigned char cmd)

{ while(check_busy()); //判断LCD是否为忙状态

RS_L; //RS=0(指令),RW=0(写)

RW_L;

PORTA = cmd; //向LCD发送指令

E_H; //EN=1,使能

delay(5);

E_L; //EN=0

}

/***********************函数功能:写入显示数据到lcd子程序入口参数:data*******/ /***********************RS=H,RW=L,EN=高脉冲,DB0-DB7=数据********************/

void lcdwd(unsigned char Data)

{ while(check_busy()); //判断LCD是否为忙状态

RS_H; //RS=1(数据),RW=0(写)

RW_L;

PORTA = Data; //向LCD写数据

E_H; //EN=1,使能

delay(5);

E_L; //EN=0

}

/***********************函数功能:lcd初始化子程序******************************/ void lcd_init()

{ delay(5);

lcdwc(0x30); //功能设置8位数据,基本指令

delay(5);

lcdwc(0x0C); //显示状态ON,游标OFF,反白OFF

delay(5);

lcdwc(0x01); //清除显示,并且设定地址指针为00H

delay(5);

lcdwc(0x02); //地址归位

delay(5);

lcdwc(0x80); //设置DDRAM地址

}

/**********************函数功能:LCD显示子程序*********************************/

/**********************入口参数:y是所选择的行号,p为写入的字符串**************/ void Char_Set_XY(unsigned char y, unsigned char *p)

{

if(y == 0)

{

lcdwc((0x80));

}

if(y == 1)

{

lcdwc((0x90));

}

if(y == 2)

{

lcdwc((0x88));

}

if(y == 3)

{

lcdwc((0x98));

}

while(*p != 0) //没写完就继续写

{

lcdwd(*p++);

}

}

/**********************函数功能:LCD浮点数显示*********************************/

/**********************入口参数:M为显示的数据,add为从哪里开始显示数据********/ void display_f(float M,unsigned char add)

{ unsigned char ledbuf[7]={0,0,0,0,0,0,0};

unsigned char i,j,k;

unsigned long m;

if(M>0) //正实数处理

{ ledbuf[0] = 12;

m = M;

if(M<10000) {m = 10*M;}

if(M<1000) {m = 100*M;}

if(M<100) {m = 1000*M;}

if(M<10) {m = 10000*M;}

}

if(M<0) //负实数处理

{ ledbuf[0] = 11;

m = -1*M;

if(M>-10000) {m = -10*M;}

if(M>-1000) {m = -100*M;}

if(M>-100) {m = -1000*M;}

if(M>-10) {m = -10000*M;}

}

ledbuf[1]=m/10000; //万位

ledbuf[2]=m%10000/1000; //千位

ledbuf[3]=m%1000/100; //百位

ledbuf[4]=m%1000%100/10; //十位

ledbuf[5]=m%1000%100%10; //个位

ledbuf[6]=10; //小数点

if(M>=0) //+号处理

{ if(M<10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10;}

if(M<1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10;}

if(M<100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10;}

if(M<10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10;}

}

if(M<0) //-号处理

{ if(M>-10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10; }

if(M>-1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10; }

if(M>-100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10; }

if(M>-10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10; }

}

lcdwc(add);

for(k=0;k<7;k++)

{ i = ledbuf[k];

j = Shuzi[i];

lcdwd(j);

}

}

/***********************函数功能:主函数***************************************/ void main(void)

{ float i = 168.88;

PORT_init(); //端口初始化

lcd_init(); //初始化LCD屏

RST_H;

Char_Set_XY(0,MainMenu0); //第一行显示

Char_Set_XY(1,MainMenu1); ////第二行显示

while(1)

{ //delay(1000);

display_f(i,0x94);

delay(100);

//i += 0.02;

//delay(1000);

}

}

由LCD12864初探嵌入式菜单设计(完全资料)

由LCD12864初探嵌入式系统设计 --菜单设计 声明:本文来自互联网,由于年代久远未能找到出处,现整理如下希望大家喜欢,如有侵权请联系 真的好想你QQ: 1320249827 前言往往要解释写文章的动机和原因,同时给作者一个正题以外灌水的机会——本文也不例外。 1、为什么我要写这篇文章。 不可否认,我的确受到了Armok 的利诱影响,但是最近发生的一些事情却使我觉得写这篇文章是非常有必要的。在OurA VR 上看到很多版本的LCD 驱动程序,几乎每一个版本都只是简单的将全部或部分的显示数据Cover 到LCD 的显存上,完成一个字或者是图片的显示就等着大家喊“牛”了。其实要走的路还很远。对一个工程项目来说,增加n 多的成本来提供一个点阵屏作为用户接口,不是一两幅欢迎图片和Now Loading...Please Standy By 的提示能糊弄的过去的。用户希望你提供的是友好的图形界面GUI ,虽然比不过XP 和Apple 的华丽,但是由各种基本图形组成的窗口界面还是需要的。 当我们真的想实现一个图形界面的时候,很快就会发现,我们需要的不仅仅是一个被喊了“牛”的初级驱动,我们需要的是一个图形引擎——一个自定义的图形函数包,没有DirectX 的华丽,但是能绘制一个任意的直线或是矩形就够了——结果往往发现无所适从。这个时候,我们遇到的就是一个门槛,真正的嵌入式工程师和一个业余电子爱好者之间的门槛。 2、我如何写这篇文章 考虑到本人老王卖瓜的习惯,所以请大家一定无比在吃饭前看本人写的技术文章,同时保持耐心等待续集(绝对有续集)。本人现单身,个人问题众多,学习任务重,所以可能有时候写文章象羊拉屎,不对大家 胃口,请见谅。 硬件平台:A VR Mega8级 LCD : 不带字库的12864 软件平台:ICC 规范: 符合基本的C 编程规范 3、何时开始正文 其实,本文应该算是计算机图形学的一个具体分支,所以,计算机图形学的基本要求就是本文的基本要求,考虑到各位兄弟的胃口,我就多罗嗦下。 h t t p :// h i .b a i d u .c o m /b a l l 648500361

玩转12864液晶(1)--显示字符

在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108 T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C) 关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。 我们先来了解一下它的并行连接情况。 下面是电路连接图

从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W 是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。 通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。 看看并行模式下的写时序图:

根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。 读时序图如下: 根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。 下面让我们根据这些编写出它的驱动程序吧。 我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C 实际显示效果图片如下: 程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。[p][/p] #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P1^0 ;

LCD12864图形液晶并口显示

LCD12864图形液晶并口显示 【教学引入】 液晶屏,在生活中很常见,我们常见的液晶显示器,如电脑的显示器,电视机,手机等等。 液晶屏在生活中已得到了普遍应用,它显示个各种各样的画面。 【教学目标】 1、掌握LCD12864液晶屏的用法; 2、编写LCD12864液晶屏的指令代码; 【知识目标】 1、掌握LCD12864液晶屏的用法; 2、掌握LCD12864液晶屏指令代码; 【教学准备】 电脑、Proteus、Keil 【教学方法】 教法:讲授法、讨论法 学法:练习法、探究法 【教学课时】 四课时 【教学过程】 一、12864液晶介绍 (1)12864是128*64点阵液晶模块的点阵数简称,业界约定俗成的简称。12864点阵的屏显成本相对较低,适用于各类仪器,小型设备的显示领域。12864M汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。

12864引脚说明 查阅“12864M.PDF”12864M液晶显示模块技术手册——四、用户指令集 1、指令表1:(RE=0:基本指令表),如下图,讲解了12864的基本指令集和扩充指令集。

当模块在接受指令前,微处理器必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0。“RE”为基本指令集与扩充指令集的选择控制位元,往后的指令集将维持在最后的状态。 当选择G=0 :绘图显示OFF,汉字显示的时,12864屏只能显示8X4=32个汉字,下面是汉字显示的坐标

二、12864液晶屏驱动电路 AT89C52的P0口连接12864的并行数据口,RP1为P0口的上拉排阻。 三、52代码编写 (1)打开keil uVision4,建立一个新的工程,工程名为"12864 graphic LCD parallel display",保存类型*.uvproj,单片机型号AT89C52。在工程中添加12864 graphic LCD parallel display.c文件,如下图

12864显示图形

看到工具箱旁边那个LCD12864很久没用了(当初买回来用的时候只是简单地测试了一下),于是萌生了重新写一次接口程序的想法(而且这次要给它加个图片显示的功能),好,说做就做,就用Atmega16和ICCAVR来做吧,最近这MCU和平台用得比较熟练。 马上从书堆里把当初打印出来的中文datasheet给翻了出来,依葫芦画瓢地写了个初始化程序。好,OK。编译通过。于是又写了一个可以自定义从XY坐标值开始输出显示的函数,再次编译,也通过,OK。于是呼马上写了四行简单的字符烧到单片机上试了一下,嘿嘿,一次通过。如下图: 后来在进一步测试的时候也出了点小问题。就是我是使用USBISP烧写器把程序烧写进AVR的(此时实验板由USBISP烧写器供电),想要实现从第一行的第一个字符开始连续显示"0123456789"。刚烧写完程序后能看到LCD12864上正常显示"0123456789",但是把烧写器从实验板上断开连接,单独用USB给实验板供电的时候,LCD的第一行只是显示"123456789",第一个字符消失了……,左思右想地弄了一个多小时后,终于把问题给解决了,就是把初始化程序的延时适当增加了些,真是奇怪。刚开始一直想不通为什么在烧写器供电的情况下就正常显示,而换到USB供电后就出了问题。后来再想想,估计是跟供电有关。在使用USBISP烧写器供电的时候,LCD的背光灯明显比用USB供电的时候来得亮,而且对比度也高很多,看来是因为换到USB供电后,供电不怎么充足,以至于LCD在上电初始化的时候花上了更多的时间去初始化(因为供电低了,功率小了,跑起来有点力不从心,用的时间就久了嘛……我是觉得可以这样去理解的 接下来呢,就到了有点难度的画图了。当初刚买到12864的时候只是简单测试了字符显示功能,除了因为画图还不需要用到,另外一个原因就是那datasheet上关于画图那部分的内容不怎么看得懂…。现在重新拿起来看,依然一头雾水……。马上上网百度了一下“12864 7920 显示图片”,看到了不少的例子程序,可是……就是没看到有关于这部分功能实现的详细思路和讲解……下载下来的那些程序,基本上没注释,不是说晦涩难懂,但是至少看起来一团糟,让人家不想继续看下去……于是还是硬着头皮去啃那datasheet。上面对于画图这部分的内容是这样讲解的:

12864并行多级菜单程序

#include "includes.h" u8 key=0,hua; extern u32 Second; extern u32 minite,hour,day,k,month,year,shan; u8 xingqi[]={"一二三四五六日"}; u8 ModeFlag=0,wei=0;//液晶界面选择 int main(void) { u8 PasswordIndex=0;//密码数组索引 u8 Password[4]={" "};//存储密码数组 BSP_Init();//初始化外部资源 ModeFlag=0; while(1) { //////////////////////////////////////// 界面一////////////////////////////////// if(ModeFlag==0) { LCD12864_Waddr(1,3); LCD12864_WPoss(0,"WELCOME!"); LCD12864_Waddr(2,2); LCD12864_WPoss(0,"--欢迎使用--"); Delay_1ms(8000); LCD12864_Clear(); } //////////////////////////////////////// 界面二////////////////////////////////// // ModeFlag=0; ///// 改 while(ModeFlag==0) //进入登录界面 { LCD12864_Waddr(1,1); LCD12864_WPoss(0,"请输入登陆密码:"); LCD12864_Waddr(2,3); //LCD12864_WPoss(0," "); LCD12864_Waddr(3,1); LCD12864_WPoss(0,"密码为四位数字"); LCD12864_Waddr(4,1); LCD12864_WPoss(0,"删除*");

在12864显示任意图片及参考程序

用12864显示单色图片 首先介绍本12864液晶显示器: 型号:QC12864B 因为单片机读取的是数据,而不是直接的图片。得将图片进行取模,图片应该是单色图片,像素128*64。 下面我为大家介绍个实例。 ①、在电脑附件画图,首先设置属性

开始画图 保存文件,注意格式: ②、然后进行取模。

③、编程: #include #define uchar unsigned char #define uint unsigned int //宏定义 #define lcd P2 //数据端口 sbit rs=P1^2; //指令/数据选择信号 sbit rw=P1^1; //读写选择信号 sbit e=P1^0; //使能端 sbit psb=P1^3; //串并选择端,高电平为并行,低电平为串行 uchar code ai[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xCE,0x00,0x00,0x00,0x00,0x00,0x01,0xC1,0xE0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x03,0x31,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x0E,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0x9B,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0x82,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x00, 0x00,0x00,0x00,0xF8,0xEF,0x00,0x00,0x00,0x00,0x00,0x1B,0xFC,0x1E,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0xFE,0x00,0x00,0x00,0x00,0x00,0x1E,0x60,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x20,0x00,0x00,0x00,

AT89s52LCD12864多页菜单按键选择操作

AT89s52-LCD12864多页菜单按键选择操 作 这篇程序的代码还未理解清楚,再一次深刻发现自 己的算法水平不行。今天学到的东西还行,就是那些C 文件的一些知识。反正都是些优化的东西,以后肯定也 用的着,过几天有兴趣的话,再去学习一下AVR单片机。 程序代码:硬件上与前面一样,有点变化就是多了 两个翻页的按键。到现在一整天的饭都还没吃,该去吃了,干这个果然不会困。 #include #include sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; sbit PSB= P2^1; //串并口选择端并高串低

#define DataPort P0 sbit KEY_ADD=P3^3; //按键 sbit KEY_DEC=P3^4; unsigned char curr,currold;//全局变量,当前箭头位置 unsigned char code user16x16[]={ //箭头图片 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00 ,0x3E,0x00,0x3F,0x00,0x3F,0x80, 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00 ,0x38,0x00,0x30,0x00,0x20,0x00, }; unsigned char code *MainMenu[]= { {" 1.设置1"}, {" 2.设置2"}, {" 3.设置3"}, {" 4.设置4"}, {" 5.设置5"}, {" 6.设置6"}, {" 7.设置7"}, {" 8.设置8"}, {" 9.设置9"},

函数信号发生器的设计(12864实现动态波形显示)

课程设计(论文)任务书 电气与电子工程学院系自动化专业13—2 班级 一、课程设计(论文)题目简易信号发生器的设计 二、课程设计(论文)工作自2016 年 1 月 5 日起至2016 年 1 月 14 日止。 三、课程设计(论文)的内容要求: 课程设计不仅仅要求学生完成所规定的题目要求,同时还要培养学生良好的科学态度和严谨的设计习惯。课程设计报告要求内容如下: (1)设计思想和设计说明 (2)硬件原理框图 (3)硬件原理图与软件配合介绍 (4)程序存储器和数据存储器的单元分配(5) 程序流程图 (6)系统功能描述 (7) 设计调试过程总结 (8) 附录里面包括:芯片资料、源程序清单和符合制图规范的硬件原理图的图纸。 设计要求内容: 用D/A实现正弦信号,三角波信号,方波信号的输出,并且在LCD上显示出当前波形。要求输出信号的频率和幅度可调。 设计内容:

(1)满足设计要求内容。 (2)扩展锯齿波波形输出。 (3)汉字显示当前波形形状与当前频率的大小 学生签名 年月日课程设计(论文)评审意见 (1)题目复杂程度:复杂()、较复杂()、一般()、简单() (2)总体方案的选择是否正确:正确()、较正确()、欠正确()、不正确() (3) 系统能否满足任务要求:满足()、较满足()、欠满足()、不满足() (4) 元器件选择是否合理:合理()、较合理()、欠合理()、不太合理() (5) 学习实践态度:好()、较好()、一般()、不太好() (6) 独立工作能力:强()、较强()、一般()、较差() (7) 回答问题是否正确:正确()、较正确()、基本正确()、大多不正确() (8) 图表是否符合标准:符合()、较符合()、基本符合()、大多不符合() (9) 撰写是否规范整洁:规范整洁()、较规范()、欠规范()、不太规范() 总评成绩:优()、良()、中()、及格()、不及格() 评阅人职称副教授 2016 年 1 月日

最完整的12864测试程序

以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD 驱动电压,应用时在VEE 与V0之间加一20K 可调电阻。 4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 5 R/W 读\写选择:高电平:读数据;低电平:写数据。 6 E 读写使能,高电平有效,下降沿锁定数据。 7 DB0 数据输入输出。 8 DB1 9 DB2 10 DB3 11 DB4 12 DB5 13 DB6 14 DB7 15 CS1 片选择信号,低电平时选择前64列。 16 CS2 片选择信号,低电平时选择后64列。 17 RET 复位信号,低电平有效。 18 VOUT LCD 驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。

以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD驱动电压,应用时在VEE与V0之间加一20K可调电阻。4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 5 R/W

读\写选择:高电平:读数据;低电平:写数据。6 E 读写使能,高电平有效,下降沿锁定数据。7 DB0 数据输入输出。 8 DB1 9 DB2 10 DB3 11 DB4 12 DB5 13 DB6 14 DB7 15 CS1 片选择信号,低电平时选择前64列。 16 CS2 片选择信号,低电平时选择后64列。 17 RET 复位信号,低电平有效。 18 VOUT LCD驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端口设置 */ sbit SCK=P3^6; //DS1302时钟 sbit SDA=P3^4; //DS1302 IO sbit RST = P3^5; // DS1302复位 bit ReadRTC_Flag; //读DS1302全局变量 /* 12864端口定义*/ #define LCD_data P0 //带字库液晶12864数据口 sbit LCD_RS = P2^4; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^1; //并口控制 sbit RES=P2^3; uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字 uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年 09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日

基于12864的菜单设计

编写者:董新凯2011.7.20 仅供交流 #include /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ #include "init.h" #define UINT8 unsigned char #define UINT16 unsigned int #define D_RS PTCD_PTCD4 #define D_RW PTFD_PTFD4 #define D_E PTCD_PTCD0 #define D_L PTCD_PTCD1 //左右半屏选择 #define D_R PTCD_PTCD2 #define D_REST PTFD_PTFD5 //复位选择 #define LED1 PTCD_PTCD5 #define LED2 PTCD_PTCD6 #define LED3 PTCD_PTCD7 #define LED4 PTFD_PTFD6 #define LED5 PTFD_PTFD3 /******************菜单填充**************/ # define FillType_Fill 0x01 //填充黑色 # define FillType_Clear 0x00 //填充白色 const UINT8 zimo[][32]= { /*-- 文字: 菜0 --*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ { 0x04,0x04,0x44,0xC4,0x4F,0x44,0x44,0xC4,0x24,0x24,0x2F,0xB4,0x24,0x04,0x04,0x00, 0x40,0x44,0x24,0x24,0x15,0x0C,0x04,0xFE,0x04,0x0C,0x15,0x24,0x24,0x44,0x40,0x00, }, /*-- 文字: 单 1 --*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ { 0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xF8,0x00,0x00,0x00, 0x10,0x10,0x13,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x00, }, /*-- 文字: 一2--*/

单片机12864动态波形显示

/****************************************************************************** * * 描述: * * 12864标准字库液晶演示数据p0,控制p2 * ******************************************************************************* */ #include #include #include #define uchar unsigned char #define uint unsigned int /************* 12864LCD引脚定义*************/ #define LCD_data P0 //数据口 sbit LCD_RS = P2^6; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^7; //液晶使能控制 sbit LCD_PSB = P3^2; //串/并方式控制 sbit LCD_RST = P3^7; //液晶复位端口 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; /*********************************************************/ uchar code DIS1[] = {"Vpp:"}; uchar code DIS2[] = {"F:"}; uchar DIS3[] = {"5V"}; uchar DIS4[] = {"12Hz"}; uchar D1[]={"0123456789"}; /*********************************************************/ //正弦波代码 uchar code tab[]={ 126,100,80,70,65,62,65,70,80,100,126,152,172,182,187,190,187,182,172,152 }; //背景图片 uchar code Photo1[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,

12864显示程序,51单片机,C语言

12864显示程序,51单片机,C语言 可显示固定中文,字符,数字; 可实时动态刷新显示数字,字符; #include sbit rs=P1^2; sbit rw=P1^1; sbit cs=P1^0; sbit psb=P1^3; unsigned char code table[]={" X0: Y0: "}; unsigned char code table1[]={"现在X1: Y1: "}; unsigned char code table2[]={"划线模式:"}; unsigned char code table3[]={"开始暂停"}; void delay(unsigned char z) //延时 { unsigned i,j; for(i=0;i

cs=0; P2=com; delay(5); cs=1; delay(5); cs=0; } void write_date(unsigned char dat) //写数据 { rs=1; rw=0; cs=0; P2=dat; delay(5); cs=1; delay(5); cs=0; } void pos(unsigned char x,unsigned char y) //起点函数{ unsigned char pos;

if(x==0) x=0x80; else if(x==1) x=0x90; else if(x==2) x=0x88; else if(x==3) x=0x98; pos=x+y/2; write_com(pos); } void init() { unsigned char i; psb=1; //1并行,0串行 write_com(0x30); //基本指令操作 delay(5); write_com(0x0c); //显示开,关光标 delay(5); write_com(0x01); //清除led的显示内容delay(5); pos(0,0);

单片机LCD12864显示系统课程设计

目录 一、概述 (2) 二、系统总体方案及硬件设计 (2) 系统框图 (3) 单片机最小系统 (4) 显示电路 (6) 按键控制电路 (6) ] 三、系统软件设计 (9) 软件设计概述 (9) 汉字显示 (10) 上下移屏 (10) 左右移屏 (11) 四、课程设计体会 (13) 五、参考文献 (13) 六、附录 (14) … 总电路图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 总程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %

一、概述 / 随着社会的发展,趣来趣多的地方需要应用显示功能,各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD 的显示即可完成,根据程序的不同而产生不同不效果以满足各种不同需求。 本文围绕设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机AT89S51,采用的液晶显示控制器的芯片是SED1520,主要实现由按键控制的中文显示、图片显示、滚屏以及左右移动功能。同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程,并详细阐述了程序的各个模块。本系统是以单片机的C语言来进行软件设计,指令的执行速度快,可读性强。为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。使硬件在软件的控制下协调运作。其次阐述了部分程序的流程图和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。最后对我所开发的用单片机实现LCD液晶显示器控制原理的设计思想和软、硬件调试作了详细的论述。 二、系统总体方案及硬件设计 系统框图

一个简单的12864显示程序

#include #define uchar unsigned char #define uint unsigned int sbit rs = P1^0; //指令数据选择sbit rw = P1^1; //指令数据控制sbit e= P1^2; sbit d2=P1^4; void _nopc_(){} uchar table[]={ //显示内容 "爸爸妈妈你们好!" }; void delay_50us(uint temp)//延时函数{ uint i,j; for(i=temp;i>0;i--) for(j=50;j>0;j--) ; } void delay_50ms(uint temp)//延时函数{ uint i,j; for(i=temp;i>0;i--) for(j=50000;j>0;j--); } void write_date(uchar temp) //写数据{ rw=0; rs=1; e=1; _nopc_(); P2=temp; e=0; } void write_com(uchar temp) //写命令{ rw=0; rs=0; delay_50us(1); P2=temp; e=1; delay_50us(1); e=0; }

void init()//LCD初始化 { d2=1; delay_50ms(2); write_com(0x30); delay_50us(5); write_com(0x30); delay_50us(2); write_com(0x0f); delay_50us(5); write_com(0x01); delay_50ms(2); write_com(0x06); delay_50ms(10); } void display()//显示函数{ uchar i=0; write_com(0x80); delay_50us(2); for(i=0;i<16;i++) { write_date(table[i]); delay_50us(1); } } void main() { init(); while(1) { display(); while(1); } }

LCD12864菜单程序

一起来学LCD12864菜单程序(包含完整程序)一起来学LCD12864菜单程序(包含完整程序) /*------------------------------------------- 项目名:家电中央控制系统工程 程序名:显示MCU总体程序 编写人:杜洋 初写时间:2005年9月5日晚20时 程序功能:实现液晶、语音部分的人机对话和总线的通信 实现方法:用中断实现总线接收 CPU说明:89S5212MHZ晶振 接口说明:(详见初定义) 信息说明: 修改日志: NO.1- -------------------------------------------*/ ;----------------------------------------初定义 LCDDAT EQU P2 RS EQU P3.5 RW EQU P3.6 E EQU P3.7 REDLED EQU P3.4 BACKLED EQU P3.1 PLAY EQU P1.7 STOPIN EQU P3.0 LIN EQU P3.2 SPDAT EQU P1 XX2 EQU P0.0

LT_RAM EQU 30H LR_RAM EQU 40H SP_RAM EQU 20H DIS1_RAM EQU 50H DIS2_RAM EQU 70H DIS3_RAM EQU 60H DIS4_RAM EQU 80H RR1 EQU 26H RR3 EQU 21H RR4 EQU 22H T0_RAM EQU 23H QR3_RAM EQU 24H QR2_RAM EQU 25H LCDDISPLAY EQU 26H ;菜单显示移位寄存器 MENU_RAM EQU 27H ;菜单位置寄存器 ONOFFLCD EQU 28H ;-------------------------------------程序入口 ORG 0000H JMP LCD_START ORG 0003H

12864显示任意128 64像素图片

工具箱旁边那个LCD12864很久没用了(当初买回来用的时候只是简单地测试了一下),于是萌生了重新写一次接口程序的想法(而且这次要给它加个图片显示的功能),好,说做就做,就用Atmega16和ICCAVR来做吧,最近这MCU 和平台用得比较熟练。 马上从书堆里把当初打印出来的中文datasheet给翻了出来,依葫芦画瓢地写了个初始化程序。好,OK。编译通过。于是又写了一个可以自定义从XY坐标值开始输出显示的函数,再次编译,也通过,OK。于是呼马上写了四行简单的字符烧到单片机上试了一下,嘿嘿,一次通过。如下图: 后来在进一步测试的时候也出了点小问题。就是我是使用USBISP烧写器把程序烧写进AVR的(此时实验板由USBISP烧写器供电),想要实现从第一行的第一个字符开始连续显示"0123456789"。刚烧写完程序后能看到LCD12864上正常显示"0123456789",但是把烧写器从实验板上断开连接,单独用USB给实验板供电的时候,LCD的第一行只是显示"123456789",第一个字符消失 了……,左思右想地弄了一个多小时后,终于把问题给解决了,就是把初始化程序的延时适当增加了些,真是奇怪。刚开始一直想不通为什么在烧写器供电的情况下就正常显示,而换到USB供电后就出了问题。后来再想想,估计是跟供电有关。在使用USBISP烧写器供电的时候,LCD的背光灯明显比用USB供电的时候来得亮,而且对比度也高很多,看来是因为换到USB供电后,供电不怎么充足,以至于LCD在上电初始化的时候花上了更多的时间去初始化(因为供电低了,功率小了,跑起来有点力不从心,用的时间就久了嘛……我是觉得可以这样去理 解的) 接下来呢,就到了有点难度的画图了。当初刚买到12864的时候只是简单测试了字符显示功能,除了因为画图还不需要用到,另外一个原因就是那 datasheet上关于画图那部分的内容不怎么看得懂……。现在重新拿起来

12864程序

include #include void lcd_init(void); void clr_lcd(void); void send_com(unsigned char cmd); void send_data(unsigned char dat); void chek_busy(void); void set_xy(unsigned char xpos,unsigned char ypos); void print(unsigned char x,unsigned char y,char* str); void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k); unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎 #define DATA P2 #define CONTROL P0 #define E 7 //并行的使能信 号 sbit E = P0^7 #define RW 6 //并行的读写信 号 sbit RW = P0^6 #define RS 5 //并行的指令数据选择信号 sbit RS = P0^5 #define PSB 4 //并/串行接口选择 sbit PSB = P0^4 #define RST 3 //复位低电平有效 sbit RST = P0^3 #define SETB(x,y) (x|=(1<

LCD12864 多级菜单

首先定义一个菜单结构 typedef struct menu//定义一个菜单 { u8 range_from,range_to; //当前显示的项开始及结束序号 u8 itemCount;//项目总数 u8 selected;//当前选择项 u8 *menuItems[17];//菜单项目 struct menu **subMenus;//子菜单 struct menu *parent;//上级菜单,如果是顶级则为null void (**func)();//选择相应项按确定键后执行的函数 }Menu; Menu MainMenu = { //定义主菜单 0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项 { "设置1 \x10", "设置2 \x10", "输入指令发送", "查询\x10" } }; Menu searchMenu = {//查询菜单 0,3,6,0, { "记帐记录明细", "未采集记录数", "设备机号", "本机IP地址", "记录空间大小", "软件版本" } }; Menu *currentMenu;//当前的菜单 用于显示菜单项 void display(u8 line) //显示菜单项并设置选中的项反白{ int i; line = 3-(currentMenu->range_to-line); Lcd_Fill(0x00); for(i = 0;i<4;i++) {

Lcd_Disp(i+1,0,currentMenu->menuItems[i+currentMenu->range_from]); } highlight(0,line,8,255);//反白显示指定行 } void func(void) { printf("hello\r\n"); } 初始化菜单: void initMenu() { MainMenu.subMenus = malloc(sizeof(&MainMenu)*4); MainMenu.subMenus[0] = NULL;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数 MainMenu.subMenus[1] = NULL; MainMenu.subMenus[2] = NULL; MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单 MainMenu.func = malloc(sizeof(&func)*4); MainMenu.func[0] = NULL; MainMenu.func[1] = NULL; MainMenu.func[2] = &func;//当选择了并按了确定,会执行func函数 MainMenu.func[3] = NULL; MainMenu.parent = NULL;//表示是顶级菜单 searchMenu.subMenus = malloc(sizeof(&searchMenu)*6); searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL; searchMenu.func = malloc(sizeof(&printf)*6); searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL; searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项 currentMenu = &MainMenu; } main

相关文档
最新文档