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

📄 lcd.c

📁 基于F020单片机的简易音频信号分析仪的实现keil程序(C实现)。2007年9月全国大学生电子设计竞赛题目(获得省2等奖)所有要求功能都实现。希望对感兴趣的朋友有帮助!
💻 C
字号:
#define   LCD_GLOBALS
#include "includes.h"

#define uchar unsigned char 
#define uint unsigned int 


typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       signed char Index[2];               // 汉字内码索引
       char  Msk[32];                       // 点阵码数据
};

/*	以下几个程序是液晶状态字判断程序*/
//#pragma disable    //关中断
uchar lcd_busy(void)
{
 	uchar dat;
//	P7 = 0xff;
  	dat=lcd_control;
	return(dat);
}

//#pragma disable
/*read-write instruct or data states*/
void lcd_st01(void)
{
 	while((lcd_busy()&3)!=3){;}
}


//#pragma disable
/*data auto-write state*/
void lcd_st3(void)
{
 	while ((lcd_busy()&8)!=8){;}
}

//#pragma disable
/*write lcd control instruct*/
void lcd_ctrl(uchar dat)
{
 	lcd_st01();
 	lcd_control=dat;
}

//#pragma disable
/*write lcd data */
void lcd_write(uchar dat)
{
 	lcd_st01();
 	lcd_data=dat;
}

//#pragma disable
/*auto write*/
void lcd_autowrite(uchar dat)
{
 	lcd_st3();
 	lcd_data=dat;
}

/*	液晶初始化程序	*/
//#pragma disable
/*lcd initial*/
void lcd_initial()
{
 /*text start address */
 	lcd_write(0x00);lcd_write(0x10);lcd_ctrl(0x40);//1000H
 /*set text zone width */
 	lcd_write(0x10);lcd_write(0x00);lcd_ctrl(0x41);//0000H
 /*graph start address */
 	lcd_write(0x00);lcd_write(0x00);lcd_ctrl(0x42);//
 /*set graph zone width*/
 	lcd_write(0x10);lcd_write(0x00);lcd_ctrl(0x43);
 /*cgrom 00h~7fh,cgram 80h~ffh ,logical or */
 	lcd_ctrl(0x80);
 /*open text,graph and close cursor */
 	lcd_ctrl(0x9c);
 /*cursor shape :8*8 */
    lcd_ctrl(0xa0);
 /*cursor position*/
 lcd_write(0x0f);lcd_write(0x09);lcd_ctrl(0x21);
}

/*	清空T6963控制器内存,共8K*/
void lcd_clear_ram()
{
 	uint i;
 	lcd_write(0x00);lcd_write(0x00);lcd_ctrl(0x24);
 	lcd_ctrl(0xb0);
 	for(i=0;i<8192;i++)
 	{
  		lcd_autowrite(0x00);
 	}
 	lcd_ctrl(0xb2);
}

void lcd_clear(uchar x,uchar y,uchar m ,uchar n ){   //任意长度的清屏函数
                                                     //x,y分别是128,64内对应的地址
													 //m,n分别是所要清的内容的长和宽
  	uint i,j;
	for(i=0;i<n;i++)
	  for(j=0;j<m;j++){
		  showdot0(x+j,y-i); 		 
	  }
}


/*	以下是图形显示子程序	*/

/*set graph x and y */
/* 0------------->x */
/* |                */
/* |                */
/* |                */
/*\|/               */
/* y                */
/*	如果是采用清华蓬远T240128图形点阵液晶	*/
/*	下面这个函数lcd_set_graph()中第二条语句*/
/*	y应该乘以30(240/30)其他型号依此类推*/
void lcd_set_graph(uint x,uint y)           //将图形在屏幕上的图形地址转化为内存里的地址
{
 	uint xy;
 	xy=y*16+x;lcd_write(xy&0xff);
 	xy=xy/256;//must use 256,not 0xff
 	lcd_write(xy);lcd_ctrl(0x24);
}



/* display 8 dots*/
void lcd_disp8(uchar dat)       //在一个地址__8位里打点,dat是几就打对应位子的点
{	lcd_write(dat);
	lcd_ctrl(0xc0);
}

void showdot(unsigned int x,unsigned int y){      //在任意位置显示一个点
     lcd_set_graph(x/8,63-y);
     lcd_ctrl(7-x%8+0xf8);
}

