📄 mylcd.c
字号:
#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 + -