当前位置:文档之家› 12864A液晶驱动16_16汉字+8_16数字字母

12864A液晶驱动16_16汉字+8_16数字字母

12864A液晶驱动16_16汉字+8_16数字字母
12864A液晶驱动16_16汉字+8_16数字字母

//适用于12864A无字库液晶(左右屏幕)

#include

#include

#define uchar unsigned char

#define uint unsigned int

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

sbit cs1=P2^1;

sbit cs2=P2^2;

sbit d_i=P2^0;

sbit enb=P2^4;

sbit r_w=P2^3;

sbit rst=P2^5;

sbit key=P3^7;

sbit busy_bit=P2^7;

sbit rst_bit=P2^4;

//SMG12864A产品引脚说明及演示连线

//PIN1: VSS [电源地]

//PIN2: VDD [电源正极]

//PIN3: Vo [LCD偏压输入]

//PIN4: d_i [数据/命令选择端1:数据0:命令] 接P2^0

//PIN5: r_w [读写信号选择端1:读操作0:写操作] 接P2^3

//PIN6: enb [使能信号输入高有效] 接P2^4

//PIN7: DB0 [Data I/O] 接P1^0

//PIN8: DB1 [Data I/O] 接P1^1

//PIN9: DB2 [Data I/O] 接P1^2

//PIN10:DB3 [Data I/O] 接P1^3

//PIN11:DB4 [Data I/O] 接P1^4

//PIN12:DB5 [Data I/O] 接P1^6

//PIN13:DB6 [Data I/O] 接P1^7

//PIN14:DB7 [Data I/O] 接P1^8

//PIN15:CS1 [片选1信号输入高有效] 接P2^1

//PIN16:CS2 [片选2信号输入高有效] 接P2^2

//PIN17:RST [复位信号输入(H:正常工作,L:复位)] 接P2^5

//PIN18:VEE [LCD驱动负压输出(-5V)]

//PIN19:BLA [背光源正极]

//PIN20:BLK [背光源负极]

uint code table1[]={0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf};//页选项(共8页)

uint code table2[]={0x40,0x50,0x60,0x70};//中文列选项(半屏各4个字,四个字的Y地址首列)uint code table3[]={0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78};//中文列选项(半屏各8个字母,八个字母的Y地址首列)

void init();//初始化函数

void write_com1(unsigned char d);//左半屏的写命令程序

void write_data1(unsigned char d);//左半屏的写数据程序

void write_com2(unsigned char d);//右半屏的写命令程序

void write_data2(unsigned char d); //右半屏的写数据程序

void write_ch_add1(uint z);//写汉字的页地址(上半个汉字的地址)(共四行八列32个汉字,1-32编号)

void write_ch_add2(uint z);//写汉字的页地址(下半个汉字的地址)(共四行八列32个汉字,1-32编号)

void write_ch(uint add,uchar z[]);//在确定的位置写字库中的汉字

void write_en_add1(uint z);//写字母的页地址(上半个字母的地址)(共四行十六列64个字母,1-64编号)

void write_en_add2(uint z);//写字母的页地址(下半个字母的地址)(共四行十六列64个字母,1-64编号)

void write_en(uint add,uchar z[]);//在确定的位置写字库中的字母

uchar read1(void); //读左半屏图形数据子程序

uchar read2(void); //读右半屏图形数据子程序

uchar *read_ch(uint); //读在x位置上的汉字的字模(32个字节)

uchar *read_en(uint);//读在x位置上的字母的字模(16个字节)

void check_busy1(void);//控制器1忙检测子程序

void check_busy2(void);//控制器2忙检测子程序

void button(uint z);//开关显示数据改变件,z=1为开;z=0为关;

void clc(void); //清屏

void delay(uchar z);//延时程序

void test();//测试程序,屏幕中按顺序写0-9,a-z,A-Z //需要时调出

uint button_flag; // button_flag=0时,关闭写程程序,数据(关闭后注意要打开)

uchar read_zimo[32]; //read_zimo为液晶读回来的字模,需要定义为全局变量,注意:程序执行中,不能改变rom中的值,所以a不能定义为code

//主函数

void main()

{

uchar *zz;

init();

clc();

write_ch(1,xiao);

write_ch(2,feng);

write_en(5,en_ll);

write_en(6,en_o);

write_en(7,en_v);

write_en(8,en_e);

write_ch(5,xiao);

write_ch(6,mei);

while(1);

}

void init()

{

button_flag=1;

rst=0;

rst=1;

write_com1(0xc0);

write_com1(0x3f);

write_com2(0xc0);

write_com2(0x3f);

}

void write_com1(unsigned char d) {

check_busy1();

if(button_flag!=0)

{

P1=d;

d_i=0;

r_w=0;

cs1=1;

cs2=0;

enb=1;

enb=0;

cs1=0;

}

}

void write_data1(unsigned char d) {

check_busy1();

if(button_flag!=0)

{

P1=d;

d_i=1;

r_w=0;

cs1=1;

cs2=0;

enb=1;

enb=0;

cs1=0;

}

}

void write_com2(unsigned char d) {

check_busy2();

if(button_flag!=0)

{

P1=d;

d_i=0;

r_w=0;

cs1=0;

cs2=1;

enb=1;

enb=0;

cs2=0;

}

}

void write_data2(unsigned char d) {

check_busy2();

if(button_flag!=0)

{

P1=d;

d_i=1;

r_w=0;

cs2=1;

cs1=0;

enb=1;

enb=0;

cs2=0;

}

}

void clc(void)

{

uint i,j;

rst=0;

rst=1;

write_com1(0xc0);

write_com1(0x3f);

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

{

write_com1(table1[i]);

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

{

write_data1(0x00);

}

}

write_com2(0xc0);

write_com2(0x3f);

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

{

write_com2(table1[i]);

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

{

write_data2(0x00);

}

}

}

void write_ch_add1(uint z)

