当前位置:文档之家› 12864(并行方式)

12864(并行方式)

12864(并行方式)
12864(并行方式)

#include

#define uchar unsigned char

#define uint unsigned int

/****************端口定义***************/

#define LCD_data P2 //定义数据口

sbit LCD_RS=P0^0; //寄存器选择输入

sbit LCD_RW=P0^1; //液晶读写控制

sbit LCD_EN=P0^2; //液晶时能控制

sbit LCD_PSB=P0^3; //串/并方式控制

sbit key1=P1^0; //按键定义

sbit key2=P1^1;

sbit key3=P1^2;

/****************定义变量***************/

uchar speed=11;//即时速度

uchar key;

uchar keynum=0;//功能键按下次数

int qbwei,gshwei;

/****************液晶显示字符串定义***************/ uchar code dis1[]=" 液滴控制";

uchar code dis2[]="设定速度: 0000";

uchar code dis3[]="实时速度:";

uchar code dis4[]="向前进!向前进!";

uchar dis5[3];

/****************函数声明***************/

void lcd_init(); //LCD初始化

void lcdinit_display(); //LCD显示初始化

bit lcd_busy(); //遇忙检测

void write_cmd(uchar cmd); //写命令

void write_dat(uchar dat); //写数据

void lcd_pos(uchar X,uchar Y); //设置显示位置

void write_gshb(uchar add,uchar dat); //取位设置

void matrixkeyscan(); // 键盘扫描

void Moment_speed(uchar speed); // 实时速度

void lcd_display(); // LCD显示

void delay(uint n); // 延时

/****************主函数***************/

void main()

{

lcdinit_display();

while(1)

{

lcd_display();

Moment_speed(speed);

}

}

/************子程序************/

void delay(uint n)

{

uint i,j;

for(i=n;i>0;i--)

for(j=110;j>0;j--);

}

/***********************液晶子程序********************************************/ /*******************************************************************/

/* */

/*检查LCD忙状态*/

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/

/* */

/*******************************************************************/

bit lcd_busy()

{

bit result;

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delay(5);

result = (bit)(P0&0x80);

LCD_EN = 0;

return(result);

}

/*********写指令数据到LCD**********/

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码*/

void write_cmd(uchar cmd)

{

lcd_busy();

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

P2=cmd;

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

}

/**********写显示数据到LCD********/

/*RS=H,RW=L,E=高脉冲,D0-D7=数据.*/

void write_dat(uchar dat)

{

lcd_busy();

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P2=dat;

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

}

/***********设定显示位置****************/ void lcd_pos(uchar X,uchar Y)

{

uchar pos;

if(X==1)

{X=0x80;}

else if(X==2)

{

X=0x90;

}

else if(X==3)

{

X=0x88;

}

else if(X==4)

{

X=0x98;

}

pos=X+Y;

write_cmd(pos);//显示地址

}

/*LCD初始化设定*/

void lcd_init()

{

LCD_PSB=1; //并口方式

write_cmd(0x34); //扩充指令操作

delay(5);

write_cmd(0x30);//基本指令操作

delay(5);

write_cmd(0x0C);//显示开关光标

delay(5);

write_cmd(0x01);//清除LCD的显示内容

delay(5);

write_cmd(0x06);//清除LCD的显示内容

delay(5);

}

/*********初始化显示程序********************/ void lcdinit_display()

{

uchar i;

delay(5);

lcd_init();

lcd_pos(1,0);//设置显示位置为第一行的第一个字符

i=0;

while(dis1[i]!='\0')

{

write_dat(dis1[i]);

i++;

}

lcd_pos(2,0);//设置显示位置为第二行的第一个字符

i=0;

while(dis2[i]!='\0')

{

write_dat(dis2[i]);//显示字符

i++;

}

lcd_pos(3,0); //设置显示位置为第三行的第一个字符i=0;

while(dis3[i]!='\0')

{

write_dat(dis3[i]);//显示字符

i++;

}

lcd_pos(4,0); //设置显示位置为第四行的第一个字符i=0;

while(dis4[i]!='\0')

{

write_dat(dis4[i]);//显示字符

i++;

}

}

void write_gshb(uchar add,uchar dat)

