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

📄 freescale

📁 Freescale 系列单片机常用模块与综合系统设计
💻
字号:
 #include  "PE_Types.h"
#include  "LCD_Data.h"
#include  "LCD_E.h"
#include  "LCD_DI.h"
#include  "LCD_RW.h"
#include  "LCD_CS1.h"
#include  "LCD_CS2.h"
#include  "LCD128_64.h"

typedef struct typFNT_ASC16	/* 汉字字模显示数据结构 */
{
    char Index[1];
    char Msk[16];
};

const struct typFNT_ASC16  ASC_16[] = 
{	/* 显示为8*16  Curier 10 常规*/
"1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00,
"2",0x00,0x00,0x08,0x04,0x84,0x44,0x38,0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x00,
"3",0x00,0x00,0x08,0x04,0x44,0x44,0xB8,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
"4",0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x00,0x00,0x01,0x01,0x05,0x07,0x05,0x00,
"5",0x00,0x00,0x7C,0x44,0x44,0x44,0x84,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
"6",0x00,0x00,0xF0,0x48,0x44,0x44,0x80,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
"7",0x00,0x00,0x0C,0x04,0x84,0x64,0x1C,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,
"8",0x00,0x00,0xB8,0x44,0x44,0x44,0xB8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
"9",0x00,0x00,0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01,0x00,
"0",0x00,0x00,0xF8,0x04,0x04,0x04,0xF8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
".",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
",",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00,
":",0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
";",0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00,
"-",0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"_",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
"A",0x00,0x00,0x80,0x64,0x1C,0x60,0x80,0x00,0x00,0x04,0x07,0x05,0x01,0x05,0x07,0x04,
"B",0x00,0x04,0xFC,0x44,0x44,0x44,0x44,0xB8,0x00,0x04,0x07,0x04,0x04,0x04,0x04,0x03,
"C",0x00,0xF0,0x08,0x04,0x04,0x04,0x04,0x08,0x00,0x01,0x02,0x04,0x04,0x04,0x04,0x02,
"D",0x00,0x04,0xFC,0x04,0x04,0x04,0x08,0xF0,0x00,0x04,0x07,0x04,0x04,0x04,0x02,0x01,
"E",0x00,0x04,0xFC,0x44,0x44,0xE4,0x04,0x0C,0x00,0x04,0x07,0x04,0x04,0x04,0x04,0x06,
"F",0x00,0x04,0xFC,0x44,0x44,0xE4,0x04,0x0C,0x00,0x04,0x07,0x04,0x04,0x00,0x00,0x00,
" ",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"=",0x00,0x00,0xA0,0xA0,0xA0,0xA0,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"(",0x00,0x00,0x00,0xE0,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x00,0x00,
")",0x00,0x00,0x00,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x00,0x10,0x0C,0x03,0x00,0x00,
"V",0x00,0x04,0x3C,0xC4,0x00,0xC4,0x3C,0x04,0x00,0x00,0x00,0x01,0x06,0x01,0x00,0x00,
"m",0x00,0x20,0xE0,0x20,0xC0,0x20,0xC0,0x00,0x00,0x04,0x07,0x00,0x07,0x00,0x07,0x04,
"H",0x00,0x04,0xFC,0x44,0x40,0x44,0xFC,0x04,0x00,0x04,0x07,0x04,0x00,0x04,0x07,0x04,
"*",0x90,0x90,0x60,0xFC,0x60,0x90,0x90,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
};

byte CurOffset,CurRow,CurPage,CurCol;	

void LCD_BUSY(byte lr) //判断忙标志
{
    __DI();                              /* Disable interrupts */
    if(lr == RIGHT)
    {
        LCD_CS2_ClrVal();  //cs2=0 
        LCD_CS1_SetVal();	  //cs1=1
    }
    else
    {
        LCD_CS2_SetVal();  //cs2=1 
        LCD_CS1_ClrVal();	  //cs1=0
    }	
    LCD_DI_ClrVal();       //选择命令端口
    LCD_Data_SetDir(0);  //设置端口D为输入	
    LCD_RW_SetVal();	  //读		
    LCD_E_SetVal();					
    asm("nop");	
    asm("nop");
    asm("nop");
    asm("nop");
    while(LCD_Data_GetVal() & LCD_STATUS_BUSY)
    {
        LCD_E_ClrVal();  		
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        LCD_E_SetVal();
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
    }
    LCD_E_ClrVal();
    LCD_RW_ClrVal();	  //写	
    __EI();                              /* Enable interrupts */
}

void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
{	
    __DI();                              /* Disable interrupts */
    LCD_BUSY(lr);
    if(cd==CMD)
    {
        LCD_DI_ClrVal();       //选择命令端口
    }
    else
    {
        LCD_DI_SetVal();       //选择数据端口
    }
    LCD_RW_ClrVal();	  //写	
    LCD_E_SetVal();
    LCD_Data_SetDir(1);  //设置端口D为输出	
    LCD_Data_PutVal(data);
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
     LCD_E_ClrVal();
    __EI();                              /* Enable interrupts */
}