{

uint a;

a=z%8;

if(a==1||a==2||a==3||a==4)

{

write_com1(table1[(z/8)*2]); //写一个汉字上半部分的页地址

write_com1(table2[a-1]);//写一个汉字上半部分的Y起始地址}

else

{

if(z%8==0)

{

a=a+8;

write_com2(table1[((z/8)-1)*2]);

write_com2(table2[a-5]);

}

else

{

write_com2(table1[(z/8)*2]);

write_com2(table2[a-5]);

}

}

}

void write_ch_add2(uint z)

{

uint a;

a=z%8;

if(a==1||a==2||a==3||a==4)

{

write_com1(table1[(z/8)*2+1]);

write_com1(table2[a-1]);

}

else

{

if(z%8==0)

{

a=a+8;

write_com2(table1[((z/8)-1)*2+1]);

write_com2(table2[a-5]);

}

else

{

write_com2(table1[(z/8)*2+1]);

write_com2(table2[a-5]);

}

}

}

void write_ch(uint add,uchar z[])

{

uint i;

if((add%8)==1||(add%8)==2||(add%8)==3||(add%8)==4) {

write_ch_add1(add);

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

{

write_data1(z[i]);

}

write_ch_add2(add);

for(i=16;i<=31;i++)

{

write_data1(z[i]);

}

}

else

{

write_ch_add1(add);

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

{

write_data2(z[i]);

}

write_ch_add2(add);

for(i=16;i<=31;i++)

{

write_data2(z[i]);

}

}

}

void write_en_add1(uint z)

{

uint a;

a=z%16;

if(a==1||a==2||a==3||a==4||a==5||a==6||a==7||a==8)

{

write_com1(table1[(z/16)*2]); //写一个字母上半部分的页地址

write_com1(table3[a-1]);//写一个字母上半部分的Y起始地址}

else

{

if(z%16==0)

{

a=a+16;

write_com2(table1[((z/16)-1)*2]);

write_com2(table3[a-9]);

}

else

{

write_com2(table1[(z/16)*2]);

write_com2(table3[a-9]);

}

}

}

void write_en_add2(uint z)

{

uint a;

a=z%16;

if(a==1||a==2||a==3||a==4||a==5||a==6||a==7||a==8)

{

write_com1(table1[(z/16)*2+1]);

write_com1(table3[a-1]);

}

else

{

if(z%16==0)

{

a=a+16;

write_com2(table1[((z/16)-1)*2+1]);

write_com2(table3[a-9]);

}

else

{

write_com2(table1[(z/16)*2+1]);

write_com2(table3[a-9]);

}

}

}

void write_en(uint add,uchar z[])

{

uint i;

if((add%16)==1||(add%16)==2||(add%16)==3||(add%16)==4||(add%16)==5||(add%16)==6||(a dd%16)==7||(add%16)==8)

{

write_en_add1(add);

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

{

write_data1(z[i]);

}

write_en_add2(add);

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

{

write_data1(z[i]);

}

}

else

{

write_en_add1(add);

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

{

write_data2(z[i]);

}

write_en_add2(add);

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

{

write_data2(z[i]);

}

}

}

uchar *read_en(uint add)

{

uint i;

uchar *x;

//uchar a[16]; //注意:程序执行中,不能改变rom中的值,所以a不能定义为code if((add%8)==1||(add%8)==2||(add%8)==3||(add%8)==4)

{

write_ch_add1(add);

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

{

read_zimo[i-1]=read1();

}

write_ch_add2(add);

for(i=9;i<=16;i++)

{

read_zimo[i-1]=read1();

}

}

else

{

write_ch_add1(add);

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

{

read_zimo[i-1]=read2();

}

write_ch_add2(add);

for(i=9;i<=16;i++)

{

read_zimo[i-1]=read2();

}

}

x=read_zimo;

return x;

}

uchar *read_ch(uint add)

{

uint i;

uchar *x;

// uchar a[32]; //注意:程序执行中,不能改变rom中的值,所以a不能定义为code if((add%8)==1||(add%8)==2||(add%8)==3||(add%8)==4)

{

write_ch_add1(add);

for(i=1;i<=16;i++)

{

read_zimo[i-1]=read1();

}

write_ch_add2(add);

for(i=17;i<=32;i++)

{

read_zimo[i-1]=read1();

}

}

else

{

write_ch_add1(add);

for(i=1;i<=16;i++)

{

read_zimo[i-1]=read2();

}

write_ch_add2(add);

for(i=17;i<=32;i++)

{

read_zimo[i-1]=read2();

}

}

x=&read_zimo[0];

return x;

}

uchar read1(void) //读左半屏图形数据子程序

{

uchar d;

check_busy1(); //检测液晶显示控制器是否空闲

P1=0xff;

d_i=1;

r_w=1;

cs1=1;

cs2=0;

enb=1;

delay(2);

d=P1;

enb=0;

cs1=0;

return d;

}

uchar read2(void) //读右半屏图形数据子程序

{

uchar d;

check_busy2(); //检测液晶显示控制器是否空闲P1=0xff;

d_i=1;

r_w=1;

cs1=0;

cs2=1;

enb=1;

delay(2);

d=P1;

enb=0;

cs2=0;

return d;

}

void check_busy1(void) //控制器1忙检测子程序

{

uint i;

P1=0xff;

d_i=0;

r_w=1;

cs1=1;

cs2=0;

enb=1;

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

if( (P1&0x80) != 0x80 ) break; //D7=0 空闲退出

enb=0;

cs1=0;

}

void check_busy2(void) //控制器2忙检测子程序{

uint i;

P1=0xff;

d_i=0;

r_w=1;

cs1=0;

cs2=1;

enb=1;

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

if( (P1&0x80) != 0x80 ) break; //D7=0 空闲退出enb=0;

cs2=0;

}

void delay(uchar z)

{

uint i,j;

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

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

}

void test()

{

write_en(1,en_1);

write_en(2,en_2);

write_en(3,en_3);

write_en(4,en_4);

write_en(5,en_5);

write_en(6,en_6);

write_en(7,en_7);

write_en(8,en_8);

write_en(9,en_9);

write_en(10,en_0);

write_en(11,en_a);

write_en(12,en_b);

write_en(13,en_c);

write_en(14,en_d);

write_en(15,en_e);

write_en(16,en_f);

write_en(18,en_h); write_en(19,en_i); write_en(20,en_j); write_en(21,en_k); write_en(22,en_l); write_en(23,en_m); write_en(24,en_k); write_en(25,en_o); write_en(26,en_p); write_en(27,en_q); write_en(28,en_r); write_en(29,en_s); write_en(30,en_t); write_en(31,en_u); write_en(32,en_v); write_en(33,en_w); write_en(34,en_x); write_en(35,en_y); write_en(36,en_z); write_en(37,en_aa); write_en(38,en_bb); write_en(39,en_cc); write_en(40,en_dd); write_en(41,en_ee); write_en(42,en_ff); write_en(43,en_gg); write_en(44,en_hh); write_en(45,en_ii); write_en(46,en_jj); write_en(47,en_kk); write_en(48,en_ll); write_en(49,en_mm); write_en(50,en_nn); write_en(51,en_oo); write_en(52,en_pp); write_en(53,en_qq); write_en(54,en_rr); write_en(55,en_ss); write_en(56,en_tt); write_en(57,en_uu); write_en(58,en_vv); write_en(59,en_ww); write_en(60,en_xx);

write_en(62,en_zz);

} //需要时调出

//////////////////////////////////////////字库

#define uchar unsigned char

#define uint unsigned int

uchar code zhou[]=

{0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00,

0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00};/*"周",0*/

uchar code yu[]=

{

0x10,0x0C,0x24,0x24,0x24,0x24,0x25,0xE6,0x24,0x24,0x24,0x24,0x24,0x14,0x0C,0x00,

0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00};/*"宇",0*/

uchar code feng[]=

{0x00,0xF0,0x00,0xFF,0x00,0xF0,0x80,0x90,0x4C,0x57,0xA4,0x54,0x4C,0x84,0x80,0x00,

0x00,0x1F,0x10,0x0F,0x08,0x1F,0x10,0x10,0x15,0x15,0xFF,0x15,0x15,0x10,0x10,0x00};/*"峰",0*/

uchar code xiao[]=

{0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00,

0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00};/*"小",0*/

uchar code mei[]=

{0x10,0x10,0xD0,0xFF,0x50,0x90,0x08,0xF7,0x14,0x54,0x94,0x14,0xF4,0x04,0x00,0x00,

0x04,0x03,0x00,0xFF,0x00,0x01,0x1D,0x13,0x11,0x55,0x99,0x51,0x3F,0x11,0x01,0x00};/*"梅",0*/

uchar code en_0[]=

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};/*"0", 0*/

