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

📄 mylcd.c

📁 c8051f020LCD驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<c8051F020.h>
#include<math.h>
#include<INTRINS.H>
#define Uchar unsigned char
#define  bool unsigned char
#define  R_WORD  unsigned int data
#define  R_BYTE  unsigned char data
#define  C_BYTE  unsigned char code
typedef unsigned char    INT8U;
#define  BYTE  INT8U
#define  false  0
#define Key_Scan  P5
/*--  文字:  铭  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=32x33   --*/
C_BYTE  WLib_ming_32x32[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF8,0xF8,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xC0,0xFC,0x78,0x38,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xC0,0xF0,0xF8,0xDE,0xCF,0xC7,0x66,0x66,0x66,0x67,0x02,0x30,
0x38,0x3C,0x7E,0xE7,0xC3,0xC3,0xE3,0xF3,0x7F,0x1F,0x0F,0x07,0x02,0x00,0x00,0x00,
0x00,0x06,0x03,0x11,0x10,0x18,0x18,0x18,0xFF,0xFF,0x1F,0x0C,0x4C,0x6C,0x64,0x30,
0x38,0xFC,0xFC,0x3F,0x37,0x33,0x31,0x30,0x18,0x18,0xF8,0xF8,0x70,0x30,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x3F,0x3F,0x1E,0x0E,0x07,0x03,0x01,0x00,
0x00,0x0F,0x3F,0x1C,0x0C,0x0C,0x0C,0x06,0x06,0x07,0x07,0x07,0x00,0x00,0x00,0x00,
0x54,0x2B,0xDC,0x00,0x54,0x2B,0xDC,0x00,0x20,0x00,0x00,0x00,0x32,0x30,0x30,0x34,
0x2D,0x39,0x2D,0x31,0x30,0x20,0x31,0x36,0x3A,0x34,0x36,0x3A,0x20,0x00,0x00,0x00
};
/*--  文字:  朗  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=32x33   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=39x33  --*/
C_BYTE  WLib_lang_32x32[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x38,0xF8,0xB0,0x00,0x00,
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x36,0x32,0x33,0x33,0xC3,0xFF,0xFF,0x07,
0x00,0x01,0xFF,0xFF,0x61,0x61,0x61,0x21,0x01,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xC3,0xC3,0xE3,0x6B,0x3B,0x7B,0x70,0x00,
0xC0,0xF8,0x7F,0x0F,0x0C,0x0C,0x0C,0x04,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x07,0x0F,0x07,0x03,0x01,0x00,0x20,0x20,0x30,0x18,0x0C,0x0F,
0x07,0x01,0x00,0x00,0x00,0x04,0x0C,0x1C,0x7C,0x7F,0x1F,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
};
/*--  文字:  科  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=32x33   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=39x33  --*/
C_BYTE  WLib_ke_32x32[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xE0,0x70,0x78,0x70,0x20,
0x00,0x00,0x00,0x00,0x00,0x04,0x7C,0xFC,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0xC0,0xE0,0xE0,0xE1,0x61,0x61,0xF1,0xF0,0xFF,0xFF,0xB8,0x98,0x98,0x18,
0x00,0x11,0x33,0x73,0x67,0x02,0x00,0xFF,0xFF,0x00,0x00,0x80,0x80,0x80,0x80,0x00,
0x00,0x80,0xC0,0x60,0x70,0x38,0x1C,0x0F,0x07,0x83,0xFF,0xFF,0x01,0x03,0x03,0x0C,
0x0C,0x0C,0x0E,0x06,0x06,0x06,0x06,0xFF,0xFF,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,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
};

/*--  文字:  技  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=32x33   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=39x33  --*/
C_BYTE  WLib_ji_32x32[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0xFC,0xFC,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x8C,0xFC,0xFC,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,0x8C,0x8C,0x0C,0x00,0x0C,0x0C,
0x0C,0x8C,0xFF,0xFF,0x87,0xC7,0xC7,0xC3,0x83,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
0x30,0x70,0x70,0x70,0x38,0x1C,0x0C,0x0E,0xFF,0xFF,0x01,0x00,0x00,0x01,0x0F,0x0F,
0x1B,0xB1,0xF1,0xF1,0xFD,0xDF,0x8F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3E,0x3F,0x0F,0x00,0x08,0x0C,0x0C,0x06,0x06,
0x03,0x03,0x01,0x00,0x00,0x01,0x03,0x07,0x0F,0x1E,0x1E,0x1C,0x1C,0x1C,0x18,0x08,
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
};