{

uchar shi,ge;

shi=dat/10;

ge =dat%10;

write_cmd(0x90+add);

write_dat(0x30+shi);

write_dat(0x30+ge);

}

/*******************键盘扫描**************************/ void matrixkeyscan()

{

if(key1==0)

{

delay(10);

if(key1==0)

key=1;

while(!key1);

}

if(key2==0)

{

delay(10);

if(key2==0)

key=2;

while(!key2);

}

if (key3==0)

{

delay(10);

if(key3==0)

key=3;

while(!key3);

}

}

/********实时速度显示程序********/

void Moment_speed(uchar speed)

{

uchar i,j;

dis5[0]=speed/100+0x30;

dis5[1]=speed/10%10+0x30;

dis5[2]=speed%10+0x30;

for(i=0,j=5;i<3;i++,j++)

{

lcd_pos(3,j);

write_dat(dis5[i]);

delay(5);

}

}

/****显示子程序************/

void lcd_display()

{

matrixkeyscan();

if(key==1) //功能键按下

{

key=0;

keynum++;

switch(keynum)

{

case 1:lcd_pos(2,5);

write_cmd(0x0f);

break;

case 2:lcd_pos(2,6);

break;

case 3: keynum=0;

write_cmd(0x0c);

break;

}

}

if(keynum!=0) //只有key1键按下时,才检测键key2,key3 {

if(key==2) //加调节数值

{

key=0;

switch(keynum)

{

case 1: qbwei++;

if(qbwei==10)

qbwei=0;

write_gshb(5,qbwei);

lcd_pos(2,5);

break;

case 2: gshwei++;

if(gshwei==99)

gshwei=0;

write_gshb(6,gshwei);

lcd_pos(2,6);

break;

}

}

}

if(key==3)// 减调节数值

{

key=0;

switch(keynum)

{

case 1: qbwei--;

if(qbwei==-1)

qbwei=9;

write_gshb(5,qbwei);

lcd_pos(2,5);

break;

case 2: gshwei--;

if(gshwei==-1)

gshwei=99;

write_gshb(6,gshwei);

lcd_pos(2,6);

break;

}

}

}

LCD12864显示程序

本例程为通过用A T89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include #include"12864.c" void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。 /********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ //#include #define uchar unsigned char #define uint unsigned int #define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3; /********************************************* 延时子程序 *********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

带字库12864液晶详解

12864液晶 一、概述 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: l 低电源电压(VDD:+3.0--+5.5V) l 显示分辨率:128×64点 l 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) l 内置 128个16×8点阵字符 l 2MHZ时钟频率 l 显示方式:STN、半透、正显 l 驱动方式:1/32DUTY,1/5BIAS l 视角方向:6点 l 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 l 通讯方式:串行、并口可选 l 内置DC-DC转换电路,无需外加负压 l 无需片选信号,简化软件设计 l 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 模块接口说明

*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口 管脚号管脚名称电平管脚功能描述 1 VSS 0V 电源地 2 VCC 3.0+5V 电源正 3 V0 - 对比度(亮度)调整 RS=“H”,表示DB7——DB0为显示数据 4 RS(CS)H/L RS=“L”,表示DB7——DB0为显示指令数据 R/W=“H”,E=“H”,数据被读到DB7——DB0 5 R/W(SID) H/L R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR 6 E(SCLK) H/L 使能信号 7 DB0 H/L 三态数据线 8 DB1 H/L 三态数据线 9 DB2 H/L 三态数据线 10 DB3 H/L 三态数据线 11 DB4 H/L 三态数据线 12 DB5 H/L 三态数据线 13 DB6 H/L 三态数据线 14 DB7 H/L 三态数据线 15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1) 16 NC - 空脚 17 /RESET H/L 复位端,低电平有效(见注释2) 18 VOUT - LCD驱动电压输出端 19 A VDD 背光源正端(+5V)(见注释3) 20 K VSS 背光源负端(见注释3)

LCD12864显示程序