uchar code en_1[]=

1*/

uchar code en_2[]=

{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};/*"2", 2*/

uchar code en_3[]=

{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};/*"3", 3*/

uchar code en_4[]=

{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};/*"4", 4*/

uchar code en_5[]=

{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*"5", 5*/

uchar code en_6[]=

{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};/*"6", 6*/

uchar code en_7[]=

{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};/*"7", 7*/

uchar code en_8[]=

{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};/*"8" ,8*/

uchar code en_9[]=

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};/*"9", 9*/

uchar code juhao[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};/*".", 0*/

uchar code maohao[]=

{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};/*":", 1*/

uchar code douhao[]=

2*/

uchar code tanhao[]=

{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00};/*"!", 5*/

uchar code at[]=

{0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00};/*" @",6*/

uchar code baifen[]=

{0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00};/*" %",7*/

uchar code wenhao[]=

{0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00};/*"?", 12*/

uchar code sheshi[]=

{0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,

0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00};/*"℃",13*/

uchar code en_a[]=

{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20};/*"a", 0*/

uchar code en_b[]=

{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00};/*"b", 0*/

uchar code en_c[]=

{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00};/*"c", 2*/

uchar code en_d[]=

{0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20};/*"d", 3*/

uchar code en_e[]=

4*/

uchar code en_f[]=

