⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcm320240.c

📁 驱动CE320240液晶显示器
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************
程序名称:cm320240底层驱动子程序
功能说明:
更新时间:2008-05-3 8:33
******************************************/
/* `CM320240-3E模拟口线接线方式
    连接线图:
     -----------------------------------------------
       |VDD,LEDA-----+5V  VSS,LEDK-----GND    									

	   |VO接20K可调电阻
       |DB0-----PB0 | DB4-----PB4 | WR-------PC0     |
       |DB1-----PB1 | DB5-----PB5 | RD-------PC1     |
       |DB2-----PB2 | DB6-----PB6 | CS-------PC6     |
       |DB3-----PB3 | DB7-----PB7 | A0-------PC7     |
     ------------------------------------------------- */

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#define uchar unsigned char
#define uint unsigned int

#define SystemSet 0x40 //初始化指令代码为40H,以下是该指令带有的8个参数设置
uchar ParaSysTable[8]= {0x30,0x87,0x07,0x27,0x42,0xF0,0x28,0x00};  //320*240
/*SystemSet指令带有的8个参数定义:
 P1=0x30---P1.5=IV= 1 : 画面无边界;  P1.3=W/S=0:为单屏结构LCD驱动系统,(为0则为双屏);
           P1.2=M2= 0 : 外部CGRAM的字符点阵格式为8*8,(为1则为8*16);
           P1.1=M1= 0 : 外部CGRAM的字符代码范围选择80H-9FH,(为1则选择E0H-FFH);
           P1.0=M0= 0 : 内、外发生器选择内部有效,(为1则外部有效,内部被屏蔽)。
 P2=0x87---P2(7--3)="10000",WF=1,交流驱动波形
           P2(2--0)=FX="111",字符宽+字距=7H
 P3=0x07---P3(3--0)=FY="0111",字符高+行距=7H
 P4=0x28---P4=C/R=28H=40,设置有效显示长度(字符数)为40,即整行均有效
 P5=0x42---P5=TC/R=66,
 P6=0xF0---P6=L/F=240,LCD的点行数
 P7=30,P8=00---P(8,7)=AP,通常为C/R+1,AP为双字节参数,为显示屏一行所占显示缓冲器的个数??? */

#define Scroll 0x44 //设置RAM区中显示区的起始地址及所占有的显示行数;
                         //它与SystemSet中AP数结合,可确定显示区所占的字节数,有是个参数
  uchar ParaScrTableA[10]={0x00,0x00,0xF0,0x00,0x40,0xF0,0x00,0x80,0x00,0x00};
//uchar ParaScrTableA[10]={0x00,0x00,0xF0,0x00,0x00,0x80,0x00,0x00,0x00,0x00};
/*Scroll指令各参数定义:
  P1=0,P2=0,P3=F0H : SAD1=0000H,SL1=F0H=240;
  P4=0,P5=40H,P6=F0H : SAD2=4000H,SL2=F0H=240;
  P7=0,P8=80H : SAD3=8000H, P9=P10=0 : SAD4=0; */

#define DispOn  0x59
#define DispOnP1 0x56     //P1=54H=01010100B,光标显示不闪烁/?只显示第一区//00000110???


#define Ovlay  0x5B
#define OvlayP1 0x04      //一区为图形显示,二区为文本方式

#define HdotScr 0x5A      //设置以点为单位的显示画面水平移动量
#define HdotScrP1 0x00    //P1=0
 
#define CsrForm  0x5D     //设置光标的显示方式与形状
#define CsrFormP1 0x07    //CRX=07H
#define CsrFormP2  0x87   //CRY=07H,(若CM=1,但仅在文本方式下有效)

#define CgramAdr   0x5C   //设置CGRAM的起始地址SAG;SAG只是相对地址
#define CgramAdrP1 0x00   //SAG=8000H 
#define CgramAdrP2 0x80

#define CsrDirR  0x4C    //设置光标地址指针自动移动方向为Right
#define CsrDirL  0x4D    //设置光标地址指针自动移动方向为Left
#define CsrDirUp  0x4E    //设置光标地址指针自动移动方向为Up
#define CsrDirDn  0x4F    //设置光标地址指针自动移动方向为Down

#define CsrW  0x46       //设置光标地址CSR
#define CsrR  0x47       //该指令读光标当前地址值
#define mWrite  0x42
#define mRead   0x43
#define paraP9  0x28 //because the number of word ???
#define PARA 0x30
#define BasePart1	0x00
#define BasePart2	0x40
#define BasePart3	0x80
#define BasePart4	0x00