void showdot0(unsigned int x,unsigned int y){      //在任意一个点处显示一点空白
     lcd_set_graph(x/8,63-y);
     lcd_ctrl(7-x%8+0xf0);
}



/*	显示16x8图形点阵的子程序*/ 
/*	字符库为asc[]*/

void lcd_disp1608(uint x,uint y,uchar n)       //在某一位置处显示显示一个字符 n表该字符在数组中的序号
{                                              //显示字符,上下间间隔1,左右间间隔1
 	uchar i;  uint j;
 	for(i=0;i<16;i++)
 	{
  		lcd_set_graph(x,y+i);
  		j=n*16+i;
  		lcd_disp8(asc8[j]);
 	}
}

/**************************************************************************/
/*      显示8*8的ASC字母                                                  */
/**************************************************************************/
void  lcd_disp88( uchar x, uchar y, char* s, uchar xor )//横向,纵向按字节
{
  uchar name, i;                                      //要想能滑动显示最好用些种方法显示字符或字符串
  uint start;
  while ( *s )
  {
    name = * s;
    start = ( name - 32 )* 8;
    for ( i = 0; i < 8; i++ )
    {
      lcd_set_graph( x, y + i );
      if ( xor == 0 )
      {
        lcd_disp8( nAsciiDot[start + i] );
      }
      if ( xor == 1 )
      {
        lcd_disp8( 255-nAsciiDot[start + i] );
      }
    }
    s += 1;
    x += 1;
    if ( x >= 16 )
    { x=0;
      y += 8;
    }
  }
}



/*	显示16x16图形点阵的子程序*/ 
/*	字符库为hzk02[]*/
void lcd_disp1616(uint x,uint y,uchar n)  //在某一位置处显示显示一个16*16汉字 n表该字符在数组中的序号
{                                             //显示汉字 上下行间间隔16,左右间间隔2
 	uchar i;  uint j;
 	for(i=0;i<16;i++)
 	{
  		lcd_set_graph(x,y+i);
  		j=n*32+i*2;
  		lcd_disp8(hzk02[j]);
  		lcd_disp8(hzk02[j+1]);
 	}
}

void lcd_disp3232(uint x,uint y,uchar n)     //左右间间隔32/8=4,上下间间隔32.
{
 	uchar i;uint j;
 	for(i=0;i<32;i++)
 	{
  		lcd_set_graph(x,y+i);
  		j=n*128+i*4;
  		lcd_disp8(hzk03[j]);
  		lcd_disp8(hzk03[j+1]);
  		lcd_disp8(hzk03[j+2]);
    	lcd_disp8(hzk03[j+3]);
 	}
}


/*	显示16x24图形点阵的子程序*/ 
/*	字符库为hzk00[]*/

/*void lcd_disp1624(uint x,uint y,uchar n)
{
 	uchar i;  uint j;
 	for(i=0;i<24;i++)
 	{
  		lcd_set_graph(x,y+i);
  		j=n*48+i*2;
  		lcd_disp8(hzk00[j]);
  		lcd_disp8(hzk00[j+1]);
 	}
}*/

/*	显示16x24图形点阵的子程序*/ 
/*display 24x24 dots */
/*	字符库为hzk01[]*/

/*void lcd_disp2424(uint x,uint y,uchar n)     //左右间间隔24/8=3,上下间间隔24.
{
 	uchar i;uint j;
 	for(i=0;i<24;i++)
 	{
  		lcd_set_graph(x,y+i);
  		j=n*72+i*3;
  		lcd_disp8(hzk01[j]);
  		lcd_disp8(hzk01[j+1]);
  		lcd_disp8(hzk01[j+2]);
 	}
}*/


/////////////////////////////////////////

/*	以下几个函数为文本特征下*/
/*set graph x and y */
/* 0------------->x */
/* |                */
/* |                */
/* |                */
/*\|/               */
/* y                */
/*	如果是采用清华蓬远T240128图形点阵液晶	*/
/*	下面这个函数lcd_set_graph()中第二条语句*/
/*	y应该乘以30(240/30)其他型号依此类推*/