;实验目的:熟悉12864LCD的使用 ;12864LCD带中文字库 ;编程让12864LCD显示公司名称“深圳乾龙盛电子”,公司电话“0975”,公司传真“6”;硬件设置: ;关断所有拨码开关。 #include<> ;__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_H S_OSC ;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define RS PORTA,5 ;命令/数据选择 #DEFINE RW PORTA,4 ;读/写选择 #DEFINE E PORTA,3 ;使能信号 #DEFINE PSB PORTA,2 ;并口/串口选择(H/L) #DEFINE RST PORTA,0 ;复位信号 ;----------------------------------------------- LCD_X EQU 30H ;页地址 LCD_Y EQU 31H ;Y地址 COUNT EQU 32H ;循环计数用 COUNT1 EQU 33H ;循环计数用 COUNT2 EQU 34H ;循环计数用 POINT EQU 35H ;查表偏移地址 POINT1 EQU 36H ;查表偏移地址 POINT2 EQU 37H ;查表偏移地址 TEMP EQU 38H ;临时寄存器 TEMP1 EQU 39H ;临时寄存器 ;----------------------------------------------- ORG 0000H ;复位地址 NOP ;ICD需要的空指令 GOTO MAIN ;跳转到主程序 ;**********************主程序************************ MAIN BANKSEL TRISA CLRF TRISA ;A口输出 CLRF TRISD ;D口输出 BANKSEL ADCON1 MOVLW 06H MOVWF ADCON1 ;A口全为数字口 CLRF STATUS

玩转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写字符串程序及其头文件

/****************************** 2012年5月19日 调试成功 编辑环境:ICCAVR 功能:用LCD12864显示汉字 ********************************/ #include #include #include"LCD_12864.c" /************************************** 端口初始化 **************************************/ void port_init() { DDRA=0XFF; PORTA=0XFF; DDRC=0XFF; PORTC=0XFF; } /****************************************** 主函数 *******************************************/ void main() { uchar i; port_init(); delay(100);// port_init();// LCD_init(); write_string(0,0,"zheng Zunggui"); delay(200); write_string(0,1,"I Love微电子!"); delay(200); write_string(0,2,"Working Hard !"); delay(200); //write_string(0,3,"I Love English!"); //write_string(0,3,"做电子设计大赛!");//包含了汉字字符串中有汉字输入方式/************************************** 此为单独操作汉字字符的方法 ****************************************/ LocateXY(1,3);//单独写汉字时,要一个字节一个字节写入,分开地址不重合 //先高字节后低字节与ASCCII不冲突 write_data(0xD5);// D5C5 D4F6 B9F0

LCD12864绘图之KS0108(3)

12864(KS0108)之绘图篇(三) 常用几何图形绘制函数 收集整理:杨正富(KL YZX-JDBDZZY-YZF) //画水平线: x0、x1为起始点和终点的水平坐标,y为垂直坐标 void draw_Hline(uchar x0,uchar x1,uchar y,uchar color) { uchar bak; //数据互换的中间变量, if(x0>x1){bak=x1;x1=x0;x0=bak;} //若x0>X1, 交换数据,使x1为大值 do { draw_point(x0,y,color); //从左到右逐点显示 x0++; //x0自加1 } while(x1>=x0); //直到x0=x1为止 } //画竖直线函数: x为起始点和终点的水平坐标,y0、y1为垂直坐标 void draw_Vline(uchar x,uchar y0,uchar y1,uchar color) { uchar bak; //数据互换的中间变量 if(y0>y1){bak=y1;y1=y0;y0=bak;} //若y0>y1, 交换数据,使y1为大值 do { draw_point(x,y0,color); //从上到下逐点显示 y0++; //y0自加1 } while(y1>=y0); //直到y0=y1为止 } //任意两点间画直线:x0、y0为起始点坐标,x1、y1为终点坐标 void draw_Rline(uchar x0,uchar y0,uchar x1,uchar y1,uchar color) { int dx; //直线x轴差值变量 int dy; //直线y轴差值变量 char dx_sym; //x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym; //y轴增长方向,为-1时减值方向,为1时增值方向int dx_x2; //dx*2值变量,用于加快运算速度 int dy_x2; //dy*2值变量,用于加快运算速度 int di; //决策变量 /****************************画垂直线******************************/ if(x0==x1) //如果水平坐标相等,则为垂直线 { if(y0>y1) //若起点大于终点 {dx=y0;y0=y1;y1=dx;} //交换数据(即交换起点) for(dx=y0;dx

