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

📄 yejld.c

📁 利用AVR(ATmega8L)单片机编写一个液晶显示程序
💻 C
字号:
/******************************************************************
**	LCD3310液晶骰子
**	MCU:	ATmega8L
**	日期:	2006.10.27
------------------------------------------------------------------
PC0-PC4 :LCD3310
PD0	:按键,按下为高电平
PD1、PD3:语音
******************************************************************/
#include 	<avr/io.h>
#include 	<avr/interrupt.h> 
#include	<avr/pgmspace.h>
#define 	uchar 	unsigned char
#define 	uint  	unsigned int
#define 	SetBit(sfr,bit) 	(sfr|=(1<<bit))
#define 	ClrBit(sfr,bit)		(sfr&=~(1<<bit))
/******************************************/
#define 	SCLK   	4		//时钟
#define 	SDIN  	3		//数据
#define 	DC  	2		//1写数据,0写指令
#define 	SCE    	1		//片选				
#define 	RES  	0		//0复位
#define		CTRL	PORTC
#define 	P00  	3		//语音P0数据
#define		P01     1  		//语音P1时钟
#define		YUYIN	PORTD 
#define		KEY		PIND&0x01 
#define		Alarm0	!(PIND&0x04) 
#define		Alarm1	!(PIND&0x10) 
static uchar dyi=0,der=0; 	
uint VOP,PMLD;	
const prog_uchar logo_Bytes[];
const prog_uchar BMP_Bytes[];
const prog_uchar BMP2_Bytes[];
void Lcm_Setadd(uchar y,uchar x);
void Lcm_Writebyte(uchar datatemp,uchar mod);

/*************T/C0 中断程序***********/ 
SIGNAL(SIG_OVERFLOW0) 
{// 产生中断周期  T =(256-177)*1024*1/8=10ms   
TCNT0=0xB1;									//T/C0开始值 
if(der==5)	
{	if(dyi<5)
		dyi++;
	else
		dyi=0;
	der=0;
}
else
	der++;
} 
/***************************************************
延时函数
系统时钟:8M
***************************************************/
void _delay_us(uint n)//N us延时函数
{
	unsigned int i=0;
	for (i=0;i<n;i++);
}
void delay_1ms(void)//1ms延时函数
{
	unsigned int i;
	for (i=0;i<1140;i++);
}
void _delay_ms(uint n)//N ms延时函数
{
	unsigned int i=0;
	for (i=0;i<n;i++)
		delay_1ms();
}
/********************LCM初始化**********************/
void Lcm_Init()
{
	DDRC=0xFF;						//设置PC口为输出
	SetBit(CTRL,RES);				//PC.1(RES)=1
    _delay_us(100);
	SetBit(CTRL,RES);
	SetBit(CTRL,SCE);				//SCE=1液晶屏未先选中
	SetBit(CTRL,SDIN);				//SDIN=1数据脚置高电平
	SetBit(CTRL,SCLK);				//SCLK=1时钟置高电平
	Lcm_Writebyte(0x21,0);			//初始化Lcd,功能设定使用扩充指令
	Lcm_Writebyte(0xC8,0);			//设定液晶偏置电压(高--低)
	Lcm_Writebyte(0x06,0);			//设定温度系数
	Lcm_Writebyte(PMLD,0);		//1:24,设置屏幕亮度
	Lcm_Writebyte(VOP,0);			//设定Vop,设置屏幕亮度
	Lcm_Writebyte(0x20,0);			//使用基本指令
	Lcm_Writebyte(0x0C,0);			//设定显示模式,正常显示
} 
/**************写一字节 mod=0,命令模式******************/
void Lcm_Writebyte(uchar datatemp,uchar mod)
{
	uchar i=8;
	ClrBit(CTRL,SCE);				//SCE=0,选中液晶屏
	if(mod==0)
	{
		ClrBit(CTRL,DC);
	}
	else
	{
		SetBit(CTRL,DC);
	}								//DC=mod
	while(i--)
	{
		if(datatemp&0x80)
		{
			SetBit(CTRL,SDIN);		//SDIN=1
		}
		else
		{
			ClrBit(CTRL,SDIN);		//SDIN=0
		}
		ClrBit(CTRL,SCLK);			//SCLK=0
		SetBit(CTRL,SCLK);			//SCLK=1
		datatemp<<=1;
	}
	SetBit(CTRL,DC);				//DC=1
	SetBit(CTRL,SCE);				//SCE=1
	SetBit(CTRL,SDIN);				//SDIN=1
}
/**************设定地址 y=0~5,x=0~83************/
void Lcm_Setadd(uchar y,uchar x)
{
	Lcm_Writebyte((y|0x40),0);
	Lcm_Writebyte((x|0x80),0);
}
/**********************清全屏******************/
void Lcm_Clr()
{
	uchar m,n;
	Lcm_Setadd(0,0);
	for(m=0;m<6;m++)
	{
		for(n=0;n<84;n++)
		{
			Lcm_Writebyte(0,1);
		}
	}
}
/**********************************************
写logo
n=数据偏移量,dot_y=行地址,dot_x=列地址
***********************************************/
void Writerlogo_M_N(uint16_t n,uchar dot_y,uchar dot_x,uchar M,uchar N)
{
	uchar i,j,k,ramtemp;
	k=0;
	for(i=0;i<M;i++)				//输出M行
	{
		Lcm_Setadd(i+dot_y,dot_x);
		for(j=0;j<N;j++)			//输出N列
		{
		ramtemp=pgm_read_byte(logo_Bytes+j+k*N+n);
		Lcm_Writebyte(ramtemp,1);
		}
		k++;
	}
}



