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

📄 lcd.c

📁 用atmega64+vs1003(音频解码芯片)+SD制成的板子
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <avr/io.h>
#include <avr/eeprom.h>
#include "sd.h"
#include "vs1003.h"
#include "lcd.h"
#include "delay.h"
#include "6x12.h"
unsigned char DispBuff[6][84];  //LCD备份缓冲区  
unsigned char LcdFlag;
LCD_DISP lcd[4];
unsigned char D_x=0;
unsigned char D_y=0; 
unsigned char InverseLine=0;   //反色显示的行(bit0-bit3)
#define MAX_LINE_NUM   84
#define MMC_CS_PIN     _BV(0)    //PORTB.0 
#define MMC_PORT       PORTB   
extern unsigned char WorkFlag;
extern uchar reading;
void LCD_write_time(TIME *tt)
{  
	LCD_WriteBigDigit(tt->hour/10,2);
	LCD_WriteBigDigit(tt->hour%10,2+16); 
	LCD_WriteBigDigit(tt->min/10,2+37);
	LCD_WriteBigDigit(tt->min%10,2+49);
	LCD_WriteTimeDot(31); 
	D_x=2;D_y=2+66;
	LCD_write_char(tt->sec/10+0x30);
	LCD_write_char(tt->sec%10+0x30);
	TimeFlag|=bLcdUpdate;
} 
void LCD_WriteTimeDot(unsigned char offset)
{
	unsigned char i;
	for(i=0;i<7;i++){     
		DispBuff[2][offset+i]=pgm_read_byte(&bigdigitColon[i]);
	}	             
	for(i=0;i<7;i++){     
		DispBuff[3][offset+i]=pgm_read_byte(&bigdigitColon[7+i]);
	}	   
} 

void LCD_WriteBigDigit(unsigned char num,unsigned char offset)
{                            
	unsigned char i;
	for(i=0;i<13;i++){     
		DispBuff[1][offset+i]&=0x0f;
		DispBuff[1][offset+i]|=pgm_read_byte(bigdigitTbl[num]+i);;
	}
	for(i=0;i<13;i++){     
		DispBuff[2][offset+i]=pgm_read_byte(bigdigitTbl[num]+13+i);;
	}	             
	for(i=0;i<13;i++){     
		DispBuff[3][offset+i]=pgm_read_byte(bigdigitTbl[num]+26+i);;
	}	             
	for(i=0;i<13;i++){     
		DispBuff[4][offset+i]&=0xf0;
		DispBuff[4][offset+i]|=pgm_read_byte(bigdigitTbl[num]+39+i);;
	}		
}


void LCD_write_char(unsigned char c)
{
  unsigned char line;
  c-=0x20;
  switch(D_x){
  	case 0:  //显示第一行内容
  		for (line=0; line<6; line++)
   	 		DispBuff[0][D_y+line]= pgm_read_byte(font6x12[c]+line);
   	 	for(line=0;line<6;line++){
   	 		DispBuff[1][D_y+line]&=0xf0;
   	 		DispBuff[1][D_y+line]|=pgm_read_byte(font6x12[c]+6+line);
   	 	}
   	 		break;
	case 1: //显示第二行内容
		for(line=0;line<6;line++){
			DispBuff[1][D_y+line]&=0x0f;
			DispBuff[1][D_y+line]|=(pgm_read_byte(font6x12[c]+line)<<4);
		}
		for(line=0;line<6;line++){
			DispBuff[2][D_y+line]=(pgm_read_byte(font6x12[c]+line)>>4)|(pgm_read_byte(font6x12[c]+6+line)<<4);
		}	
		break;	
	case 2:
		for (line=0; line<6; line++)
   	 		DispBuff[3][D_y+line]= pgm_read_byte(font6x12[c]+line);
   	 	for(line=0;line<6;line++){
   	 		DispBuff[4][D_y+line]&=0xf0;
   	 		DispBuff[4][D_y+line]|=pgm_read_byte(font6x12[c]+6+line);
   	 	}
   	 		break;
	case 3: 
		for(line=0;line<6;line++){
			DispBuff[4][D_y+line]&=0x0f;
			DispBuff[4][D_y+line]|=(pgm_read_byte(font6x12[c]+line)<<4);
		}
		for(line=0;line<6;line++){
			DispBuff[5][D_y+line]=(pgm_read_byte(font6x12[c]+line)>>4)|(pgm_read_byte(font6x12[c]+6+line)<<4);
		}	
		break;
	default:
	     D_x=0;	
   };
      D_y+=6;   	 		
}

