LCD12864 串行方式-画sin,直线,显示图像

LCD12864 串行方式-画sin,直线,显示图像
LCD12864 串行方式-画sin,直线,显示图像

#include

#include

#include

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

#define uchar unsigned char

#define uint unsigned int

#define clear 0x01 //清屏

#define reset_DDRAM 0x02 //DDRAM地址归位

#define left_move 0x04 //游标左移

#define right_move 0x06 //游标右移

#define all_left_move 0x05 //画面整体左移

#define all_right_move 0x07 //画面整体右移

#define display_left_move 0x10 //显示游标左移

#define display_right_move 0x14 //显示游标右移

#define set_function1 0x30 //基本指令集动作

#define set_CGRAM 0x40 //设定CGRAM地址

#define set_DDRAM 0x80 //设定DDRAM地址

#define set_function2 0x34 //扩充指令集动作

#define fanbai 0x04 //反白第一行(扩充指令集)

#define set_GDRAM 0x80 //设定GDRAM地址(扩充指令集)

#define ON_G 0x36 //开绘图显示(扩充指令集)

#define set_function2 0x34 //关绘图显示(扩充指令集)

//端口定义

sbit LCD_CS=P3^5; //片选信号

sbit LCD_SID=P3^6; //串行数据线

sbit LCD_SCLK=P3^4; //串上时钟输入

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

//数组,字定义

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

uchar code a[]={"阿姆YOUNG"}; //定义要显示的字符串

uint x=0;

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

//图片取模

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

codeuchartu[]={

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,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x04,0x00,0x00,0x00, 0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xE0,0x00,0x07,0xFF,0x00,0x00,0x00, 0x05,0xC6,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xE0,0x01,0xFF,0xFF,0x80,0x00,0x00, 0x05,0x5E,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x3F,0xFF,0xFF,0x80,0x00,0x00, 0x07,0x7E,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00, 0x05,0xFE,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0x80,0x00, 0x05,0xFE,0x00,0x00,0x00,0x00,0x00,0x01,0xF1,0xFF,0xFF,0xFF,0xFF,0xCF,0xC0,0x00, 0x05,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xDF,0xE0,0x00, 0x07,0xF6,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00, 0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00, 0x04,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x3F,0xFF,0xFF,0xF0,0x00, 0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xBF,0xFE,0x07,0xFF,0xFF,0xF0,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0xFC,0x03,0xFF,0xFF,0xE0,0x00, 0x02,0x00,0x06,0x20,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x03,0xFF,0xFF,0xC0,0x00, 0x03,0xFC,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x03,0xFF,0xF8,0x00,0x00, 0x02,0xC8,0x0D,0x80,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x03,0xFF,0xE0,0x00,0x00, 0x02,0xC8,0x1D,0xC0,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x07,0xFF,0xC0,0x00,0x00, 0x02,0x4E,0x30,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x07,0xFF,0xC0,0x00,0x00, 0x0F,0xFE,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x0F,0xFF,0xC0,0x00,0x00, 0x06,0xC8,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x3F,0xFF,0x80,0x00,0x00, 0x06,0x58,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00, 0x07,0xFE,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0x80,0x00,0x00, 0x06,0x18,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0x00,0x00,0x00, 0x00,0x78,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00, 0x00,0x30,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x00,0x00, 0x00,0x00,0x1B,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF8,0x00,0x00,0x00, 0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xF0,0x00,0x00,0x00, 0x01,0x80,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x00,0x00,0x00, 0x01,0x80,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,0x00, 0x01,0x80,0x13,0x60,0x00,0x00,0x00,0x00,0x00,0x7F,0xFD,0xE0,0x00,0x00,0x00,0x00, 0x01,0x80,0xFF,0xC0,0x00,0x00,0x00,0x00,0x03,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00, 0x01,0x80,0xC3,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, 0x01,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, 0x01,0x80,0x03,0x00,0x00,0x60,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0C,0x7F,0xC0,0xF8,0x00,0x00,0x3F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0xFC,0x03,0xFC,0x00,0x00,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0xC2,0x03,0xFE,0x00,0x01,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0xC2,0x03,0xF7,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x05,0xC2,0x03,0xFB,0x00,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x05,0xC0,0x01,0xFD,0xC0,0x0F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x80,0x01,0xFC,0xE0,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x82,0x00,0xFC,0xE0,0x1F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x82,0x00,0xFE,0x70,0x0F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x82,0x00,0xFE,0x78,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x80,0x00,0x7E,0x38,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x00,0x00,0x7F,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x02,0x00,0x7F,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x06,0x08,0x3F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x06,0x00,0x3F,0x8F,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x06,0x00,0x3F,0x87,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x00,0x00,0x03,0x97,0xBF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x9F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x7F,0xFF,0xFD,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };

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