LCD显示程序

本例程为通过用AT89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include #include"12864.c" void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。 /********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ //#include #define uchar unsigned char #define uint unsigned int #define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3; /********************************************* 延时子程序 *********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

12864画点教程

基于ST7920控制的12864液晶用于字符显示很方便的,但网友说用它显示图形并不合适,原因就是它绘图时先要关闭显示,绘完后又要打开,速度会较慢。我没有用过别的液晶,手中只有这一款,摆弄了几天,掌握了一点东西,写出来共享。 首先,我们知道,图形都是由像素点组成的,绘图的基础其实就是画点。只要我们能点亮液晶的任意一个像素点,那么绘图就不是什么难事了。万丈高楼平地起嘛,先要做的,当然是要打好基础。 ST7920提供了用于绘图的GDRAM(graph display RAM)。共64×32个字节的空间(由扩充指令设定绘图 R AM 地址),最多可以控制256×64点阵的二维绘图缓冲空间。在它的Datasheet给出了GDRAM的坐标地址对照表: (原文件名:图片1.png) 引用图片

(这个就是坐标图,有的分上下两个平屏0-31和0-31) 用坐标表示,就是这样: (原文件名:图片2.png) 引用图片 它的横坐标每一个地址都是16 位的。共16个地址,256位。 很明显,它能控制256*64像素的液晶屏,而我们的只是128*64像素液晶屏,显然只用到它的一部分。 我刚开始以为它对应屏幕的绘图RAM是这样分布的(如红色部分): (原文件名:图片3.png) 引用图片 结果栽了大根头,后来终于弄明白,原来它对应屏幕的GDRAM是这样分布的:汗,发了一半不小心提交了,继续

(原文件名:图片4.png) 引用图片 只要我们清楚了它的GDRAM和屏幕上像素点的映射(对应)关系,点亮对应的像素点就容易多了。要点亮某一个像素点,就是将这个像素点在GDRAM中对应的位置1,这个相信没人会不知道吧? 我们先讨论一下思路,再一步步写代码。我觉得,思路要比代码重要的多,只要你的思路通了,正确了,那么写出代码肯定会很容易。 首先,给你x,y的坐标,要你点亮一个点,要怎么做呢?从上面的图我们知道,它是分为两个半屏的,首先,我们要确定这个点是在上半屏还是下半屏,然后确定它是在那一行(纵坐标Y),再确定它是在哪一个字节的哪一个位(也就是确定它在那一列,即横坐标X)。这些都确定后我们就定位到某一个具体的位上了,只就将这个位置1,就OK了。 下面我们边写代码边讨论。 因为这里仅仅是讨论如何在12864上打点的,而不是给12864写一个驱动,所以对于基本的数据读写函数,我们不做讨论,这里假设已经有了如下基本函数: void lcd_write_cmd(unsigned char); //lcd 命令写 void lcd_write_data(unsigned char); //lcd 数据写 unsigend char lcd_read_data(void); //lcd 数据读 好了,就这些了。 为了方便,我们定义如下宏: #define BASIC_SET 0x00 //基本指令集,后面的数字查数据手册,下同。0x30 #define EXTEND_SET 0x00 //扩展指令集 0x34 #define DRAW_ON 0x00 //绘图显示开 0x36 #define DRAW_OFF 0x00 //绘图显示关0x34 我们现在开始写点亮某一个点的函数: void lcd_set_dot(unsigned char x, unsigned char y) {

12864串行显示中文讲解