void WriteDataLCM(uchar data);   //写数据
uchar ReadDataLCM(void); //读数据
void WriteCommandLCM(uchar cmd); //写指令
void LCMInit(void); //LCM初始化
void LCMClear(void);
void Locatexy(uchar x,uchar y, uchar attribs);
void Point(uint Px, uchar Py, uchar attr );
void DrawRim(void);
void circle(uint Ox,uchar Oy,uchar Rx,uchar attr);
void TextDisp( uchar Ox,uchar Oy, uchar  *ptr );
void PutCdotInGraph( uint Ox, uchar Oy, uchar Cnumber, uchar DotWidth );
void delay_1us(void);
void delay_nus(uint n);
void delay_nms(uint n);
void delay_ns(uint n);



uchar Cdotlib[][32]={
        {0x80,0x00,0x7F,0xFE,0x02,0x22,0x82,0x22,//脉
		 0xFF,0xFF,0x10,0x42,0x0C,0x48,0x43,0x48,
         0x80,0xC9,0x7F,0xFA,0x00,0xC0,0x03,0x20,
         0x0C,0x10,0x18,0x18,0x08,0x00,0x00,0x00},

		{0x02,0x10,0x42,0x10,0x81,0x10,0x7F,0xFF,//搏
         0x08,0x90,0x08,0x04,0x1B,0xF4,0x29,0x54,
         0x09,0x54,0x4B,0xFF,0x89,0x54,0x7D,0x55,
         0x0B,0xF6,0x08,0x04,0x08,0x00,0x00,0x00},
                                                  
        {0x08,0x40,0x87,0x7C,0x40,0x40,0x2F,0xFF, //频
         0x10,0x48,0x0F,0x6C,0x80,0x4A,0x8F,0xF2,
         0x40,0x12,0x20,0x1A,0x1F,0xD6,0x20,0x12,
         0x40,0x12,0xCF,0xFB,0x00,0x12,0x00,0x00},
                                                  
        {0x08,0x00,0x09,0x14,0x08,0xA4,0x08,0x44, //率
         0x09,0x04,0x09,0x24,0x09,0xB5,0xFF,0x6E,
         0x09,0x24,0x09,0x94,0x0B,0x04,0x08,0x44,
         0x08,0xA6,0x0D,0x14,0x08,0x00,0x00,0x00},
                                                  
       /* {0x00,0x00,0x00,0x00,0x33,0x00,0x33,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},*/
		 {
		 0x20,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,//Hz
		 0x01,0x00,0x21,0x08,0x3F,0xF8,0x20,0x08,
		 0x00,0x00,0x21,0x80,0x30,0x80,0x2C,0x80,
		 0x22,0x80,0x21,0x80,0x30,0x80,0x00,0x00},

        {0x02,0x10,0xFE,0x21,0x01,0x86,0x40,0x70,
		 0x7F,0x00,0x41,0x7E,0x41,0x4A,0x7F,0x4A,
         0x41,0x4A,0x41,0x4A,0x7F,0x4A,0x41,0x7E,
		 0x41,0x00,0x7F,0x00,0x40,0x00,0x00,0x00},

		{0x80,0x00,0x60,0x00,0x1F,0xFC,0x80,0x04,//度
		 0x80,0x24,0x42,0x24,0x46,0xFC,0x2A,0xA5,
         0x12,0xA6,0x12,0xA4,0x2A,0xFC,0x26,0x24,
         0x42,0x24,0xC0,0x24,0x40,0x04,0x00,0x00},
		{
		 0x00,0x00,0x00,0x18,0x00,0x24,0x00,0x24,//°C
		 0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
         0x07,0xC0,0x18,0x30,0x20,0x08,0x20,0x08,
		 0x20,0x08,0x10,0x08,0x08,0x38,0x00,0x00}
};


