📄 yejld.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 + -