//延时函数

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

voidDelay_nms(uchar n)

{

uchar i;

uchar j;

for(i=0;i

for(j=0;j<125;j++) //大概1ms

_nop_();

}

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

//串行发送一个字节

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

voidLCD_sendbyte(uchar byte)

{

uchar i;

for(i=0;i<8;i++)

{

LCD_SCLK=0; //拉低时钟线

_nop_();

LCD_SID=(bit)(byte&0x80); //发送最高位数据

LCD_SCLK=1; //上升沿发送数据

byte=byte<<1; //左移一位

}

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

//写指令

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

voidLCD_write_com(uchar com)

{

LCD_CS=1;

LCD_sendbyte(0xf8); //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(0),0 LCD_sendbyte(0xf0&com); //取高四位,数据分两次传送,

//每个字节的内容被送入两个字节

//高四位放在第一个字节的高四位

LCD_sendbyte(0xf0&(com<<4)); //低四位放在第二个字节的高四位LCD_CS=0;

Delay_nms(10); //串行不支持读操作,不可检测忙操作,这里用延时替代

}

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

//写数据

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

voidLCD_write_dat(uchardat)

{

LCD_CS=1;

LCD_sendbyte(0xfa); //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(1),0 LCD_sendbyte(0xf0&dat); //取高四位,数据分两次传送,

//每个字节的内容被送入两个字节

//高四位放在第一个字节的高四位

LCD_sendbyte(0xf0&(dat<<4)); //低四位放在第二个字节

LCD_CS=0;

Delay_nms(10);

}

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

//LCD初始化

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

voidLCD_init(void)

{

LCD_write_com(0x30); //选择基本指令集

LCD_write_com(0x0c); //开显示,无游标,不反白

LCD_write_com(0x01); //清除显示屏幕,把DDRAM位址计数器调整为00H Delay_nms(5); //清屏操作时间较长1.6ms 因此加此延时

LCD_write_com(0x02); //清DDRAM位址归位,此处貌似与清屏重复

LCD_write_com(0x06); //设定光标右移,整体显示不移动

}

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

//显示字符串

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

void print(uchar *s)

{

while(*s!='\0')

{

LCD_write_dat(*s);

s++;

}

}

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

//设置显示地址

/***************************************************/ voidLCD_Setaddress(ucharx,uchar y)

{ //地址从第1行第1列开始不从0开始ucharaddr;

switch(x)

{

case 1: addr=0x80+y-1;

break;

case 2: addr=0x90+y-1;

break;

case 3: addr=0x88+y-1;

break;

case 4: addr=0x98+y-1;

break;

default : break;

}

LCD_write_com(addr); //字符显示开始地址

}

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

//让字符串显示在固定位置,设置(x,y)的位置,调用上面的函数/*****************************************************/ voidLCD_Putstring( uchar x, uchar y, uchar *pData )

{

LCD_Setaddress(x,y);

while( *pData != '\0' )

{

LCD_write_dat( *pData++ );

}

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

//打点绘图,适用于在屏幕上打稀疏的几个点,不能用于横行连续打点

voidLCD_draw_point(uchar x, uchar y)

{

ucharx_byte, x_bit; //在横坐标的哪一个字节,哪一个位

uchary_byte, y_bit; //在纵坐标的哪一个字节,哪一个位

x_byte=x /16; //算出它在哪一个字节(地址)

//注意一个地址是16位的

x_bit=x%16; //(取模)算出它在哪一个位

y_byte=y/32; //y是没在哪个字节这个说法

//这里只是确定它在上半屏(32行为一屏)还是下半屏

//0:上半屏1:下半屏

y_bit=y%32; //y_bit确定它是在第几行

LCD_write_com(0x34); //打开扩展指令集

LCD_write_com(0x80+y_bit); //垂直地址(上) 貌似与说明书正好相反

LCD_write_com(0x80+x_byte+8*y_byte); //先写水平坐标(下)貌似与说明书正好相反

//具体参照数据手册

//下半屏的水平坐标起始地址为0x88

//(+8*y_byte)就是用来确定在上半屏还是下半屏if(x_bit<8) //如果x_bit位数小于8

{

LCD_write_dat(0x01<<(7-x_bit)); //写高字节。因为坐标是从左向右的

//而GDRAM高位在左,低位在右LCD_write_dat(0x00); //低字节全部填0

}

else

{

LCD_write_dat(0x00); //高字节全部填0

LCD_write_dat(0x01<<(15-x_bit));

}

LCD_write_com(0x36); //打开绘图显示

LCD_write_com(0x30); //回到基本指令集

}

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

//打点绘图一次打水平一行可以避免断点现象

//x表示数组的首地址,y表示纵坐标的值,也即是表示第多少行

//即对一个数组中的数进行这样的处理:

//检测数组,并默认数组为一行数的记录即128字节,只要数组中有数等于y,就把第y行

的数全部打出

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

voidLCD_draw_word(uchar *x, uchar y)

{

uchari,j,k,m,n,count=0;

ucharhdat, ldat;

uchary_byte, y_bit; //在纵坐标的哪一个字节,哪一个位

uchar a[16];

LCD_write_com(0x34); //打开扩展指令集

y_byte=y/32; //y是没在哪个字节这个说法

y_bit=y%32; //y_bit确定它是在第几行

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

{

hdat=0, ldat=0; //此处清零是很必要的

n=j*16;

for(k=n;k

{

if(x[k]==y)

{

a[count]=k;

count++;

}

}

for(m=0;m

{

i=a[m]-n;

if(i<8) //如果x_bit位数小于8

hdat=hdat|(0x01<<(7-i)); //写高字节。因为坐标是从左向右的

else

ldat=ldat|(0x01<<(15-i));

}

LCD_write_com(0x80+y_bit); //垂直地址(上) 貌似与说明书正好相反LCD_write_com(0x80+j+8*y_byte); //水平坐标(下)貌似与说明书正好相反

LCD_write_dat(hdat);

LCD_write_dat(ldat);

}

LCD_write_com(0x36); //打开绘图显示

LCD_write_com(0x30); //回到基本指令集

}

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

//清图形程序

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

voidLCD_draw_clr(void)

{

uchari,j;

LCD_write_com(0x34); //8Bit扩充指令集,即使是36H也要写两次

LCD_write_com(0x36); //绘图ON,基本指令集里面36H不能开绘图

for(i=0;i<32;i++) //12864实际为256x32

{

LCD_write_com(0x80+i); //行位置貌似与说明书正好相反(上)

LCD_write_com(0x80); //列位置貌似与说明书正好相反(下)

for(j=0;j<32;j++) //256/8=32 byte

LCD_write_dat(0);

}

LCD_write_com(0x30); //开基本指令集

}

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

//显示图像

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

voidlcd_display( )

{

uchari,j,k;

LCD_write_com(0x34); //关绘图显示(扩充指令集)

LCD_write_com(0x04); //

LCD_write_com(0x36); //开绘图显示(扩充指令集)

for(i=0;i<2;i++) //分为上下两屏

{

for(j=0;j<32;j++) //为上两屏

{

LCD_write_com(0x80+j); //第一行开始

if(i==0)

{

LCD_write_com(0x80);

}

else

{

LCD_write_com(0x88); //如果i!=0,则说明为下屏幕,则从第三行开始

}

for(k=0;k<16;k++) //一个个显示图片,一个位置字符占两个地址

{

LCD_write_dat(tu[x]); //调用写命令,将数组写入

x++; //一个个加

}

}

}

LCD_write_com(0x30); //选择基本指令集

}

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

//清除图像

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

voidclear_lcd()

{

uinti,j;

LCD_write_com(0x34);

for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三十二次

{

LCD_write_com(0x80+i); //先写入纵坐标Y的值

LCD_write_com(0x80); //再写入横坐标X的值

for(j=0;j<32;j++) //横坐标有16位,每位写入两个字节的的数据,也就写入32次

{

LCD_write_dat(0x00); //因为当写入两个字节之后横坐标会自动加1,所以就不用再次写入地址了。

}

}

LCD_write_com(0x36);

LCD_write_com(0x30);

}

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

////显示cos图像

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

//void print_cos(void)

//{

// uchar i;

// ucharxdatay_cos[128]; //定义屏幕上要打的正弦波的纵坐标

// uchar code v[128]={32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,3 2,32,32,32,

//32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,3 2,32,32,32,32,32,32,32,32,32,

//32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,3 2,32,32,32,32,32,32,32,32,32,

//32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,};

// float y;

// for(i=0;i<128;i++)

// {

// y=15*cos(9*i)+0.5; //此处系数为31比较好

// y_cos[i]=32-y;

// }

// for(i=0;i<64;i++)

// LCD_draw_word(y_cos, i); //绘图一行一行绘

// LCD_draw_word(v, 32);

//

//}

/******************************************************/ //画x,y直线,主函数

/******************************************************/ void main()

{

float i;

//ucharx,y;

LCD_init(); //初始化程序

LCD_draw_clr();

LCD_write_com(0x34);

LCD_write_com(0x80);

LCD_write_com(0x88);

for(i=16;i>0;i--) //画出X轴

LCD_write_dat(0xff);

for(i=0;i<64;i++) //画出Y轴

LCD_draw_point(0,i);

// for(i=0;i<128;i++)

// {

// x=i;

// y=32-x%32;

// LCD_draw_point(x,y);

// }

LCD_write_com(0x36);

LCD_write_com(0x30); //清图形程序while(1)

{

// LCD_write_com(0x34);

// LCD_write_com(0x80);

// LCD_write_com(0x88);

// for(i=16;i>0;i--) //画出X轴

// LCD_write_dat(0xff);

// for(i=0;i<64;i++) //画出Y轴

// LCD_draw_point(0,i);

//// for(i=0;i<128;i++)

//// {

//// x=i;

//// y=32-x%32;

//// LCD_draw_point(x,y);

//// }

// LCD_write_com(0x36);

// LCD_write_com(0x30);

}

}

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

//用于观看显示效果

/******************************************************/ //void main(void)

//{

// LCD_init(); //初始化程序

// // LCD_Setaddress(1,1); //选择字符显示的位置

// //print("I LOVE YOU "); //字符输入

// // LCD_Putstring(4,4,a); //让字符串显示在固定位置// LCD_draw_clr(); //清图形程序

// print_cos();

// // lcd_cleardis; //清屏幕

// //Delay_nms(100); //延时程序

// //lcd_display(); //显示图

// while(1);

//}

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液晶显示图片原理(完整版)

51单片机综合学习 12864液晶原理分析1 辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理…… 芯片:YM12864R P-1 控制芯片:ST7920A带中文字库 初步小结: 1、控制芯片不同,寄存器定义会不同 2、显示方式有并行和串行,程序不同 3、含字库芯片显示字符时不必对字符取模了 4、对芯片的结构地址一定要理解清楚

5、显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚 6、显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚 7、显示汉字时的二级单元(一级为八位数据写入单元)要清楚 8、显示图片时的二级单元(一级为八位数据写入单元)要清楚 12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入

到相应的存储单元中。图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。

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液晶(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 ;

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

LCD12864汉字显示

//在12864液晶上显示汉字和英文字符 /***********************头文件*********************/ #include "regx52.h" typedef unsigned char uchar; typedef unsignedintuint; sbitlcdrs=P1^5; //12864:0写指令,1写数据 sbitlcdwr=P1^6; //12864读写信号 sbitlcden=P1^7; //12864片选信号 uchar code tab[]={" ATI-51S"}; uchari; /***********************1ms延时函数**********************/ void delay(uint z) { uint y; while(z--) { for(y=0;y<125;y++); } } /***********************LCD写指令写数据**********************/ voidwrite_comdata(uchara,uchardatas) { lcdrs=a; lcdwr=0; delay(1); P0=datas; lcden=1; delay(1); lcden=0; } /***********************光标位置*********************/ void cursor(uchar x, uchar y ) { uchar address; switch(x){ case 0: address=0x80+y;break; case 1: address=0x90+y;break;

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

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

在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,

LCD12864显示矩阵键盘输入的任意两位数

/********************************************************** 用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5 液晶上显示25。用矩阵按键0-9共10个按键。LCD12864用串行方式操作,如果用并行,请自行修改。 ***********************************************************/ #include <> #include <> #define uchar unsigned char #define uint unsigned int #define NOP _nop_(); sbit LCD_CS=P1^0; //片选,高电平有效(RS) sbit LCD_SID=P1^1; //串行数据输入端(R/W) sbit LCD_SCLK=P1^2; //串行同步时钟,上升沿读取SID数据(E) sbit LCD_PSB=P1^3; //并/串选择 H并行 L串行 sbit LCD_RST=P1^4; //复位,低电平有效 uchar keynum; uchar code dis1[]={"请输入任意两位数"}; uchar code dis2[16]={"09ABCDEF"}; uchar dis_buf[]={0,0}; uchar getkey(); void display(); void delay(uint x) { uchar i; while(x--) { for(i=0;i<110;i++); } } /*写指令程序,指令由3个字节组成,第一个为写指令*/ /*第二个为指令高4位,第三个为指令低4位*/ void send_cmd(uchar cmd_dat) { uchar i; uchar i_dat; i_dat=0xf8; LCD_CS=1; LCD_SCLK=0; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80);

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液晶屏驱动电路 原件名称所属类(Category) 所属子类(Sub-category) AT89C52 Microprocessor ICs 8051 Family POT-HG Resistors Variable RESPACK-8 Resistors Resistor Packs LCD12864A 自制- AT89C52的P0口连接12864的并行数据口,RP1为P0口的上拉排阻。 三、52代码编写 (1)打开keil uVision4,建立一个新的工程,工程名为"12864 graphic LCD parallel display",保存类型*.uvproj,单片机型号AT89C52。在工程中添加12864 graphic LCD parallel display.c文件,如下图

基于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液晶显示模块(中文资料)

FYD12864液晶中文显示模块

(一) (一)概述 (3) (二)(二)外形尺寸 1 方框图 (3) 2 外型尺寸图 (4) (三)(三)模块的接口 (4) (四)(四)硬件说明 (5) (五) 指令说明 (7) (五)(五)读写操作时序 (8) (六)(六)交流参数 (11) (七)(七)软件初始化过程 (12) (八)(八)应用举例 (13) (九)(九)附录 1半宽字符表 (20) 2 汉字字符表 (21) 一、概述 FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: ●●低电源电压(VDD:+3.0--+5.5V)

●●显示分辨率:128×64点 ●●内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) ●●内置 128个16×8点阵字符 ●●2MHZ时钟频率 ●●显示方式:STN、半透、正显 ●●驱动方式:1/32DUTY,1/5BIAS ●●视角方向:6点 ●●背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 ●●通讯方式:串行、并口可选 ●●内置DC-DC转换电路,无需外加负压 ●●无需片选信号,简化软件设计 ●●工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 二、方框图 3、外形尺寸图

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,

12864LCD显示倒计时程序

简介:第一行显示,距离系统爆炸时间 第二行显示,还剩 第三行显示,00时,00分,00秒 第四行显示,周林 按下旋钮开关,开始设定秒,秒编辑位闪动。左右旋转设定数值, 在按下开关,秒确定,设定分,分编辑位闪动左右调数值, 再按下,分确定,小时位闪动。左右转调小时,再按一下。时间确定,开始倒计时。到达定时时间后停止,并闪动。 #include #include /********************* 定义********************************/ #define LCD_data P0 //数据口 sbit LCD_RS = P2 ^ 0; //寄存器选择输入 sbit LCD_RW = P2 ^ 1; //液晶读/写控制 sbit LCD_EN = P2 ^ 2; //液晶使能控制 sbit LCD_PSB = P2 ^ 3; //串/并方式控制 sbit LCD_RST = P2 ^ 5; //液晶复位端口 sbit sset=P3^4;//设置按钮 sbit spk=P1^4; sbit sadd=P2^7; sbit sdel=P2^6;

signed char second=0,minute=0,hour=0,count=0,keycount=0; signed char key=0; unsigned char code DIS1[] = { "距离系统爆炸时间" }; unsigned char code DIS2[] = { "还剩:" }; unsigned char code DIS31[] = { "时" }; unsigned char code DIS32[] = { "分" }; unsigned char code DIS33[] = { "秒" };

LCD12864液晶的使用之字库型液晶(一)

LCD12864液晶的使用之字库型液晶(一) 2011年02月15日星期二 16:44 下面介绍下带字库的液晶,由于Proteus中没有,就以实物为准吧!我手头上这块液晶是QY128*64HZ1,它的驱动器是ST7920,想必大家很熟悉了,百度、谷歌一下它的芯片手册很多!在学习此块液晶之前,建议大家好好看看它的驱动芯片的手册!它的驱动和LCD1602很像,甚至,读忙、写指令和写数据函数都是一样的,就初始化不一样,因为指令系统不同嘛!下面是我手头字库液晶的实物图。 (手机拍的,图片质量差了些,大家见谅!)

字库型液晶显示可以分为串行方式和并行方式两种,通过引脚PSB进行选择,它只有一个驱动芯片,不像Proteus中无字库液晶有两个驱动芯片。显示是整体显示,而不是左右屏的显示!大家一定要注意! 1、控制口信号说明:

注:①忙标志Bust_flag=1说明LCD内部正忙,此时不能对LCD进行操作,忙标志的判断由DB7也就是数据口的最高位所决定!这和LCD1602一样! ②上面对RS和RW的操作需配合使能信号EN来操作!否则无效! 1、显示说明 (1)、字符产生ROM(CGROM) 里面提供了8192(213)个汉字GB2132宋体 (2)、显示数据RAM(DDRAM) 内部提供64*2位空间,最多可控制4行16字,也就是16个中文字型显示,当写入显示数据RAM时,可分别显示CGROM和CGRAM的字型,可以用来显示三种字型:半角英文数字型、CGRAM字型和CGROM的中文字型,三种字型的选择,由在DDRAM总写入的编码选择,在0000H—0006H的编码中(其代码分别为0000、0002、0004、0006共四个)将选择CGRAM的自定义字型,02H —7FH的编码中将显示半角英文数字型的字型(也就是ASCII码,大小为16*8),至于A1以上的编码将自动结合下一个位元组,组成两个位元组的编码,从而形成一个中文字型的编码,也就是说显示一个汉字要两个ASCII码显示的位置,即大小为16*16。BIG(A140—D75F),GB(A1A0—F7FF)。 (3)、字型产生RAM 上面已经介绍了该种液晶提供四组可定义显示,是16*16大小的自定义图像空间,通过在特定的编码位置,写入我们要显示的自定义图像即可,这个和 LCD1602液晶的自定义显示字符的原理是一样的!这个将在下文加以详细介绍

LCD12864(串口)显示程序

#ifndef jh_f330 #define jh_f330 #include #endif typedef unsigned char uint8; typedef unsigned int uint16; /*************端口配置**************/ sbit LCD_CS = P0^4; //片选信号,低电平有效 sbit LCD_RST = P0^3; //复位信号,低电平有效 sbit LCD_A0 = P0^2; //数据、指令选择,H:数据、L:指令 sbit LCD_DAT = P1^0; //串行输入数据引脚 sbit LCD_CLK = P1^1; //串行时钟输入引脚 uint8 code word1[]= { 0x04,0x44,0x84,0x04,0xE4,0x1F,0x84,0x44,0xA4,0x3F,0xA4,0xA4,0x64,0x06,0x04,0x00, 0x20,0x10,0x09,0x04,0xFF,0x04,0x04,0x14,0x26,0x05,0x84,0xFF,0x04,0x06,0x04,0x00 }; /**********预定义数据*********/ #define LCD_X 128-1 //屏幕的X轴的物理宽度 #define LCD_Y 64-1 //屏幕的Y轴的物理宽度 /***********LCD指令集***************/ //LCD开关命令 #define LCD_ON() Wr_Com(0xaf) #define LCD_OFF() Wr_Com(0xae) //设置显示起始行 #define LCD_START_LINE 0x40 //起始行地址为,0x40+(0-63)//页地址设置 #define LCD_Page 0xb0 //页地址为:0xb0+(0-8) //列地址设置 #define LCD_Ad_H 0x10 //列高四位地址:0x10+() #define LCD_Ad_L 0x00 //列低四位地址:0x00+() //行列地址方向设置 #define ADC_Norm() Wr_Com(0xa0); #define ADC_Reve() Wr_Com(0xa1); #define Com_Norm() Wr_Com(0xc0); #define Com_Reve() Wr_Com(0xc8);

相关文档
最新文档