/*--  文字:  W  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=10x8   --*/
C_BYTE  WLib_W_10x8[]={
0x02,0x0e,0x70,0xc2,0x3e,0x32,0xc0,0x72,0x0e,0x02
};
/*--  文字:  M  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=9x8   --*/
C_BYTE  WLib_M_9x8[]={
0x82,0xfe,0x8e,0x70,0x80,0x70,0x8e,0xfe,0x82
};
/*--  文字:  L  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=6x8   --*/
C_BYTE  WLib_L_6x8[]={
0x82,0xfe,0x82,0x80,0xc0,0x00
};
/*--  文字:  A  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=7x8   --*/
C_BYTE  WLib_A_7x8[]={
0x80,0xe0,0xbc,0x22,0x3c,0xe0,0x80
};
/*--  文字:  R  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=7x8   --*/
C_BYTE  WLib_R_7x8[]={

0x82,0xFe,0x92,0x32,0x52,0x8c,0x80
};
/*--  文字:  C  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=7x8   --*/
C_BYTE  WLib_C_7x8[]={
0x00,0x7c,0x82,0x82,0x84,0x46,0x00
};
/*--  文字:  O  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=7x8   --*/
C_BYTE  WLib_O_7x8[]={
0x00,0x7c,0x82,0x82,0x82,0x7c,0x00
};
/*--  文字:  .  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=4x8   --*/
C_BYTE  WLib_dot_4x8[]={
0x00,0xc0,0xc0,0x00
};
/*--  文字:  T  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_T_6x8[]={
0x00,0x06,0x82,0xfe,0x82,0x06
};
/*--  文字:  e  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_e_5x8[]={
0x00,0x70,0xa8,0xa8,0xb0
};
/*--  文字:  l  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_l_4x8[]={
0x00,0x82,0xfe,0x80
};
/*--  文字:  :  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_ddot_3x8[]={
0x00,0x6c,0x6c
};
/*--  文字:  -  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_line_6x8[]={
0x00,0x10,0x10,0x10,0x10,0x10
};
/*--  文字:  1  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=4x8   --*/
C_BYTE  WLib_1_4x8[]={
0x00,0x84,0xFe,0x80
};

/*--  文字:  2  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_2_5x8[]={
0x00,0xc4,0xa2,0x92,0x8c
};

/*--  文字:  3  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_3_5x8[]={
0x00,0x44,0x92,0x92,0x6c
};

/*--  文字:  4  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=6x8   --*/
C_BYTE  WLib_4_6x8[]={
0x00,0x30,0x28,0x24,0xfe,0x20
};

/*--  文字:  5  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_5_5x8[]={
0x00,0x4e,0x8a,0x8a,0x72
};

/*--  文字:  6  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=6x8   --*/
C_BYTE  WLib_6_5x8[]={
0x00,0x7c,0x92,0x92,0x60
};

/*--  文字:  7  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_7_5x8[]={
0x00,0x02,0xf2,0x0a,0x06
};

/*--  文字:  8  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_8_5x8[]={
0x00,0x6c,0x92,0x92,0x6c
};

/*--  文字:  9  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_9_5x8[]={
0x00,0x0c,0x92,0x92,0x7c
};

/*--  文字:  0  --*/
/*--  Times New Roman8;  此字体下对应的点阵为:宽x高=5x8   --*/
C_BYTE  WLib_0_5x8[]={
0x00,0x7c,0x82,0x82,0x7c
};



//////////////////////////////////////////////////////////////////////////////////////////////////////
/*注:c8051F020的晶振频率为22.1184MHz*/

/***********常用操作命令和参数定义***************/
#define	 DISPON		0x3f		/*显示on*/
#define	 DISPOFF	0x3e		/*显示off */
#define	 DISPFIRST	0xc0		/*显示起始行定义*/
#define	 SETX		0x40		/*X定位设定指令(列)*/
#define	 SETY		0xb8		/*Y定位设定指令(页)*/

#define MAX_BIT_X 128
#define MAX_BIT_Y 64

#define  DISABLE_INTERRUPTS   EA=0	
#define	 ENABLE_INTERRUPTS    EA=1