/***********************语音*************************/ 
void yuyin(uchar m)
{	

//在此不提供
		
}

/**********************设置液晶亮度(调亮)*********************/
void TiaoL_PMLD(void)
{VOP=0x30;PMLD=0x16;
//每按一次“Alarm0”加10,“Alarm1”确定
while(!(Alarm1))
{	if(Alarm0)												
	{	_delay_ms(10);
		do
		{;}while(Alarm0);
		VOP+=0x10;
		if(VOP>=0xEF)
		{	VOP-=0x10;
			PMLD=0x17;
		}
/*		Lcm_Init();	
		Lcm_Clr();									//清屏
		Writerlogo_M_N(0,0,0,6,48);					//显示logo		*/
	}
}}
/**********************设置液晶亮度(调暗)*********************/
void TiaoAN_PMLD(void)
{VOP=0x30;PMLD=0x16;
//每按一次“Alarm0”加10,“Alarm1”确定
while(!(Alarm0))
{	if(Alarm1)												
	{	_delay_ms(10);
		do
		{;}while(Alarm1);
		if(VOP<=0x10)
		{	VOP-=0xFF;
			PMLD=0x15;
		}
		else
			VOP-=0x10;
/*		Lcm_Init();	
		Lcm_Clr();									//清屏
		Writerlogo_M_N(0,0,0,6,48);					//显示logo		*/
	}
}}
/****************************主程序****************************/
int main(void)
{
	DDRD&=0xFE;									//配置PORTD0为按键输入,D2、5为报警信号输入(或者液晶屏幕亮度调节)
	DDRD|=0x0A;									//配置PORTD1、3为输出,用于语音
	
	if(Alarm0)									//设置液晶亮度(调亮)
	{	_delay_ms(10);
		do
		{;}while(Alarm0);
		EEPROM_write(0x08,0x01);
		TiaoL_PMLD();
		cli();
		EEPROM_write(0x09,VOP);
		EEPROM_write(0x10,PMLD);
	}
	if(Alarm1)									//设置液晶亮度(调暗)
	{	_delay_ms(10);
		do
		{;}while(Alarm1);
		EEPROM_write(0x08,0x01);
		TiaoAN_PMLD();
		cli();
		EEPROM_write(0x09,VOP);
		EEPROM_write(0x10,PMLD);
	}
	if(EEPROM_read(0x08)==1)
	{	VOP=EEPROM_read(0x09);
		PMLD=EEPROM_read(0x10);
	}
	else
	{	VOP=0x30;
		PMLD=0x16;
	}

/*10ms刷新一次,启用*/
	TCCR0=0x05; 								//采用1/1024系统时钟 
	TCNT0=0xB1;									//T/C0开始值 
	TIMSK=_BV(TOIE0);							//T/C0 中断允许 
	sei();    									//总中断标志置位
	Lcm_Init();	
	Lcm_Clr();									//清屏
	_delay_ms(300);
	yuyin(1);									//"您好"
	_delay_ms(200);
	Lcm_Clr();
	Writerlogo_M_N(352,0,0,4,84);				
	int k,a=0,b=0,c=0,h=5,g=5;					
	while(1)										
	{
		if(a==1)
			{h=dyi;g=der;}
		WriterDOT_M_N(h*160,1,0,4,40);			
		WriterDOT_M_N(g*160,1,44,4,40);			
		if((b==0)&&(c!=0))
		{	yuyin(1);		
			_delay_ms(200);
		}
		if(KEY)									
		{	a=1;b=0;c=1;
			DeleteDOT_M_N(1,0,4,40);			
			do
			{
				shz_xzh(h,g);
			}while(KEY);
			for(k=0;k<4;k++)
				shz_xzh(h,g);
		}
		else
		{	a=0;b=1;
			WriterDOT_M_N(h*160,1,0,4,40);		
			WriterDOT_M_N(g*160,1,44,4,40);		
		}
	}
}

/*****************************(LOGO)字库*******************************/
const prog_uchar logo_Bytes[]=
{
0xFC,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x81,0xC1,
0xE1,0xF1,0xF9,0xFD,0xFD,0xF1,0xE1,0xE1,0xF9,0xFD,0xF1,0xF9,0xFD,0xFF,0xFF,0xF1,
0x79,0x39,0x3D,0x1D,0x0F,0x07,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0xFC,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x3F,0x1F,0x0F,0x07,0x07,0x03,0x01,0x00,
0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xE0,0xE0,0xF0,0xF0,0xF8,0xF8,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};

/*****************************(40*32)*****************************/
const prog_uchar BMP_Bytes[]=
{
0xF0,0x04,0x02,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x00,0x02,0x04,0xF0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xE0,0xF8,0xFC,0xFC,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFE,0xFE,0xFC,0xFC,0xF8,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x3F,0x3F,0x7F,0x7F,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x3F,0x3F,0x1F,0x07,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x20,0x40,0x00,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x40,0x20,0x0F,
};

/********************************立体(30*24)**********************************/
const prog_uchar BMP2_Bytes[]=
{
0x00,0xC0,0xA0,0x90,0x88,0x84,0x82,0x84,0x8F,0x85,0x81,0x81,0x91,0xB9,0x91,0x81,
0x81,0xA1,0xF1,0xA1,0x81,0x01,0x41,0x21,0x11,0x09,0x05,0x02,0xFC,0x00,0xFF,0x00,
0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xE0,0xC0,0x00,0x00,
}

⌨️ 快捷键说明

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