12864串行显示中文,按键选择显示页面,并且可调数值。 单片机P1口接矩阵按键,其它接口按程序中定义去接 只需要接12864LCD上GND VCC RS RW E PSB RST A K 程序如下 /********************************12864.h头文件*******************************/ #ifndef _12864_h #define _12864_h /*****包含头文件**************/ #include /********定义I/0口**********/ #define GPIO_KEY P1 sbit LCD12864_SCLK = P2^7; //E sbit LCD12864_SID = P2^5; //RW sbit LCD12864_CS = P2^6; //RS sbit LCD12864_RET= P2^0; sbit LCD12864_PSB =P2^2; /*声明全局变量*/ extern unsigned char keyvalue; /******声明全局函数*********/ void Delay1ms(unsigned int); //声明延时函数 unsigned char KeyDown(void); void LCD_sendbyte(unsigned char); void WrCom(unsigned char); void WrDat(unsigned char); void LcdInit(void); //void Print(unsigned char); void SetAddress( unsigned char,unsigned char ); void DisplayString(unsigned char x ,unsigned char y,unsigned char *add); #endif /********************************12864.C*************************************/ #include"12864.h" #include #include"string.h" //#define LCM_ST7920_FIRST_LINE_ADDRESS 0x80 //#define LCM_ST7920_SECOND_LINE_ADDRESS 0x90 //#define LCM_ST7920_THIRD_LINE_ADDRESS 0x88 //#define LCM_ST7920_FOURTH_LINE_ADDRESS 0x98

LCD12864绘图之KS0108(5)

LCD12864绘图之KS0108(5) Ampire 12864显示指针时钟 贵州省凯里市第一中等职业技术学校 机电部电子应用专业高级教师杨正富仿真局部大图: 仿真全图:

/*************************************************************************************** 说明:1、程序共分六部分。一个主C程序,五个头文件程序。 2、构成:A T89C52 + DS1302 + DS18B20 + Ampire128x64 + Speaker 3、显示:日期,星期,时间,气温 4、调整:设置三个按键,用于调节日期,星期,时间。 5、程序不够完善,请有志者自行修改补充。 ***************************************************************************************/ ////////////////////////////////////////////////////////////// 1 //////////////////////////////////////////////////////////////////////////////// //C程序:负责调用与整合其他程序模块功能 #include"Hzimo.h" //字模头文件 #include"DS1302.h" //时钟读写头文件 #include"DS18B20.h" //温度传感器操作头文件 #include"KS0108.h" //液晶显示操作头文件 #include"keyscan.h" //键盘调整操作头文件 void pointer_Update() //指针的绘制与擦除(等比分点) { uchar S,M,H; //定义秒分时寄存变量,用于时间判断 if(S!=DT[0]) //秒时间跳变 { CLKpointer_show(31,31,S,25,0); //秒针线擦除 S=DT[0]; //指向下一次的时间 } CLKpointer_show(31,31,S,25,1); if(M!=DT[1]) //分时间跳变 { CLKpointer_show(31,31,M,20,0); //分针线擦除 M=DT[1]; //指向下一次的时间 } CLKpointer_show(31,31,M,20,1); if(DT[2]<12) DT[2]=DT[2]*5+DT[1]/12; //用于计算时针的终点坐标 else {DT[2]=DT[2]-12;DT[2]=DT[2]*5+DT[1]/12;} if(H!=DT[2]) //时间是否跳变 { CLKpointer_show(31,31,H,15,0); //时针线擦除 H=DT[2]; //指向下一次的时间 } CLKpointer_show(31,31,H,15,1);

基于STM32--LCD12864驱动程序

基于STM32--LCD12864驱动程序

STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼ 标签:杂谈 #ifndef LCD12864_H #define LCD12864_H #define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口 #define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口 #define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用 #define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13 #define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14 #define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15 #define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟

#define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟 #define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平 #define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平 #define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平 #define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平 #define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平 #define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平

LCD12864原理与应用(源程序+原理图+proteus仿真)

LCD12864原理与应用 1、LCD12864简介: LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。 下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。 与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。此液晶有8页,一页有8行点阵点,左右各64列,共128列。如下图所示:

2、LCD12864中的几条重要指令 (一)行(line)设置命令: 由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。(二)页(page)设置指令: 起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。 (三)列(column)地址设置指令 每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。 (四)读状态指令

3、用LCD12864显示汉字(一) 由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址https://www.doczj.com/doc/e312081214.html,/),LCD1602显示自定义字符的时候也是用它。在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在https://www.doczj.com/doc/e312081214.html,/下载到关于字模提取原理文档) 字体选择默认的“宋体,常规,小四号”,小四号为16*16大小,如下图所示:

串行LCM12864驱动程序收藏