{0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"f", 5*/

uchar code en_g[]=

{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00};/*"g", 6*/

uchar code en_h[]=

{0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20};/*"h", 7*/

uchar code en_i[]=

{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"i", 8*/

uchar code en_j[]=

{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00};/*"j", 9*/

uchar code en_k[]=

{0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00};/*"k" ,10*/

uchar code en_l[]=

{0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"l", 11*/

uchar code en_m[]=

{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F};/*"m" ,12*/

uchar code en_n[]=

{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20};/*"n", 13*/

uchar code en_o[]=

{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00};/*"o", 14*/

uchar code en_p[]=

,15*/

uchar code en_q[]=

{0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80};/*"q" ,16*/

uchar code en_r[]=

{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00};/*"r", 17*/

uchar code en_s[]=

{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00};/*"s", 18*/

uchar code en_t[]=

{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00};/*"t", 19*/

uchar code en_u[]=

{0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20};/*"u", 20*/

uchar code en_v[]=

{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00};/*"v", 21*/

uchar code en_w[]=

{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00};/*"w ",22*/

uchar code en_x[]=

{0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00};/*"x" ,23*/

uchar code en_y[]=

{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00};/*"y", 24*/

uchar code en_z[]=

{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00};/*"z", 25*/

uchar code en_aa[]=

{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20};/*"A ",0*/

uchar code en_bb[]=

{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00};/*"B" ,1*/

uchar code en_cc[]=

{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00};/*"C" ,2*/

uchar code en_dd[]=

{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00};/*"D" ,3*/

uchar code en_ee[]=

{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00};/*"E" ,4*/

uchar code en_ff[]=

{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00};/*"F", 5*/

uchar code en_gg[]=

{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00};/*"G ",6*/

uchar code en_hh[]=

{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20};/*"H" ,7*/

uchar code en_ii[]=

{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"I", 9*/

uchar code en_jj[]=

{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00};/*"J", 10*/

uchar code en_kk[]=

{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00};/*"K" ,11*/

uchar code en_ll[]=

{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00};/*"L", 12*/

uchar code en_mm[]=

{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00};/*"M ",13*/

uchar code en_nn[]=

{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00};/*"N" ,14*/

uchar code en_oo[]=

{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00};/*"O" ,15*/

uchar code en_pp[]=

{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00};/*"P", 16*/

uchar code en_qq[]=

{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00};/*"Q" ,17*/

uchar code en_rr[]=

{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20};/*"R" ,18*/

uchar code en_ss[]=

{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00};/*"S" ,19*/

uchar code en_tt[]=

{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00};/*"T", 20*/

uchar code en_uu[]=

{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00};/*"U" ,21*/

uchar code en_vv[]=

{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00};/*"V ",22*/

uchar code en_ww[]=

最新冀教版小学语文三年级下册《倾斜的伞》公开课教学设计 (1)

《倾斜的伞》教学设计 教学目标: 1、知识与技能:学习生字新词,有感情地朗读课文。 2、过程与方法:让学生有感情的朗读,分角色朗读中感悟,理解课文内容。 3、情感态度与价值观:了解在雨天外公对年幼的我的呵护,体会祖孙间那种温馨的情感。 教学重难点: 重点:使学生了解在雨天外公对年幼的我的真情。 难点:体会祖孙间那种温馨的情感,学会感恩,懂得回报。 教学时间: 1课时。 教学过程: 一、设疑导入,揭示课题 师:伞,象形字《说文解字》中称伞为“辙”,解释为“盖”,即遮蔽阳光和雨雪的用具。这是一种平平常常的事物。大家随处可见,可是这把平平常常的伞却给作者带来了不平常的感受。你想了解这把雨伞的与众不同吗?让我们一同走入作者的情感世界,学习倾斜的伞。(板书:倾斜的伞)引导学生再读课题。 二、初读课文,整体感知 1、教师范读课文。 (1)听老师读课文,边听边感受你仿佛看到了什么画面? 教师:同学们听得很投入。我相信你们都有自己独特的感受,那么,我请同学们猜猜老师是什么样的感受?如果让你用课文中一个词来概括,你会用哪个词?教师引导:出现在课文的最后一段(温情)这是怎样一把温情的伞呢?答案就在课文的语言之中。

请同学们说一说,你仿佛看到了什么画面?(两个画面:①雨中外公为年幼的丹丹撑伞;②雨中丹丹为年迈的外公称伞。) (2)教师出示挂图,展示这两幅画面,指导学生观察,你发现了什么?(同样是倾斜的伞第一幅中伞倾向丹丹,第二幅中伞倾向外公。) 2、请同学们快速浏览课文,画出“我”眼中关于伞的句子。 三、品读课文,体会情感 1、齐读课文第一自然段。引导生提问:我为什么十分喜欢下雨?板书:为什么? 2、品读课文二三四自然段。 指导看第一幅图:一老一小,走在雨中,立在伞下,这成了雨天里一道独特的风景,这是一幅多么和谐的画面呀!课文哪些自然段描述了第一幅图的内容。指名读。 教师:同学们,会读书的人用两只眼睛,一只眼睛看纸面上的字,另一只眼睛看纸的背后,也就是用心去感受。我相信你们一定是会读书的孩子,指名读课文二三四自然段,文中哪些句子表现出了温情,让你印象深刻? 教师:在大家动听的读书声中,这温馨的画面在我的脑海中浮现。请同学们交流句子。 3、全班交流。 (1)外公便来到学校门口,打开那把墨绿色的大伞,向我招招手。(平常)我惊讶的发现,头顶的天空已变成一片墨绿色,绿得那样深。(外公用雨伞把丹丹全部遮住,外公对丹丹的爱,怕丹丹淋湿) 外公头顶上本来应该墨绿色的天空却变了,一半是墨绿色,一半却是灰蒙蒙的。(同撑一把伞,一半是墨绿色,那是丹丹头顶上的伞;一半是灰蒙蒙的,那是外公头顶上没有被遮住的天空,体会到外公对丹丹的爱,宁愿自己淋湿,也不让丹丹淋湿了。)

基于某STM32LCD12864驱动程序

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置低电平 #define LCD_RESET_0 LCD_CONTROL->BRR = LCD_RESET_Pin // 复位 #define LCD_RESET_1 LCD_CONTROL->BSRR = LCD_RESET_Pin // 复位脚拉高 #define DATAOUT LCD_DATAPORT->ODR &=0xff00;LCD_DATAPORT->ODR // 数据输出寄存器 #define DATAIN LCD_DATAPORT->IDR // 数据输入寄存器 #define LCD_BF ((DATAIN)& 0x0080) // 忙状态 void LCD_delayus(unsigned long n); //延时n(us) void LCD_delayms(unsigned long n); //延时n(ms) void LCD_WriteInitcmd(uint8_t initcmd); //写初始化命令 void LCD_WaitLaisure(void); //一直等待到LCD内部操作完成,变为空闲状态 void LCD_Writecmd(uint8_t cmd); //写命令到LCD12864 void LCD_WriteByte(uint8_t byte); //写一字节数据到LCD12864 void LCD_pos(uint16_t pos); //LCD显示位置设置 void LCD_Setpos(uint16_t row,uint16_t col);//设定LCD12864的显示地址,根据习惯 void LCD_DispChar(char ch); //显示一个字符 void LCD_Setpos_DispChar(uint16_t row,uint16_t col,char ch);//在指定位置显示一个字符 void LCD_DispString(char str[]); //显示一个字符串,显示位置需提前设定

1602字符液晶显示原理+实例详解

1602详细资料和实例 1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采 用的1602液晶进行显示的。而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。 所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。目前市面上字符液晶绝大多 数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。 1602液晶的正面(绿色背光,黑色字体) 1602液晶背面(绿色背光,黑色字体)

另一种1602液晶模块,显示屏是蓝色背光白色字体 字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:

HD44780内置了DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:

也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码(指A的字模代码,0x20~0x7F为标准的ASCII码,通过这个代码,在CGROM中查找到相应的字符显示)就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:DDRAM地址与显示位置的对应关系。 (事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码,见字模关系对照表)并不能显示1出来。这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H 地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H 加上80H即81H。依次类推。大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了),1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形(无汉字),如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H)(其实是1个地址),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

1602液晶字符显示

1.基本简介 LCD1602工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。2.管脚功能 1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。 第7~14脚:D0~D7为8位双向数据端。 第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 ⑶特性 3.3V或5V工作电压,对比度可调 内含复位电路 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器DDRAM

LCD1602自定义显示字符

LCD1602自定义显示字符 从CGROM表中可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个, 实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000x111,x为无效位,最后三位为000-111共8个。 如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H)。 从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为01000000-01000111八个地址。 我们向这8个字节写入字模数据,让它能显示出“℃” 地址:01000000数据:00010000图示:○○○■○○○○ 0100000100000110○○○○○■■○ 0100001000001001○○○○■○○■ 0100001100001000○○○○■○○○ 0100010000001000○○○○■○○○ 0100010100001001○○○○■○○■ 0100011000000110○○○○○■■○ 0100011100000000○○○○○○○○ 字定义字符地址 0x40————0x00 0x48————0x01 0x50————0x02 0x58————0x03 0x60————0x04 0x68————0x05 0x70————0x06 0x78————0x07 程序操作: 1.定义字符数组 uchar code Word1[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};//自定义字符数组 2.写数据到CGRAM中 uchar j; WriteCommandLCD(0x40); for(j=0;j<8;j++) { WriteDataLCD(Word1[j]); } 3.读取数据并显示 WriteCommandLCD(0xC8);//显示在第一行 WriteDataLCD(0x00);//地址

很好用的12864驱动程序

/////////////////////////////////////////////////////////// #include #include #define uchar unsigned char #define uint unsigned int //////////单片机与液晶显示的引脚连接///////// sbit P32=P3^2; //RST sbit P33=P3^3; //CS2 sbit P34=P3^4; //CS1 sbit P35=P3^5; //E sbit P36=P3^6; //rs&DI sbit P37=P3^7; // R/W ////////延时///////// void delay(uint v) { while(v!=0)v--; } ////////复位/////////// void reset() { P32=0; delay(10); P32=1; delay(10); } ////////write code写指令/////// void wcode(uchar c,uchar cs1,uchar cs2) { P34=cs1; P33=cs2; P37=0; P36=0; P1=c; P35=0; delay(10);

P35=1; delay(10); P35=0; } /////////write data写数据/////////////// void wdata(uchar c,uchar cs1,uchar cs2) { P34=cs1; P33=cs2; P37=1; P36=0; P1=c; P35=0; delay(10); P35=1; delay(10); P35=0; } ////////////set start设置起始行///////////// void set_startline(uchar i)//起始行。11A5A4A3A2A1A0 共有64行 // 液晶显示器的最底层为第一行 { i=0xc0+64-i;//此算法为把最顶层做为第一层 wcode(i,1,1); } ////////////set 页值设置,起始列值函数///////////// void set_adr(uchar x,uchar y) { x=x+0xb8;//页地址设置。10111A2A1A0 DDRAM的8行为一页,A0~A2为页码,LCD为64行8页 y=y+0x40;//列地址设置。01A5A4A3A2A1A0 两半屏分别有64列,A0~A5送入列地址计数器, //作为列(Y)地址指针。每读写一次其自动加一,指向下一列DDRAM单元wcode(x,1,1); wcode(y,1,1); } ///////////on/off开/关显示函数//////////////