/*set text x and y*/
void lcd_set_text(uint x,uint y)                      //将文本地址转化为内存里的地址
{
 uint xy;
 xy=y*16+x+16*256;lcd_write(xy&0xff);
 xy=xy/256;lcd_write(xy);lcd_ctrl(0x24);
}

//x为行字节数,y为列字节数
void lcd_disp_text(uchar x,uchar y,uchar ccode) //在某一指定位置显示一个字符,ccode是该字符在ROM表中的位置
{                                                //故要显示字母或数字时 ccode=字母或数字+0X10;   
 lcd_set_text(x,y);
 lcd_write(ccode);lcd_ctrl(0xc4);
}


void lcd_disp_char(uchar x,uchar y,uchar ccode){  //在某一指定位置显示一个字符 ccode 是该字符的ASC码值
    lcd_set_text(x,y);
    lcd_write(ccode-0x20);lcd_ctrl(0xc0);
}

void lcd_disp_string(uchar x,uchar y,uchar ccode[],uchar length){//在某一指定位置显示一个字符串 ccode是;                                                                  
    uchar i;                                                       //用双引号引起的字符串
   for(i=0;i<length;i++){
	    lcd_disp_char(x+i,y,ccode[i]);
	  }
}



/* first write a text letter on graph zone,then write char-attribe
/*  on graph zone.NOTE: address must be the same.  */
/*void lcd_text_attr(uchar x,uchar y,uchar cattr)
{
 lcd_set_graph(x,y);
 lcd_write(cattr);lcd_ctrl(0xc0);//char-attr write on graph zone accordingly.
}*/


/*	建立自定义字库1,字符库为hzk1[]*/

/*void lcd_set_cgram1(void)
{
 uint i;
 lcd_write(0x03);//1800-1fffh
 lcd_write(0x00);lcd_ctrl(0x22);
 lcd_write(0x00);lcd_write(0x1c);
 lcd_ctrl(0x24);lcd_ctrl(0xb0);
 for(i=0;i<0x400;i++)//1k
 {
  lcd_autowrite(hzk1[i]);
 }
 lcd_ctrl(0xb2);
}
/*	建立自定义字库2,字符库为hzk2[]*/

/*void lcd_set_cgram2(void)
{
 uint i;
 lcd_write(0x03);//1800-1fffh
 lcd_write(0x00);lcd_ctrl(0x22);
 lcd_write(0x00);lcd_write(0x18);
 lcd_ctrl(0x24);lcd_ctrl(0xb0);
 for(i=0;i<0x800;i++)//2k
 {
  lcd_autowrite(hzk2[i]);
 }
 lcd_ctrl(0xb2);
}

/*	建立自定义字库3,字符库为hzk3[]*/

/*void lcd_set_cgram3(void)
{
 uint i;
 lcd_write(0x03);//1800-1fffh
 lcd_write(0x00);lcd_ctrl(0x22);
 lcd_write(0x00);lcd_write(0x1c);
 lcd_ctrl(0x24);lcd_ctrl(0xb0);
 for(i=0;i<0x400;i++)//1k
 {
  lcd_autowrite(hzk3[i]);
 }
 lcd_ctrl(0xb2);
}

/*	显示一个汉字,16x16*/
/*	x为行字节数,y为列字节数*/

/*void lcd_disp_hz(uchar x,uchar y,uchar ccode)
{
 lcd_set_text(x,y);
 lcd_write(ccode); lcd_ctrl(0xc4);// left-up
 lcd_set_text(x,y+1); lcd_write(ccode+1);
 lcd_ctrl(0xc4);//left-down
 lcd_set_text(x+1,y);lcd_write(ccode+2);
 lcd_ctrl(0xc4);//right-up
 lcd_set_text(x+1,y+1);lcd_write(ccode+3);
 lcd_ctrl(0xc4);//rignt-dowm
}

/*设置汉字属性*/
/*	x为行字节数,y为列字节数*/

/*void lcd_hz_attr(uchar x,uchar y,uchar cattr)
{
 lcd_text_attr(x,y,cattr);
 lcd_text_attr(x+1,y,cattr);
 lcd_text_attr(x,y+1,cattr);
 lcd_text_attr(x+1,y+1,cattr);
}*/
void Delay(uchar x){
	for(;x>0;x--){
		_nop_();
	}
}

⌨️ 快捷键说明

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