/****************全局变量定义*******************/
Uchar col,row,cbyte;			/*列x,行(页)y,输出数据*/
bit xy;							/*画线方向标志:1水平*/
unsigned int xdata addr;
unsigned char xdata *tp;
unsigned char xdata et;
/*****************函数列表**********************/

void  Delay(Uchar);				/*延时,入口数为Ms */

void  checkbusy(void);
void  lcd_wrct(unsigned char dd);
void  set_xy(unsigned char x,unsigned char y);
void  lcd_wrda(unsigned char x,unsigned char y,unsigned char dd);
unsigned char lcd_rdda(unsigned char x,unsigned char y);
void  lcd_init(void);
void  LCD_Draw_dot(BYTE x,BYTE y,bool flag);
bool  LCD_Draw_line(BYTE x1,y1,x2,y2,bool flag);
void  LCD_Draw_circle(BYTE x,BYTE y,BYTE r,bool flag);
void  LCD_Draw_Rectangle(BYTE  x1,y1,x2,y2, bool flag);
void  LCD_Draw_FillRectangle(BYTE  x1,y1,x2,y2, bool flag);
void  LCD_Draw_byte(BYTE x,y, BYTE value);
void  LCD_Disp_Word(BYTE x,y,BYTE code *p,BYTE line,length);
void  LCD_Disp_Word_F(BYTE x,y,BYTE code *p,BYTE line,length);
void  dis_clr(void);
void  dis_full(void);
void  dis_start(void);
///////////////////////////////////////////////////////////////////////////
//	SelectCommon();
//	SelectWrite();
//	SelectLCD();
///////////////////////////////////////////////////////////////////////////
void SYSCLK_Init (void)
{
   int i;                              // delay counter

   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal

   for (i=0; i < 256; i++) ;           // Wait for osc. to start up

   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock                                      // detector
}


void PORT_Init (void)
{
	XBR0   =   0x8f;                    // Set XBR0
	XBR1   =   0x1e;                    // Set XBR1
	XBR2   =   0x44;                    // Enable crossbar and weak pull-ups
   
	P0MDOUT = 0x34;
	P1MDOUT = 0xfc;
	P2MDOUT = 0xcf;
	P3MDOUT = 0xff;					// enable P3.5 (LED) as push-pull output
    P74OUT  = 0xf7;
    P4 = 0x00;
    EMI0CF=0x2d;
    EMI0TC=0X9e;
}

//lcd init
void lcd_init(void)                                           
  {

	DISABLE_INTERRUPTS;//EA=0	
//	SelectLeft();
//	SelectRight();
//	SelectLCD();

	addr=0x980c;

	lcd_wrct(0xc0);
	lcd_wrct(0x40);		// COLOUM ADDRESS
	lcd_wrct(0xb8);		// ROW ADDRESS
	lcd_wrct(0x3f);

	ENABLE_INTERRUPTS;  //EA=1   

 }