LCD1602汉字显示讲解

LCD1602显示汉字研究与程序设计 1602是一款最常用也是最便宜的液晶显示屏。最多可以显示两行标准字符,每行最多可以显示16个字符。 1602可以显示内部常用字符(包括阿拉伯数字,英文字母大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)。 一、显示常用字符。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 十进制十六进制ASCII字符十进制十六进制ASCII 字符十进制十六进制ASCII字符 00 00 自定义字符1 56 38 8 96 60 ` 01 01 自定义字符2 57 39 9 97 61 a 02 02 自定义字符3 58 3A : 98 62 b 03 03 自定义字符4 59 3B ; 99 63 c 04 04 自定义字符5 60 3C < 100 64 d 05 05 自定义字符6 61 3D = 101 65 e 06 06 自定义字符7 62 3E > 102 66 f 07 07 自定义字符8 63 3F ? 103 67 g 08 08 自定义字符1 64 40 @ 104 68 h 09 09 自定义字符2 65 41 A 105 69 i 10 0A 自定义字符3 66 42 B 106 6A j 11 0B 自定义字符4 67 43 C 107 6B k 12 0C 自定义字符5 68 44 D 108 6C l 13 0D 自定义字符6 69 45 E 109 6D m 14 0E 自定义字符7 70 46 F 110 6E n 15 0F 自定义字符8 71 47 G 111 6F o 32 20 空格72 48 H 112 70 p 33 21 ! 73 49 I 113 71 q 34 22 " 74 4A J 114 72 r 35 23 # 75 4B K 115 73 s 36 24 $ 76 4C L 116 74 t 37 25 % 77 4D M 117 75 u 38 26 & 78 4E N 118 76 v 39 27 ' 79 4F O 119 77 w 40 28 ( 80 50 P 120 78 x 41 29 ) 81 51 Q 121 79 y 42 2A * 82 52 R 122 7A z 43 2B + 83 53 S 123 7B { 44 2C , 84 54 T 124 7C | 45 2D - 85 55 U 125 7D }

1602液晶字符显示

1602液晶字符显示屏的原理 管脚功能/1602字符液晶编辑 1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线 VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中: 引脚符号功能说明 1VSS一般接地 2VDD接电源(+5V) 3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 4RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 6E E(或EN)端为使能(enable)端,写操作时,下降沿使能。 读操作时,E高电平有效 7DB0低4位三态、双向数据总线0位(最低位)8DB1低4位三态、双向数据总线1位 9DB2低4位三态、双向数据总线2位 10DB3低4位三态、双向数据总线3位 11DB4高4位三态、双向数据总线4位 12DB5高4位三态、双向数据总线5位

13DB6高4位三态、双向数据总线6位 14DB7高4位三态、双向数据总线7位(最高位)(也是busy flag) 15BLA背光电源正极 16BLK背光电源负极 寄存器选择控制表 RS R/W操作说明 00写入指令寄存器(清除屏等) 01读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 10写入数据寄存器(显示各字型等) 11从数据寄存器读取数据 注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0. busy flag(DB7):在此位为1时,LCD忙,将无法再处理其他的指令要求。 字符集/1602字符液晶编辑 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。 以下是1602的16进制ASCII码表: (图片打开是大图) 读的时候,先读上面那列,再读左边那行,如:感叹号!的ASCII为0x21,字母B的ASCII 为0x42(前面加0x表示十六进制)。 显示地址/1602字符液晶编辑 1602字符液晶显示可分为上下两部分各16位进行显示,处于不同行时的字符显示地址如下

1602原理 汉字显示 原理理解

主要是看懂它CGROM CGRAM的存储空间图,和工作原理 用户直接操作DDRAM,DDRAM有80个字节,其位置与1602的显示位置有对应关系,基本思想是向指定的DDRAM地址中写入字符对应的ASCII码,其实是指针,DDRAM通过这个指针在CGROM中找到它对应的字模数组,然后显示在屏幕上。用户看起来是对DDRAM的操作,实则是通过DDRAM调用了CGROM中的字模数组,显示在LCD上。 图1 其奥妙在于它的ASCII码、字符点阵地址、行地址的对应关系上

图2(没有复制完整) DDRAM的地址对应LCD上的一个位,其内容是一个指针,指向了点阵中的数组。 以00H为例,(写地址的时候要写成0X80,因为指令规定了高位要为1 ,见DDRAM地址设置指令)向00H中写一个01100010则LCD的处理器会视01100010为指针,然后通过CGROM找到它对应的一组字模代码,如下图,这个指针对应的是一个存储空间,这个存储空间就是8行5列,对应下面的行地址0000到0111.这就是行地址的意思,也就是字模码的行。,第8行对应的是光标,就是我们在LCD上看到一最后一行,如果是光标闪烁的话,那一闪闪的就是第8行的位在不断的置0置1的结果。如下图3示 行、列描述的是存储空间,字模码的行列就是8行5列的;还有个行地址批的是CGROM 的行,CGROM中的低4位就是行,共16行16列,如图2 示 图3 下面提用户自定的的解释 CGRAM其实是CGROM中的一部分,这部分是没有被写进字模码的存储空间。前8位没有用到,可以让用户自己写字模码。用户最多写8个,CGROM中对应行0000行到0111行,当然对就的是第0列。第个CGRAM对应一个8行5列的存储空间,如下图4示 因此写自定义字模时要先设定好这个CGRAM的地址,如00000000,然后要在这个地址中写入8行的数据,如图4示,第一个地址代表字符标号,也就是行DDRAM中写的指针,下面的字符码的低3位,现时也是CGRAM的高3位,位5 4 3。自定义进就是这样写的 程序也是按这个思想写的。

部编版五年级上册六单元单元整组群文阅读公开课一等奖详细教学设计加板书加表格

五年级上册六单元单元整组群文阅读 议题:藏在画面里的爱 教学目标: 1、通过浏览、寻读、批注、朗读、对比读等阅读策略让学生寻找爱的画面,感受父母深深的爱。 2、学生初步学会用表格来梳理课文,用思维导图来梳理不同方面的内容,了解写出父母之爱的不同方法。 3、方法迁移,学会在日常生活中调动感官多角度观察人、多角度描写人的方法。 教学重点: 引导孩子感悟深情,并了解深情背后的写法。 教学难点: 引导孩子把表达爱的手法内化为自己的方法。 课前交流: 孩子们,坐的可真端正啊,古桥的孩子习惯真好。上课之前,我想做个小调查。喜欢看书的孩子请举手。喜欢看什么书呢?短短的交流让我知道你们都有一个爱看书的好习惯。好,上课。 一、导课——想画面,感深情,诵古诗,揭议题。 环节目标:通过对《游子吟》的回顾,创设温情的课堂氛围,让学生初识从画面中感受爱的方法,揭示议题并激发学生的学习兴趣。 孩子们,在读书时,你是更喜欢先看文字还是看插图呢? (生:文字。) 师回答:是的,文字,是表达情感最细腻最真挚的方式。 (生:图片。) 师:是的,图片带给我们最直观最形象的感受。老师今天也带来了一幅图片。从这个画面里,你看到了什么?(我看到了一个母亲在为孩子缝衣服)你从人物和事情来描述了这幅画面,很不错。你可以从情感上来描述一下吗?你想到了什么?我想到了一首我们学过的古诗。看来不少同学和我所想是一样的。我们一起有感情的朗诵这首充满爱的诗歌吧,一边朗诵一边想象这动人的画面。听完大家的朗诵,我发现母爱就在临行密密缝的动作里。在文字,总有一些爱的画面让我们难以忘怀,今天我们就一起走进六单元的几篇文章,去品味藏在画面里的爱。(板书议题:藏在画面里的爱)带着感情齐读我们今天群文阅读的议题。 二、自读三篇、完成表格、合作交流并汇报——定格爱的画面,感受爱的深情 环节目标:用在《游子吟》的画面里感悟深情的方法,采用寻读、批注读、梳理内容等方法让学生抓关键词句,细细品味母爱的深情,创设温暖情境,并引导孩子对写出爱的方法有个初步的认识。 1.师:一个单元,三篇文章,几千个字。你们平时读很长的文章,有什么好的方法提高阅读速度吗? 2.生交流,老师板书 3.出示任务:是的,还可以一目十行的浏览,可以跳开无关紧要的内容跳读,其实,我们还可以寻读,一边读一边批注。(出示课件),请同学们以浏览的方式,寻读三篇文章里让你最感动的地方,勾画批注你的感受,并完成阅读记录表。 4.同学们,看着你们读到如此专心,写得如此认真。我相信你们一定有很多的感受想要与大家分享。接下来请同学们把你们的收获在小组内交流。

1602液晶字符显示

1602液晶字符显示

1.基本简介 LCD1602工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方

便地应用于市面上大部分的字符型液晶。 2.管脚功能 1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。 第7~14脚:D0~D7为8位双向数据端。 第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 ⑶特性 3.3V或5V工作电压,对比度可调

无字库12864液晶的驱动方法

无字库12864液晶的驱动方法 在制作单片机系统时,一般都需要用显示器件来显示单片机的工作状态并显示输出结果,如LED、数码管和液晶显示器等。LED最简单,但能给出的信息很少。数码管能清晰地显示数字和部分字母,但是耗电较大,不适合使用电池供电的装置。 常见的液晶显示器有段式液晶、字符液晶和图形液晶等。其中,段式液晶最省电,但对于通用显示使用起来不很方便,只能显示固定式数字或符号,而且需要专用驱动电路或特殊的单片机。 字符液晶(如1602)用得比较多,容易和单片机配合,但是一般都需要5V工作电压,虽然现在也有3V就可以工作的模块,但是体积还是较大,而且只能显示数字和西文字符,无法显示图形和汉字。 点阵液晶模块既可以显示ASCII字符,又可以显示汉字和图形,相对于前面几种,具有更大的灵活性,所以使用得越来越多。不过常用的图形液晶因为显示面积增加,体积比字符液晶(如1602)更大,价格也更贵。初学者要注意的是,12864图形点阵液晶随着厂家设计使用的驱动芯片不同,驱动程序有所区别,不像1602那样基本通用。 几种常见的12864图形点阵模块 12864点阵液晶模块分为带汉字库和不带汉字库两大类,目前带汉字库的通常是ST7920驱动,它可以工作在汉字字符方式和图形点阵方式,很多制作都用它,如果需要显示较多汉字,用它最为方便。 在显示汉字数量很少的场合,我们可以使用更加廉价的、不带字库的点阵液晶模块,这正是本文重点介绍的。它们的控制电路有KS0108和ST7565两种:KS0108很简单,一共只有7条指令,可是它没有串行接口;ST7565有20多条指令(最常用的也就几条),有串行接口,可选串行或并行工作。KS0108和ST7565的指令和上述带字库的ST7920区别较大,所以初学者买液晶时一定要搞清楚是哪种驱动电路。即使同样的驱动电路,不同厂家或者不同型号的产品,具体细节仍可能不同。例如有的片选信号是高电平有效,有的却是低电平有效,有的把显示区分为左右两半分别选取,有的却不加区分。所以使用前要仔细看厂家说明,如果没有,就要看液晶模块背面给出的具体型号,根据这个型号去查找使用手册。 笔者最近在淘宝网上搜寻到一款12864的图形点阵液晶,只有4cm宽、3.5cm高,显示面积为3.2cm宽、1.95cm高,非常小巧。更加难能可贵的是它可以在3V低电压工作,很适合我们制作小型便携装置。该液晶模块型号是SP12864FPD-12CSBE,由北京集粹电子设备公司出品,它的外形见图1。

液晶1602显示字符代码

1602液晶字符码 十十六ASCII 十十六ASCII 十十六ASCII 进制进制字符进制进制字符进制进制字符 00 00 自定义字符1 56 38 8 96 60 ` 01 01 自定义字符2 57 39 9 97 61 a 02 02 自定义字符3 58 3A : 98 62 b 03 03 自定义字符4 59 3B ; 99 63 c 04 04 自定义字符5 60 3C < 100 64 d 05 05 自定义字符6 61 3D = 101 65 e 06 06 自定义字符7 62 3E > 102 66 f 07 07 自定义字符8 63 3F ? 103 67 g 08 08 自定义字符1 64 40 @ 104 68 h 09 09 自定义字符2 65 41 A 105 69 i 10 0A 自定义字符3 66 42 B 106 6A j 11 0B 自定义字符4 67 43 C 107 6B k 12 0C 自定义字符5 68 44 D 108 6C l 13 0D 自定义字符6 69 45 E 109 6D m 14 0E 自定义字符7 70 46 F 110 6E n 15 0F 自定义字符8 71 47 G 111 6F o 32 20 空格72 48 H 112 70 p 33 21 ! 73 49 I 113 71 q 34 22 " 74 4A J 114 72 r 35 23 # 75 4B K 115 73 s 36 24 $ 76 4C L 116 74 t 37 25 % 77 4D M 117 75 u 38 26 & 78 4E N 118 76 v 39 27 ' 79 4F O 119 77 w 40 28 ( 80 50 P 120 78 x 41 29 ) 81 51 Q 121 79 y 42 2A * 82 52 R 122 7A z 43 2B + 83 53 S 123 7B { 44 2C , 84 54 T 124 7C | 45 2D - 85 55 U 125 7D } 46 2E . 86 56 V 126 7E ~ 47 2F / 87 57 W 48 30 0 88 58 X 49 31 1 89 59 Y 50 32 2 90 5A Z 51 33 3 91 5B [ 52 34 4 92 5C \ 53 35 5 93 5D ] 54 36 6 94 5E ^ 55 37 7 95 5F _