void LCD_write_icon(unsigned char c)
{
  unsigned char line;
  switch(D_x){
  	case 0:  //显示第一行内容
  		for (line=0; line<6; line++)
   	 		DispBuff[0][D_y+line]= pgm_read_byte(icon6x12[c]+line);
   	 	for(line=0;line<6;line++){
   	 		DispBuff[1][D_y+line]&=0xf0;
   	 		DispBuff[1][D_y+line]|=pgm_read_byte(icon6x12[c]+6+line);
   	 	}
   	 		break;
	case 1: //显示第二行内容
		for(line=0;line<6;line++){
			DispBuff[1][D_y+line]&=0x0f;
			DispBuff[1][D_y+line]|=(pgm_read_byte(icon6x12[c]+line)<<4);
		}
		for(line=0;line<6;line++){
			DispBuff[2][D_y+line]=(pgm_read_byte(icon6x12[c]+line)>>4)|(pgm_read_byte(icon6x12[c]+6+line)<<4);
		}	
		break;	
	case 2:
		for (line=0; line<6; line++)
   	 		DispBuff[3][D_y+line]= pgm_read_byte(icon6x12[c]+line);
   	 	for(line=0;line<6;line++){
   	 		DispBuff[4][D_y+line]&=0xf0;
   	 		DispBuff[4][D_y+line]|=pgm_read_byte(icon6x12[c]+6+line);
   	 	}
   	 		break;
	case 3: 
		for(line=0;line<6;line++){
			DispBuff[4][D_y+line]&=0x0f;
			DispBuff[4][D_y+line]|=(pgm_read_byte(icon6x12[c]+line)<<4);
		}
		for(line=0;line<6;line++){
			DispBuff[5][D_y+line]=(pgm_read_byte(icon6x12[c]+line)>>4)|(pgm_read_byte(icon6x12[c]+6+line)<<4);
		}	
		break;
	default:
	     D_x=0;	
   };
      D_y+=6;   	 		
}




/*-----------------------------------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:data:写入的数据;
command :写数据/命令选择;
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char data)
{   
  SCE_L ;              // 使能LCD
  SPDR = data;         // 传送数据到SPI寄存器
  while (!(SPSR & 0x80)) ; // 等待数据传送完毕
  SCE_H ;              // 关闭LCD
}
void LCD_write_cmd(unsigned char data)
{
	SCE_L;              // 使能LCD
	DC_L;             // 传送命令
	SPDR = data;         // 传送数据到SPI寄存器
	while (!(SPSR & 0x80)) ;
	SCE_H;              // 关闭LCD
	DC_H;
	
}
/*---------------------------------------
LCD_init: 3310LCD初始化
----------------------------*/
void LCD_Init(void)
{
	unsigned char i;
	LCD_RES_DDR|=LCD_RES_BIT ;
	LCD_SCE_DDR|=LCD_SCE_BIT ;
 	LCD_DC_DDR|=LCD_DC_BIT ;
	RES_L;                  // 产生一个让LCD复位的低电平脉冲
	delay_nus(100);
	RES_H ;
	SCE_L ;                 // 关闭LCD
	delay_nus(100);
	SCE_H;                  // 使能LCD
	delay_us();
	LCD_write_cmd(0x21);// 使用扩展命令设置LCD模式
	LCD_write_cmd(0xc8);// 设置偏置电压
	LCD_write_cmd(0x06);// 温度校正
	LCD_write_cmd(0x13);// 1:48
	LCD_write_cmd(0x20);// 使用基本命令
	LCD_clear();            // 清屏
	LCD_write_cmd(0x0c);// 设定显示模式,正常显示
	SCE_L ;                 // 关闭LCD
	for(i=0;i<4;i++){
		lcd[i].pStr=0;
		lcd[i].y=0;
	}
   LcdFlag=0;
}

/*-----------------------------------------------------------------------
LCD_clear: LCD清屏函数
-----------------------------------------------------------------------*/
void LCD_clear(void)
{
  unsigned char x,y;
  for(y=0;y<6;y++){
   LCD_write_cmd(0x40|y);
   LCD_write_cmd(0x80);
   for (x=0; x<84; x++){
      LCD_write_byte(0);  
   }
  }
    
}
/*-----------------------------------------------------------------------
LCD_clear: LCD清屏函数
-----------------------------------------------------------------------*/
void ClearLcdBuff(void)
{
  unsigned char x,y;
  unsigned char *pp;
  pp=(uchar*)&DispBuff;
  for(y=0;y<6;y++){
     for (x=0; x<84; x++)
  	 *pp++=0;
  }
}

/*-----------------------------------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83
Y:0-5
-----------------------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
  LCD_write_cmd(0x40 | Y);// column
  LCD_write_cmd(0x80 | X);// row
}
//写入一个12X12的图标
void LCD_writeIcon(unsigned char X,unsigned char Y,unsigned char c)
{
	 unsigned char i;
	 unsigned char mat[24];
	 D_x=X; D_y=Y;
	 for(i=0;i<24;i++)
	  mat[i]=pgm_read_byte(icon12x12[c]+i);	
	 	LCD_Write_Char2(mat);
		TimeFlag|=bLcdUpdate;
}
/*-----------------------------------------------------------------------

LCD_write_String: 在LCD上显示汉字或英文字符
输入参数:X、Y:显示汉字的起始X、Y坐标;
-----------------------------------------------------------------------*/

void LCD_write_String(unsigned char X, unsigned char Y,unsigned char *p)
{
	unsigned char i;
	unsigned char bHz=0;
	unsigned char mat[24]; //保存12X12点陈内容   
	D_x=X; D_y=Y;
	while(*p!=0){
		if(!bHz){
			if(*p>0x80){
				if(D_y>84-12)  break;
				bHz=1; 
			}else{
				if(D_y>84-6)   break;
				LCD_write_char(* p);  
				p++;		
			}
		}else{
			bHz=0;
			if(WorkFlag&bHzk12){
			  Get_HzMat(p,mat);
			}else{
				for(i=0;i<24;i++)  mat[i]=0;
			}
			p+=2; 
			LCD_Write_Char2(mat);
		  D_y+=12;
   		}
	}  //end while     
		TimeFlag|=bLcdUpdate;

⌨️ 快捷键说明

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