串行LCM12864驱动程序收藏.txt为什么我们在讲故事的时候总要加上从前?开了一夏的花,终落得粉身碎骨,却还笑着说意义。串行LCM12864驱动程序收藏 //头文件 #include #include //引脚定义 sbit SID = P2^1; //数据 sbit SCLK = P2^2; //时钟 //函数声明 void lcm_w_word(unsigned char *str) ; //写字符例:lcm_w_word("您好!"); void lcm_w_test(bit start, unsigned char ddata); //(0,指令)(1,数据) void lcm_w_byte(unsigned char bbyte); //写一个字节给lcm void delaynms(unsigned int di); //延时 void lcm_init(void); //lcm初始化 void lcm_clr(void); //清屏 //初始化LCM void lcm_init(void) { delaynms(10); //启动等待,等LCM讲入工作状态 lcm_w_test(0,0x30); //8 位介面,基本指令集 lcm_w_test(0,0x0c); //显示打开,光标关,反白关 lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零 } //写指令或数据(0,指令)(1,数据) void lcm_w_test(bit start, unsigned char ddata) { unsigned char start_data,Hdata,Ldata; if(start==0) start_data=0xf8; //0:写指令 else start_data=0xfa; //1:写数据 Hdata=ddata&0xf0; //取高四位

点阵屏上绘图——基于LCD12864控制详解

点阵屏上绘图——基于LCD12864 控制详解 2009年04月10日星期五 20:02 —前言— 前言往往要解释写文章的动机和原因,同时给作者一个正题以外灌水的机会——本文也不例外。 1、为什么我要写这篇文章。 不可否认,我的确受到了Armok的利诱影响,但是最近发生的一些事情却使我觉得写这篇文章是非常有必要的。在OurAVR上看到很多版本的LCD驱动程序,几乎每一个版本都只是简单的将全部或部分的显示数据Cover到LCD的显存上,完成一个字或者是图片的显示就等着大家喊“牛”了。其实要走的路还很远。对一个工程项目来说,增加n多的成本来提供一个点阵屏作为用户接口,不是一两幅欢迎图片和Now Loading...Please Standy By的提示能糊弄的过去的。用户希望你提供的是友好的图形界面GUI,虽然比不过XP和Apple的华丽,但是由各种基本图形组成的窗口界面还是需要的。 当我们真的想实现一个图形界面的时候,很快就会发现,我们需要的不仅仅是一个被喊了“牛”的初级驱动,我们需要的是一个图形引擎——一个自定义的图形函数包,没有DirectX的华丽,但是能绘制一个任意的直线或是矩形就够了——结果往往发现无所适从。这个时候,我们遇到的就是一个门槛,真正的嵌入式工程师和一个业余电子爱好者之间的门槛。 2、我如何写这篇文章 考虑到本人老王卖瓜的习惯,所以请大家一定无比在吃饭前看本人写的技术文章,同时保持耐心等待续集(绝对有续集)。本人现单身,个人问题众多,学习任务重,所以可能有时候写文章象羊拉屎,不对大家胃口,请见谅。 硬件平台:AVR Mega8级 LCD:不带字库的12864 软件平台:ICC 规范:符合基本的C编程规范

12864液晶显示程序(图案+文字)

#include sbit LCD12864_RS = P2^0; //RS控制引脚 sbit LCD12864_RW = P2^1; //RW控制引脚 sbit LCD12864_EN = P2^2; //EN控制引脚 sbit LCD12864_PSB = P2^3; //模式选择引脚,ST7920控制器,1为8位并行接口,0为串行接口 #define LCDPORT P0//数据引脚 void LCD12864_Init(void); //LCD12864初始化函数 void LCD12864_WriteInfomation(unsigned char ucData,bit bComOrData); //向LCD12864写入数据,bComOrData为1时写入的是数据,0时写入的是命令 void LCD12864_CheckBusy(void);//忙检测函数 void LCD12864_DisplayImage(unsigned char code *ucImage); void Delay(unsigned int uiCount); unsigned char code ucPic1[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0xFB,0x63,0x07,0x34,0x00,0x14,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,

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。上面对于画图这部分的内容是这样讲解的:

相关主题
文本预览
相关文档 最新文档