常见液晶驱动芯片详解

本文主要是介绍一些常用的LCD驱动控制IC的型号,方便学习或正在使用的LCD的朋友能够更好地编写LCD的驱动程序。 因此各位朋友在选择LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制IC的型号来判别,当然你还需要看你选择的LCD 模块引脚定义是固定支持并行,还是可选择并行或串行的方式。 一、字符型LCD驱动控制IC 市场上通用的8×1、8×2、16×1、16×2、16×4、20×2、20×4、40×4等字符型LCD,基本上都采用的KS0066作为LCD的驱动控制器 二、图形点阵型LCD驱动控制IC 1、点阵数122×32--SED1520 2、点阵数128×64 (1)ST7920/ST7921,支持串行或并行数据操作方式,内置中文汉字库(2)KS0108,只支持并行数据操作方式,这个也是最通用的12864点阵液晶的驱动控制IC (3)ST7565P,支持串行或并行数据操作方式 (4)S6B0724,支持串行或并行数据操作方式 (5)T6963C,只支持并行数据操作方式 3、其他点阵数如192×6 4、240×64、320×64、240×128的一般都是采用T6963c驱动控制芯片

4、点阵数320×240,通用的采用RA8835驱动控制IC 这里列举的只是一些常用的,当然还有其他LCD驱动控制IC,在写LCD驱动时要清楚是哪个型号的IC,再到网上去寻找对应的IC数据手册吧。后面我将慢慢补上其它一些常见的. 三 12864液晶的奥秘 CD1601/1602和LCD12864都是通常使用的液晶,有人以为12864是一个统一的编号,主要是12864的液晶驱动都是一样的,其实12864只是表示液晶的点阵是128*64点阵,而实际的12864有带字库的,也有不带字库的;有5V电压的,也有~5V(内置升压电路);归根到底的区别在于驱动控制芯片,常用的控制芯片有ST7920、KS0108、T6963C等等。 下面介绍比较常用的四种 (1)ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。该类液晶支持68时序8位和4位并口以及串口。 (2)KS0108类这种控制器指令简单,不带字库。支持68时序8位并口。 (3)T6963C类这种控制器功能强大,带西文字库。有文本和图形两种显示方式。有文本和图形两个图层,并且支持两个图层的叠加显示。支持80时序8位并口。