void  dis_start0(void)
{
	LCD_Disp_Word(0,32,WLib_ming_32x32,4,32);
	LCD_Disp_Word(32,32,WLib_lang_32x32,4,32);
	LCD_Disp_Word(64,32,WLib_ke_32x32,4,32);
	LCD_Disp_Word(96,32,WLib_ji_32x32,4,32);

	LCD_Disp_Word(8,16,WLib_W_10x8,1,10);
	LCD_Disp_Word(19,16,WLib_W_10x8,1,10);
	LCD_Disp_Word(30,16,WLib_W_10x8,1,10);
	LCD_Disp_Word(41,16,WLib_dot_4x8,1,4);
	LCD_Disp_Word(46,16,WLib_M_9x8,1,9);
	LCD_Disp_Word(57,16,WLib_L_6x8,1,6);
	LCD_Disp_Word(63,16,WLib_A_7x8,1,7);
	LCD_Disp_Word(71,16,WLib_R_7x8,1,7);
	LCD_Disp_Word(79,16,WLib_M_9x8,1,9);
	LCD_Disp_Word(90,16,WLib_dot_4x8,1,4);
	LCD_Disp_Word(94,16,WLib_C_7x8,1,7);
	LCD_Disp_Word(102,16,WLib_O_7x8,1,7);
    LCD_Disp_Word(110,16,WLib_M_9x8,1,9);

	LCD_Disp_Word(11,2,WLib_T_6x8,1,6);
	LCD_Disp_Word(17,2,WLib_e_5x8,1,5);
	LCD_Disp_Word(22,2,WLib_l_4x8,1,4);
	LCD_Disp_Word(27,2,WLib_ddot_3x8,1,3);

	LCD_Disp_Word(34,2,WLib_0_5x8,1,5);
	LCD_Disp_Word(39,2,WLib_2_5x8,1,5);
	LCD_Disp_Word(44,2,WLib_9_5x8,1,5);
	LCD_Disp_Word(49,2,WLib_line_6x8,1,6);
	LCD_Disp_Word(55,2,WLib_8_5x8,1,5);
	LCD_Disp_Word(60,2,WLib_8_5x8,1,5);
	LCD_Disp_Word(65,2,WLib_2_5x8,1,5);
	LCD_Disp_Word(70,2,WLib_2_5x8,1,5);
	LCD_Disp_Word(75,2,WLib_3_5x8,1,5);
	LCD_Disp_Word(80,2,WLib_5_5x8,1,5);
	LCD_Disp_Word(85,2,WLib_9_5x8,1,5);
	LCD_Disp_Word(90,2,WLib_7_5x8,1,5);
	LCD_Disp_Word(95,2,WLib_line_6x8,1,6);
	LCD_Disp_Word(101,2,WLib_8_5x8,1,5);
	LCD_Disp_Word(106,2,WLib_0_5x8,1,5);
	LCD_Disp_Word(111,2,WLib_2_5x8,1,5);
}

unsigned char GetScanKey(void)
{
	unsigned char key, i, temp;

	key=0xff;

	for (i=1; i<0x10; i<<=1)//i的低4位为行数位
	{
        Key_Scan |= 0x0f;//保留高4位,低4位置1
		Key_Scan &= ~i;  //取行数位
     	
		temp = Key_Scan; //取高4位列数位
		temp = ~temp;    //取反
		temp>>=4;		 //右移4位

		if (temp!=0x00)  //有键值
		{                
            key = i<<4;  //左移4位
			key|=temp;   //取键值
			break;
		}
	}
	return key;          //返回行位(高四)和列位(低四)
}


unsigned char SetKey(unsigned char key)
{
	switch(key)
	{
		case 0x11: 		return 0x3f;//0
		case 0x21: 		return 0x06;//1
		case 0x12: 		return 0x5b;//2
		case 0x22: 		return 0x4f;//3
		case 0x14: 		return 0x66;//4
		case 0x24: 		return 0x6d;//5
		case 0x18: 		return 0x7d;//6	
		case 0x28: 		return 0x07;//7
		case 0x41: 		return 0x7f;//8
		case 0x81: 		return 0x6f;//9
		case 0x42: 		return 0x77;//a
		case 0x82: 		return 0x7c;//b
		case 0x44: 		return 0x39;//c
		case 0x84: 		return 0x5e;//d
		case 0x48: 		return 0x79;//e
		case 0x88: 		return 0x71;//f
		default: 		return 0x00;
	}
}
/****************************************主程序*****************************************/
void main(void)
{
	unsigned char gt;
	unsigned char key;
	int j;
   WDTCN = 0xde;                       // disable watchdog timer
   WDTCN = 0xad;

  SYSCLK_Init ();                     // initialize oscillator
 //OSCICN=0x97;//内部16M
//	OSCICN=0x96;//内部8M
//OSCICN=0x95;//内部4M
//OSCICN=0x94;//内部2M
   PORT_Init ();                       // initialize crossbar and GPIO

	lcd_init();

	dis_full();
	Delay(5000);
	dis_clr();
	Delay(5000);


	dis_start0();

    while(1)
    {
		key=GetScanKey();	//调用键盘扫描函数,返回的键值送变量key
		if(key!=0xFF)
		{
			P4|=0x10;		//响铃
			for(j=0;j<500;j++);
			P4&=0xef;		//关闭铃声

			gt=SetKey(key);
			switch (gt)
			{
				case 0x77:  	
					dis_clr();
					LCD_Draw_dot(63,31,1);
					break;
				case 0x7c:		
					dis_clr();
					LCD_Draw_line(0,1,127,63,1);
					break;
				case 0x39:		
					dis_clr();

⌨️ 快捷键说明

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