// 24点阵汉字演示,每个汉字72字节,每行3字节
uchar  Cdot24lib[10*9*8]={
/*--  文字:  江  --*/
/*--  华文行楷18;  此字体下对应的点阵为:宽x高=24x25   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0xCF,0x80,0x0F,
0xFE,0x4C,0x0F,0xC0,0x7C,0x01,0xF0,0x78,0x00,0x78,0x78,0x00,0xE0,0x70,0x00,0xE1,
0x00,0x00,0xE3,0x80,0x00,0xFF,0x80,0x00,0x7F,0x80,0x00,0x7F,0xC0,0x00,0x7F,0xC0,
0x00,0x77,0xC0,0x00,0xF3,0x80,0x00,0xF0,0x00,0x00,0xE0,0x00,0x00,0xC0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0x00,0x00,0x00,
/*--  文字:  西  --*/
/*--  华文行楷18;  此字体下对应的点阵为:宽x高=24x25   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x01,
0xFC,0x00,0x03,0xF0,0x00,0x03,0x18,0x00,0x03,0x9C,0xD0,0x03,0xFF,0x70,0x03,0xBF,
0x78,0x01,0x8E,0x78,0x01,0xCE,0x78,0x01,0xFE,0xF8,0x01,0xBF,0xFC,0x07,0x87,0xB8,
0x07,0xC6,0x10,0x03,0xFA,0x00,0x01,0xFE,0x00,0x00,0xFE,0x00,0x00,0x1C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0x00,0x00,0x00,
/*--  文字:  财  --*/
/*--  华文行楷18;  此字体下对应的点阵为:宽x高=24x25   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x3F,0xC0,0x07,
0x7F,0xE0,0x03,0xF0,0x30,0x01,0xFC,0xB8,0x01,0xFF,0x98,0x03,0xF0,0x18,0x07,0xFF,
0xF8,0x0F,0xFF,0xF0,0x05,0xC3,0x00,0x0C,0xE3,0x00,0x1C,0x73,0x80,0x18,0x3F,0x80,
0x3F,0xFF,0xEF,0x3F,0xFF,0xFF,0x1F,0x0F,0xFE,0x00,0x07,0xE0,0x00,0x00,0xE0,0x00,
0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  经  --*/
/*--  华文行楷18;  此字体下对应的点阵为:宽x高=24x25   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x3B,0xC0,0x0E,0x7B,0xC0,0x1F,
0x7D,0xE0,0x0F,0xFF,0xF0,0x01,0xFF,0xFE,0x00,0xFF,0x3E,0x0E,0x1F,0x3E,0x06,0x1D,
0xDC,0x06,0x7E,0x30,0x07,0xEF,0xB0,0x07,0xEF,0xF8,0x03,0xFF,0xF8,0x03,0xFF,0xFC,
0x02,0xFF,0x78,0x06,0x67,0x38,0x06,0x07,0x00,0x06,0x06,0x00,0x06,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  大  --*/
/*--  华文行楷18;  此字体下对应的点阵为:宽x高=24x25   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0E,
0x00,0x00,0x0E,0x18,0x00,0x0E,0x38,0x00,0x07,0xBC,0x00,0x07,0xFC,0x00,0x03,0xFF,
0x0C,0x00,0xFF,0xFE,0x00,0xDF,0xFC,0x00,0xCF,0xFC,0x01,0xC7,0xC0,0x01,0xC3,0xC0,
0x03,0x81,0xC0,0x07,0x81,0xC0,0x0F,0x81,0x80,0x0F,0x00,0x00,0x0E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  学  --*/
/*--  华文行楷18;  此字体下对应的点阵为:宽x高=24x25   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x7F,0x00,0x00,
0x0F,0x80,0x00,0x02,0xB8,0x03,0x83,0xF8,0x04,0xC1,0xFC,0x0C,0xCF,0xF0,0x1C,0xEF,
0xCF,0x18,0xFE,0xFF,0x1C,0x7E,0xF1,0x1F,0xFF,0x78,0x0F,0xFF,0x7E,0x03,0xF7,0xEF,
0x00,0xE3,0xE7,0x00,0x41,0xE0,0x00,0x01,0xE0,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  电  --*/
/*--  黑体16;  此字体下对应的点阵为:宽x高=21x21   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFF,0xE0,0x01,0xFF,0xE0,0x00,
0x62,0x20,0x00,0x62,0x20,0x00,0x62,0x20,
0x00,0x62,0x20,0x03,0xFF,0xFE,0x07,0xFF,
0xFE,0x04,0x62,0x20,0x04,0x62,0x20,0x04,
0x62,0x20,0x04,0x62,0x20,0x04,0x7F,0xE0,
0x04,0x7F,0xE0,0x06,0x00,0x00,0x07,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  子  --*/
/*--  黑体16;  此字体下对应的点阵为:宽x高=21x21   --*/
0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x0C,0x00,0x06,0x0C,0x00,
0x06,0x04,0x00,0x06,0x04,0x0C,0x06,0x04,0x0C,0x06,0x04,0x0C,0x06,0x04,0x07,0xFF,
0xC4,0x00,0x06,0x64,0x00,0x06,0x64,0x00,0x06,0x34,0x00,0x06,0x1C,0x00,0x06,0x1C,
0x00,0x06,0x0C,0x00,0x06,0x0C,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  学  --*/
/*--  黑体16;  此字体下对应的点阵为:宽x高=21x21   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0xC0,0x00,0x61,0xC0,0x00,0x60,0x44,0x00,
0x66,0x5C,0x00,0x62,0x58,0x00,0x62,0x40,0x0C,0x62,0x40,0x0C,0x62,0x46,0x0F,0xF2,
0x4E,0x07,0xFA,0x40,0x00,0x6A,0x40,0x00,0x6E,0x60,0x00,0x66,0x78,0x00,0x66,0x4E,
0x00,0x60,0x44,0x00,0x61,0xC0,0x00,0x61,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  院  --*/
/*--  黑体16;  此字体下对应的点阵为:宽x高=21x21   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x08,0x00,0x41,0x08,0x00,
0xC7,0xF8,0x00,0x7C,0x38,0x04,0x78,0x00,0x04,0x00,0x70,0x06,0x08,0x70,0x03,0x89,
0x10,0x01,0xF9,0x10,0x00,0x09,0x10,0x00,0x09,0x1E,0x07,0xF9,0x10,0x07,0xF9,0x10,
0x0C,0x09,0x10,0x0C,0x09,0x10,0x07,0x08,0x70,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};



int main()
{   
    uchar i,j;
	SREG |= 0x80;
	DDRC |= 0xC3;
	DDRB  = 0xFF;
	delay_nms(10);

    LCMInit(); //LCM初始化 
	delay_nms(2);
			
    LCMClear();

    WriteCommandLCM(DispOn); //写入LCM开显示屏幕指令
	WriteDataLCM(DispOnP1);  //写入P1参数,光标显示,
	delay_nus(20); 
    DrawRim();
	delay_nms(200);
	WriteCommandLCM(CsrDirDn);
	WriteCommandLCM(mWrite);
	for(i=3;i<120;i+=10)
    {
	  circle(120,120,i,1);
	  delay_nms(15);
	  }
	for(i=0;i<8;i++)
	PutCdotInGraph( 35,16*i,i,16);

	for(i=0;i<10;i++)
    PutCdotInGraph( 37,24*i,i,24);
	
	WriteCommandLCM(CsrDirR);
	
	for(i=0;i<3;i++)
	 for(j=0;j<4;j++)
	   
	   {Locatexy(37+i,236+j, 0);
	   WriteCommandLCM(mWrite);
       WriteDataLCM(0x00);}
   


    while(1); 
	return 0;
} 

/*=====================================================
       写指令函数,写数据函数,读读数据函数
            时序已调好08.5.2               
=====================================================*/
void WriteCommandLCM(uchar cmd)
{
    DDRB = 0xFF; 
    PORTB= cmd; 
     
    DDRC =0xC3;
	PORTC = 0x83; //CS=0,A0=1,RD=1,WR=1
	PORTC &= 0xFE;//CS=0,A0=1,RD=1,WR=0
	PORTC |= 0x01;//CS=0,A0=1,RD=1,WR=1
	PORTC |= 0x40;//CS=1,A0=1,RD=1,WR=1
    }

void WriteDataLCM(uchar data) //写数据参数
{
    DDRB = 0xFF; 
    PORTB = data; 
     
    DDRC = 0xC3;
	PORTC = 0x03; //CS=0,A0=0,RD=1,WR=1
	PORTC &= 0xFE;//CS=0,A0=0,RD=1,WR=0
	PORTC |= 0x01;//CS=0,A0=0,RD=1,WR=1
	PORTC |= 0x40;//CS=1,A0=0,RD=1,WR=1
    }

uchar ReadDataLCM(void) //读数据参数
{   
    uchar res;
	DDRC = 0xC3;
	PORTC = 0x83; //CS=0,A0=1,RD=1,WR=1
	PORTB = 0xFF;
	DDRB = 0x00;
	PORTC &= 0xFD;//CS=0,A0=1,RD=0,WR=1
	asm("nop");
	res = PINB;
	PORTC |= 0x02;//CS=0,A0=1,RD=1,WR=1
	PORTC |= 0x40;//CS=1,A0=1,RD=1,WR=1
	return res;
    }
/*===================================================*/

void LCMInit(void) //LCM初始化
{
    uint i;
    delay_nms(5);
	DDRC = 0xC3;
    WriteCommandLCM(SystemSet);     //写系统设置命令 
    for(i=0;i<8;i++) 
        { 
         WriteDataLCM(ParaSysTable[i]);   //写P1—P8参数 
        }; 
    delay_1us();

	WriteCommandLCM(Scroll);    //写显示区域设定命令 
	for(i=0;i<10;i++) 
        { 
         WriteDataLCM(ParaScrTableA[i]); 
        }; 
    delay_1us();

	WriteCommandLCM(HdotScr);   //写入点位移设置指令 
    WriteDataLCM(HdotScrP1);    //写入P1参数,点位移0
	delay_1us(); 

    WriteCommandLCM(Ovlay);     //写入区域合成设定指令 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -