模块LM12864FBC-1<br />这块液晶的引脚为<br />1--CS1<br />2--CS2<br />3--GND<br />4--VCC<br />5--V0<br />6--D/I(RS)<br />7--R/W<br />8--EN<br />9~16--D0~D7<br />17--BLA<br />18--BLK<br />19--NC<br />20--Vout<br /><br />奇怪没有RST复位引脚,说明书上面Vout和VCC接一个25K的电位器分压给V0调对比度即可,对比度是可以调整了<br /> 想做一个驱动显示几个汉字<br /> 程序如下: <br /> #include <hidef.h> /* common defines and macros */<br />#include <6812a64.h> /* derivative information */<br />#include "my_vectors.h"<br />#include "main_asm.h" /* interface to my assembly module */<br /><br /><br /><br /><br />///////////接口相关宏定义///////////////////<br />#define CS1 PTT_PTT0 //块1 左边<br />#define CS2 PTT_PTT1 //块2 右边<br />#define D_I PTT_PTT2 //A0为1时是数据,0时为指令数据<br />#define R_W PTT_PTT3 //为1时是读,为0时是写 <br />#define E PTT_PTT4 //允许装载数据<br />#define DATA PORTB //数据<br />//////////////////////////////////////<br /><br />#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module. Placement will be in NON_BANKED area. */<br />//interrupt void RTI_ISR(void) { /* simple RTI interrupt service routine */<br /> /* clear RTIF bit */<br /> // static i=0;<br /> //闪烁小灯,每隔400ms闪烁一次<br />// i++;<br />// if(i>100){PTT_PTT5=~PTT_PTT5;PORTA_BIT0=PTT_PTT5;PORTA_BIT2=~PORTA_BIT0;i=0; }<br />// CRG**_RTIF=1;<br /> //CRG** = 0x80; <br />//}<br /><br />#pragma CODE_SEG DEFAULT<br />static void RTIInit(void) {<br /> /* setup of the RTI interrupt frequency */<br /> /* adjusted to get 1 millisecond (1.024 ms) with 16 MHz oscillator */<br /> /*--------锁相环初始化-------*/<br /> CLKSEL=0x00; //disable pll;<br /> PLLCTL=0xe1; //CLOCK MONITOR=ON,PLL=ON,AUTO SELECT,是默认设置<br /> SYNR=14;REFDV=2; //bus clock =20M<br /> PLLCTL=0x60; //自动锁定<br /> asm NOP;asm NOP;asm NOP;<br /> while(!CRG**_LOCK);<br /> CLKSEL=0x80; //pll start<br /> RTICTL = 0x1F; /* set RTI prescaler */ <br /> // CRGINT_RTIE=1; //允许RTI中断 <br /> asm CLI;<br /> //CRGINT = 0x80; /* enable RTI interrupts */ <br /> DDRT_DDRT5=1;<br /> DDRA_BIT0=1;<br /> DDRA_BIT2=1;<br /> RDRT=0xff;<br /> RDRIV=0x93;<br /> DDRB=0xff; ////PORTB为输出引脚<br /> DDRT=0xff; ////PORT T 为输出引脚<br />}<br /><br /><br />/*忙判别*/<br />void lcd_busy(void) {DDRB_BIT7=0;<br /> D_I=0;R_W=1;<br /> while(1){E=1;_asm nop;<br /> if(!PORTB_BIT7)break;} <br /> E=0;DDRB_BIT7=1;<br />}<br />/*设置xy*/<br />void set_xy(unsigned char x,unsigned char y) {<br /> if (x>=64) {CS1=0;CS2=1;} else {CS2=0;CS1=1;}<br /> lcd_busy();<br /> E=1;D_I=0;R_W=0;PORTB=0x40|x;E=0;<br /> lcd_busy();<br /> E=1;D_I=0;R_W=0;PORTB=0xb8|y;E=0;<br />}<br />void lw(unsigned char x,unsigned char y,unsigned char dd) {<br /> set_xy(x,y);<br /> lcd_busy();E=1;D_I=1;R_W=0;PORTB=dd;E=0;<br /> }<br />/*显示初始化*/<br />void lcd_init(void) {<br /> unsigned char x,y;<br /> /*开显示*/<br /> E=1;D_I=0;R_W=0;PORTB=0x3f;E=0;<br /> for (y=0;y<8;y++) {<br /> for (x=0;x<128;x++) lw(x,y,0x00); //清空屏幕<br /> }<br />}<br /><br /><br />void Lcd_off(void){<br /> E=1;D_I=0;R_W=0;PORTB=0x3e;E=0;<br />}<br /><br /><br /><br /><br />/*汉字点阵的提取:采用软件"字模提取软件",读法:先读前8行,黑点处为1,依次读完这16列,然后读后8行,依次再读完16列。*/<br />unsigned char hz[]={<br />/*汉字:一 */<br />//0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,0x80,0x00,<br />//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br /><br /> 0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,<br /> 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,<br /><br />/*汉字:倪*/<br />//0x80,0x40,0xf0,0x0f,0x02,0x00,0xfe,0x92,0x92,0x81,0x91,0x92,0x92,0xfe,0x00,0x00,<br />//0x00,0x00,0x7f,0x00,0x40,0x20,0x11,0x0c,0x03,0x00,0x3f,0x40,0x40,0x41,0x78,0x00,<br /><br />0x01,0x00,0x02,0x00,0x0F,0xFE,0xF0,0x00,0x40,0x02,0x00,0x04,0x7F,0x88,0x49,0x30,<br />0x49,0xC0,0x81,0x00,0x89,0xFC,0x49,0x02,0x49,0x02,0x7F,0x82,0x00,0x1E,0x00,0x00,<br />/*汉字:水*/<br />//0x00,0x10,0x10,0x10,0x90,0x70,0x00,0xff,0x20,0x60,0x90,0x08,0x04,0x00,0x00,0x00,<br />//0x10,0x10,0x08,0x06,0x01,0x40,0x80,0x7f,0x00,0x00,0x01,0x06,0x0c,0x18,0x08,0x00,<br /><br />0x00,0x08,0x08,0x08,0x08,0x10,0x08,0x60,0x09,0x80,0x0E,0x02,0x00,0x01,0xFF,0xFE,<br />0x04,0x00,0x06,0x00,0x09,0x80,0x10,0x60,0x20,0x30,0x00,0x18,0x00,0x10,0x00,0x00,<br /><br />/*汉字:好*/<br />//0x10,0x10,0xf0,0x1f,0x10,0xf0,0x80,0x82,0x82,0x82,0xf2,0x8a,0x86,0x82,0x80,0x00,<br />//0x80,0x43,0x22,0x14,0x0c,0x73,0x20,0x00,0x40,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,<br /><br />0x08,0x01,0x08,0xC2,0x0F,0x44,0xF8,0x28,0x08,0x30,0x0F,0xCE,0x01,0x04,0x41,0x00,<br />0x41,0x02,0x41,0x01,0x4F,0xFE,0x51,0x00,0x61,0x00,0x41,0x00,0x01,0x00,0x00,0x00,<br /><br />/*汉字:人*/<br />//0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x3f,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />//0x00,0x40,0x20,0x10,0x0c,0x03,0x00,0x00,0x01,0x06,0x0c,0x18,0x30,0x60,0x20,0x00<br /><br />0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0xC0,0x03,0x00,0xFC,0x00,<br />0x43,0x80,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x04,0x00,0x00<br /><br />};<br /><br />/*显示汉字,注意本函数参数 x 为屏幕横着的坐标(范围从0~128),y为屏幕纵向的坐标(范围为0~8),n为要显示数足hz[]中的第几个字符<br />注意:由于本例显示的是16*16点阵,所以第一个字符占据横着16个点,纵向16个点,也就是纵向2页,所以下一个字符应该从第2页开始,再下一个从第4页开始<br />如主程序中调用的dh(0,0,0); dh(0,2,1); dh(0,4,2); */<br />void dh(unsigned char x,unsigned char y,unsigned char n) {<br /> unsigned char i,dd;<br /> for (i=0;i<16;i++) {<br /> dd=hz[i+n*32];<br /> lw(x+i,y,dd);<br /> dd=hz[i+n*32+16];<br /> <br /> lw(x+i,y+1,dd);<br /> }<br />}<br /><br /><br />void main(void) {<br /> RTIInit();<br /> /* put your own code here */<br /> EnableInterrupts;<br /> asm_main();<br /> lcd_init();<br /> dh(0,0,0); //在横向0,纵向0页处显示汉字 "一"<br /> dh(0,2,1); //在横向0,纵向第2页处显示汉字 "倪"<br /> dh(0,4,2); //在横向0,纵向第四页处显示汉字 "水"<br /> dh(18,0,3); //在横向第18点,纵向0页处显示汉字 "好"<br /> dh(18,2,4);<br /> //Lcd_off();<br /> for(;;); /* wait forever */<br />}<br />抱歉这个程序其本是网上得到的,在这谢谢网友们的无私贡献!!<br /> 各位有谁做过这块液晶的驱动的,能否给个程序参考以下 <br /> QQ:89590025<br /> MSN:canon_me@hotmail.com |