12864液晶经典驱动程序,一看就懂,有详细的注释(C语言编写,不看后悔)

这个程序写得很好,自己也是看的别人写的很好的程序,但是它代码不够完整,注释不详细,经过自己的修改加以完善。另外我发现很多的测试代码都没有附上测试代码效果图,在本人的代码下面有自己拍的效果图,填补不足之处。 自己在找资料的过程中花掉很多的财富值,如果大家看得起该代码请评五分加以下载,在下感激不尽! /******************************************* 程序名称:12864液晶经典驱动程序(带中文字库) 功能:12864测试程序 修改作者:王程 修改时间:2014年2月5日23:22:32 ********************************************/ #include #define uchar unsigned char #define uint unsigned int // P0 为数据口 sbit LCD_RS=P2^0; //数据、命令选择端口 sbit LCD_RW=P2^1; //液晶读写控制 sbit LCD_EN=P2^2; //液晶使能控制 sbit PSB = P2^4; //模式选择1为并行0为串行 sbit RES = P2^5; //复位端口低电平复位,上电之前进行复位,为了稳定!unsigned char code DAT[] = "我爱我家"; //测试显示的汉字,下面的A为测试显示的英文 /******************************************* 函数名称:Delay_1ms (晶振为12M) 功能:延时约1ms的时间 参数:无 返回值:无 ********************************************/ void delay_1ms(uint x) { uinti,j; for(j = 0;j