unsigned char read_LCD(unsigned char lr)	  /*  读显示数据 */
{
    unsigned char data;

    LCD_BUSY(lr);
    LCD_DI_SetVal();       //选择数据端口
    LCD_Data_SetDir(0);  //设置端口D为输入	
    LCD_RW_SetVal();	  //读		
    LCD_E_SetVal();			
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    data=LCD_Data_GetVal();
    LCD_E_ClrVal();	
    LCD_RW_ClrVal();	  //写		
    LCD_BUSY(lr);
    LCD_DI_SetVal();       //选择数据端口
    LCD_Data_SetDir(0);  //设置端口D为输入	
    LCD_RW_SetVal();	  //读		
    LCD_E_SetVal();	
    asm("nop");	
    asm("nop");
    asm("nop");
    asm("nop");
    data=LCD_Data_GetVal();
     LCD_E_ClrVal();	
    LCD_RW_ClrVal();	  //写		
    
    return data;
}

void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63
{
    write_LCD(LEFT,CMD,0xc0|line); 
}

void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
{
    write_LCD(RIGHT,CMD,0xc0|line); 
}

void set_page_L(unsigned char page)	/*设置X地址 设置页*/  //0-7
{
    write_LCD(LEFT,CMD,0xb8|page);                     
}
void set_page_R(unsigned char page)	/*设置X地址 设置页*/ //0-7
{
    write_LCD(RIGHT,CMD,0xb8|page);                     
}

void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
{
    write_LCD(LEFT,CMD,0x40|col);                     
}

void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
{
    write_LCD(RIGHT,CMD,0x40|col);                     
}

void init_lcd(void) /*初始化函数*/
{
    set_start_line_L(0); /*显示起始行为0*/
    set_start_line_R(0); /*显示起始行为0*/
    write_LCD(LEFT,CMD,DISPLAY_ON); /*  开显示  */
    write_LCD(RIGHT,CMD,DISPLAY_ON); /*  开显示  */
}

unsigned char GetPage(void) /*得到当前页*/
{
   return CurPage;
}

unsigned char GetCol(void) /*得到当前列*/
{
   return CurCol;
}

void clr_lcd(void) /*清屏函数*/
{
    unsigned char pages,i;
    for(pages=0;pages<8;pages++)
    {
        set_page_L(pages);  /* X 页地址 */
        set_page_R(pages);  /* X 页地址 */
        for(i=0;i<64;i++)   
        {
            set_col_addr_L(i);//Y
            set_col_addr_R(i);//Y
            write_LCD(LEFT,DATA,0x0);
            write_LCD(RIGHT,DATA,0x0);
        }
    }
}

void SetPageCol(unsigned char upage, unsigned char ucol) /* 设置液晶的页和列 */
{
	CurPage = upage;
	CurCol = ucol;
	if(ucol<64)
	{
		set_page_L(upage);
		set_col_addr_L(ucol);
	}
	else
	{
		set_page_R(upage);
		set_col_addr_R(ucol-64);
	}
}

/* 设置当前显示的页和列 */
void SetRowCol(unsigned char urow, unsigned char ucol) 
{
	unsigned char page;
	CurRow = urow;
	CurCol = ucol;
	
	switch(urow)
	{
		case 1:
			page=0;
			CurOffset=1;
			break;
		case 2:
			page=1;
			CurOffset=2;
			break;
		case 3:
			page=3;
			CurOffset=1;
			break;
		case 4:
			page=4;
			CurOffset=2;
			break;
		case 5:
			page=6;
			CurOffset=1;
			break;
	}
	SetPageCol(page,ucol);
}

void disp_ch(unsigned char c)
{
	unsigned char k,j,uPage,uCol,ch_r,ch_w;
	unsigned char width;
	unsigned char len;
	uPage = GetPage();
	uCol = GetCol();
	len=sizeof(ASC_16)/sizeof(ASC_16[0]);
	for(k=0;k<len;k++)
	{
		if(c == ASC_16[k].Index[0] ) break;
	}
	if(k<len)
	{
		
		if(c=='-'||c==':') 
			width=ASC_CHR_WIDTH-2;
		else if(c=='|')
			width=ASC_HZ_WIDTH-ASC_CHR_WIDTH;
		else 
			width=ASC_CHR_WIDTH;
		
		if(CurOffset==1) //下半部是写半个字节
		{
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage,uCol+j);
				ch_w=ASC_16[k].Msk[j];
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
			}
			SetPageCol(uPage+1,uCol);
			
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage+1,uCol+j);
				if(uCol+j<64) ch_r=read_LCD(LEFT);
				else ch_r=read_LCD(RIGHT);
				ch_r&=0xf0;
				ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j]&0x0f; 
				ch_w|=ch_r;
				SetPageCol(uPage+1,uCol+j);
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w); 
			}
		}
		else //上半部是写半个字节
		{
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage,uCol+j);
				if(uCol+j<64) ch_r=read_LCD(LEFT);
				else ch_r=read_LCD(RIGHT);
				ch_r&=0x0f;
				ch_w=ASC_16[k].Msk[j];
				ch_w=ch_w<<4;
				ch_w|=ch_r;
				SetPageCol(uPage,uCol+j);
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w); 
			}
			SetPageCol(uPage+1,uCol);
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage+1,uCol+j);
				
				ch_r=ASC_16[k].Msk[j];
				ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j];
				ch_r=ch_r>>4;
				ch_w=ch_w<<4; 
				ch_w|=ch_r;
				SetPageCol(uPage+1,uCol+j);
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w); 
			}
		}
	}
	SetPageCol(uPage,uCol+width);
}

void disp_str(unsigned char *p)
{
	unsigned char i=0;
	while(p[i]>0)
	{
		if(p[i] < 128)
		{	/* ASCII */
			disp_ch(p[i]);
		}
		i++;
	}
}

⌨️ 快捷键说明

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