LCD1602显示汉字“生日快乐”

1602显示“生日快乐” ////////////////////目标板:红油板///////////////////// ////////////////////修改自:不要显卡《1602显示汉字“生日快乐”》原因:乱码//////////////////////// #include #define uchar unsigned char #define uint unsigned int sbit RS=P0^5; sbit RW=P0^6; sbit E=P0^7; uchar sheng[]={0x04,0x14,0x1f,0x14,0x0e,0x04,0x1f,0x00}; //“生”字字模uchar ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}; //“日”字字模 uchar kuai[]={0x0a,0x0a,0x1f,0x1b,0x1f,0x0a,0x0d,0x00}; //“快”字字模uchar le[]={0x1e,0x10,0x14,0x1f,0x04,0x15,0x15,0x00}; //“乐”字字模 void delay(uint m) { while(m--); } void Write_Instruction(uchar Instruction) //1602写命令 { delay(5); RS=0;

RW=0; E=1; P2=Instruction; E=0; } void Write_Data(uchar Data) //1602写数据{ delay(5); RS=1; RW=0; E=1; P2=Data; E=0; } void LCD1602_Init() //1602初始化 { Write_Instruction(0x06); Write_Instruction(0x30); Write_Instruction(0x0c); } void main() { uchar i; LCD1602_Init();

那倾斜的伞阅读答案

那倾斜的伞阅读答案 那倾斜的伞 很小的时候,我十分喜欢下雨。 每逢“淅沥”声从窗外响起,外公便会来到门口,打开那把墨绿色的大伞,向我招招手。我就一蹦蹦一跳地跑向外公,钻进伞下,挽隹外公的胳膊。于是,我们便走进了这片雨的世界中。 抬起头,我惊讶地发现头顶的天空不知何时已变成墨绿色的,绿得那样深,绿得那样扣人心弦。望望外公,外公头顶原应墨绿色的天空已经破了,一半是墨绿色,一半却是灰蒙蒙的。“外公,伞歪了。”外公抬头望了望,笑眯眯地说:“没歪呀。”我困惑了,“怎么搞的,明明是歪向我这边了呀!”外公笑而不语。 回到家里,我发现外公一边肩膀都湿透了。“外公,你肩膀都被淋湿了,快擦干呀!”你有没有被淋着呀外公问啊那把大伞把我整个儿都包住了外公开心地笑了起来。就这样,每次我们从雨中回来,外公的身子总是一半是干的,一半是湿的。 不知从何时起,撑伞的人已不是外公,而是我,是我为外公撑伞。仍然是那片雨的世界,仍然是那把墨绿色的大伞,一切都和以前一样。“丹丹,伞歪了。”传来外公微颤的声音。我抬起头,这才发现我头顶上的天空一半是墨绿色的,一半是灰蒙蒙的。我的心热了起来,不知不觉中,我正做着与外公相同的事,① 这仍然是把倾斜着的伞。回到家里,我接过外公递来的毛巾,看见外公嘴角微微一颤,已开始浑浊的双眼泪光点点。 那是把倾斜的伞,是把充满了的伞,我会永远它,爱护它。从此,我总盼着下雨。② 1、画去文中括号里不恰当的词语。 2、给第四自然段的空白处加上标点。 3、在第三自然段中找出下列词语的近义词。 不解惊奇 4、请用“”将文章分为四段,并写出段意。 5、联系课文内容,在文中村有序号了地方补上“我”当时的心理活动。 6、读了这篇短文,你明白了什么,用自己的话写在下面。 7、我为什么喜欢下雨? 8、为什么我发现头顶的天空是墨蓝色?扣人心弦是什么意思这么为什么要这样写?答案:

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