📄 lcd13164.h
字号:
/**********************************************
** 文件名 :LCD13164.H **
**********************************************/
#ifndef _LCD13164_INCLUDED_
#define _LCD13164_INCLUDED_
#include <mega32.h>
#include "red.h"
#include "font.h"
#include "fat.h"
#include "cd3315.h"
#include "vs1003.h"
//正点原子@scut 08/09/11
//针对自己手头一批便宜的液晶(10块一个^_^) 131*64
//代码很好写,仅供参考
//-----------------LCD端口定义----------------
#define LCD_SDA PORTC.7 //数据端口
#define LCD_SCK PORTC.6 //时钟端口
#define LCD_RS PORTC.4 //数据/命令选择端口
#define LCD_RST PORTC.3 //硬复位
#define LCD_CS PORTC.5 //片选端口
#define LCD_LED PORTC.2 //LCD背光
bit invt=0;//不反向;
bit En_backlight=0;
uchar lasttime=0;//持续时间计数器
//--------------- 串行模式发送数据----------------
//发送一个byte数据到lcd
void Send_Data(unsigned char datain)
{
unsigned char i;
for(i=0;i<8;i++)
{
LCD_SCK=0;
if((datain&0x80)==0)LCD_SDA=0;
else LCD_SDA=1;
LCD_SCK=1;
datain<<=1;
}
}
//------------------串行模式写数据----------------
//写数据,串行模式
void Write_data(unsigned char data)
{
LCD_RS=1;//写数据
LCD_CS=0;//选中
Send_Data(data);//发送数据
LCD_CS=1;//释放总线
}
//------------------串行模式写命令----------------
//写命令,串行模式
void Write_comd(unsigned char comd)
{
LCD_RS=0;//写命令
LCD_CS=0;//选中
Send_Data(comd);//发送命令
LCD_CS=1;//释放总线
}
//----------------------设置列--------------------
//设置列:0~131
void Set_column(unsigned char column)
{
column+=1;//偏移一个点
Write_comd(column&0x0f); //发送低四位
Write_comd((column>>4)|0x10);//发送高四位
}
//----------------------设置页--------------------
//设置页0~7
void Set_page(unsigned char page)
{
Write_comd((page&0x0f)|0xb0);
}
//清屏
void Cleardisplay(uchar row)
{
unsigned char j;
if(row<4)
{
Set_page(2*row);
Set_column(0x00);
for(j=0;j<132;j++)Write_data(0x00);
Set_page(2*row+1);
Set_column(0x00);
for(j=0;j<132;j++)Write_data(0x00);
}else
{
for(j=0;j<4;j++)Cleardisplay(j);
}
}
//在指定位置显示一个字符
//x,0~3
//y,0~131
//chr,要显示的字符
void Show_char(unsigned char x,unsigned char y,unsigned char chr)
{
unsigned char t;
Set_page(2*x);//定位行(页0~7)
Set_column(y);//定位列
for(t=0;t<12;t++)
{
if(t==6) //显示下一半
{
Set_page(2*x+1);
Set_column(y);
}
Write_data(asc2[chr-32][t]);
}
}
//显示12*12的icon
//Ico:见 FONT 定义
void Show_icon(unsigned char x,unsigned char y,unsigned char Ico)
{
unsigned char t;
Set_page(2*x);//定位行(页0~7)
Set_column(y);//定位列
for(t=0;t<24;t++)
{
if(t==12) //显示下一半
{
Set_page(2*x+1);
Set_column(y);
}
if(invt)Write_data(~icon[Ico][t]);
else Write_data(icon[Ico][t]);
}
}
//在指定地址开始显示一个汉字
void Show_font(unsigned char x,unsigned char y,unsigned char *chr)
{
unsigned char t;
Set_page(2*x);//定位行(页0~7)
Set_column(y);//定位列
for(t=0;t<24;t++)
{
if(t==12) //显示下一半
{
Set_page(2*x+1);
Set_column(y);
}
Write_data(chr[t]);
}
}
//显示一副图片
void draw_picture(flash uchar *p)
{
uint t1,t2;
for(t1=0;t1<8;t1++)
{
Set_page(t1);
Set_column(0);
for(t2=0;t2<131;t2++)Write_data(p[t2+t1*131]);
}
}
/*-----------------------------------------------------------------------
LCD_write_String: 在LCD上显示汉字或英文字符
输入参数:x、y:显示汉字的起始X、Y坐标;
enchg:1,支持换行.0,不换行
-----------------------------------------------------------------------*/
uchar LCD_write_String(uchar x, uchar y,uchar *p,uchar enchg)
{
bit bHz=0; //字符或者中文
unsigned char mat[24]; //保存12X12点陈内容
while(*p!=0)
{
if(!bHz)
{
if(*p>0x80)bHz=1;//中文
else //字符
{
if(y>125&&enchg){x++;y=0;}//一行已满,换行
if(enchg>1&&x>2)return;//只显示中间两行 //歌词显示的时候用
if(x>3)return;//越界返回
if(*p==13)//换行符号
{
x++;y=0;
p++;//跳过
}
else Show_char(x,y,* p);
p++;
y+=6;
}
}else
{
if(y>119&&enchg){x++;y=0;}//换行
if(enchg>1&&x>2)return;//只显示中间两行 //歌词显示的时候用
if(x>3)return;//越界返回
bHz=0;//有汉字库
Get_HzMat(p,mat);//得到点阵数据
Show_font(x,y,mat);
p+=2;
y+=12;
}
} //end while
return 0;//读取完毕
}
//在指的地址显示一个字符串
//支持 flash 型数据
void LCD_write_cstr(uchar x, uchar y,flash uchar *str)
{
Set_page(2*x);//定位行(从0~7)
Set_column(y);//定位列
while(*str!='\0')
{
Show_char(x,y,*str);//写一个字符
str++;
y+=6;
if(y>123)//自动换行
{
x++;y=0;
Set_page(2*x);//定位行(从0~7)
Set_column(y);//定位列
}
if(x>3){Cleardisplay(4);x=0;}//整行清除
}
}
//在指定位置显示一个数字
//x,0~3
//y,0~131
//str,要显示的数字
void Show_num(unsigned char x,unsigned char y,unsigned char num)
{
Show_char(x,y,(num/10)%10+'0');//显示十位
Show_char(x,y+6,num%10+'0'); //显示个位
}
//在指定位置显示一个小字符0~9:kbps/
//x,0~7
//y,0~131
//str,要显示的数字 位置
void show_minichar(unsigned char x,unsigned char y,unsigned num)
{
unsigned char t;
Set_page(x);//定位行(从0~7)
Set_column(y);//定位列
for(t=0;t<5;t++)Write_data(miniasc2[num][t]);
Write_data(0x00);//插入空隙
}
//在指定位置显示一个小数字
void Show_mininum(unsigned char x,unsigned char y,unsigned char num)
{
show_minichar(x,y,(num/10)%10);//显示十位
show_minichar(x,y+6,num%10); //显示个位
}
//以下LCD代码为游戏服务
//刷新数据,把lcdram的数据写入LCD里面
void lcd_refresh(void)
{
uchar x,y,;uint temp;
for(y=0;y<8;y++)
{
Set_page(7-y);Set_column(0);
for(x=0;x<96;x++)
{
temp=(uint)y*96+x;
if(temp<512)Write_data(BUFFER[temp]);
else Write_data(pbuffer[temp-512]);
}
}
}
//x:0~7,y:0~96
//读出lcdram的数据
uchar lcd_read(uchar x,uchar y)
{
uint temp=0;
temp=(uint)y*96+x;
if(temp<512)return BUFFER[temp];
else return pbuffer[temp-512];
}
//x:0~7,y:0~96
//写入lcdram的数据
void lcd_write(uchar x,uchar y,uchar data)
{
uint temp=0;
temp=(uint)y*96+x;
if(temp<512)BUFFER[temp]=data;
else pbuffer[temp-512]=data;
}
//在 96*64的范围内任意点画点
//val:1,填充1;val:填充0;
void WritePixel(uchar x,uchar y,uchar val)
{
uchar lcdram=0,temp=0x01;
lcdram=lcd_read(x,y/8);
temp<<=7-y%8;
if(val)lcdram|=temp;//填充1
else //填充0
{
temp=~temp;
lcdram&=temp;
}
lcd_write(x,y/8,lcdram);
}
//读取指定位置的一点
//x:0~23;y:0~16
uchar ReadPixel(uchar x,uchar y)
{
uchar lcdram=0;
x=x*4;y=y*4;
lcdram=lcd_read(x,y/8);//读出点位置
lcdram>>=7-y%8;
if(lcdram&0x01)return 1;
else return 0;
}
//在 24*16的范围内任意点画点(每点4*4大小)
//画一个小方块
void Big_pinxl(uchar x,uchar y,uchar val)
{
uchar t1,t2;
for(t1=0;t1<4;t1++)
for(t2=0;t2<4;t2++)WritePixel(4*x+t1,4*y+t2,val);//画点
}
//清除lcdsram
void clearlcdram(void)
{
uint t;
for(t=0;t<1024;t++)
{
if(t<512)BUFFER[t]=0x00;
else pbuffer[t-512]=0x00;
}
}
//保存文件时显示的界面
//不带清屏!!!
void save_show(void)
{
LCD_write_cstr(2,35,"Saveing.");
delay_ms(800);
LCD_write_cstr(2,35,"Saveing..");
delay_ms(800);
LCD_write_cstr(2,35,"Saveing...");
delay_ms(800);
}
//音乐模式下的界面显示
//显示MP3的基本信息
void MP3_msg(uchar pause)
{
uchar t;
Show_num(0,12,voltemp[0]);//显示音量
Show_num(0,40,voltemp[1]+7);//显示低音
Show_num(0,68,voltemp[2]+7);//显示高音
Show_char(0,96,dspram+'0');//显示dsp1
if(SINGLE)Show_icon(0,105,10);//单曲循环
else Show_icon(0,105,9);//顺序播放
if(LYRIC)Show_icon(0,120,11);//显示LRC图标
else Show_icon(0,120,14);//不显示图标
//显示暂停与否的图标
Show_icon(3,0,12+pause);//显示播放暂停
//显示超重低音图标
Set_page(7);//定位行(页0~7)
Set_column(100);//定位列
if(voltemp[3]==0)for(t=0;t<24;t++)Write_data(bass[t]);//显示图标
else for(t=0;t<24;t++)Write_data(0x00); //不显示图标
}
//音乐模式下的界面显示
//显示MP3播放时的界面
unsigned int file_bps=0;//比特率
unsigned int off_time=0;//偏移时间
void Play_GUI(void)
{
uchar t;
Cleardisplay(4); //清屏
invt=0; //防止反相显示
off_time=0;//清除偏移时间寄存器
file_bps=0;//清除比特率寄存器
for(t=0;t<4;t++)Show_icon(0,28*t,5+t);
Set_page(6);//定位行(页0~7)
Set_column(12);//定位列
Write_data(0xFC);
for(t=0;t<78;t++)Write_data(0x84);//显示进度调
Write_data(0xFC);
Set_column(111);//显示Kbps符号
for(t=0;t<20;t++)Write_data(kbps[t]);
}
//音乐模式下的进度条显示
//MP3播放时的进度条显示
void Pro_msg(unsigned long npos,uchar mnum)
{
uint temptime=0;
uchar t;
if(file_bps>0)temptime=npos/(file_bps*125);//获得当前的时间
if(temptime!=off_time)//秒钟变化了,更新数据
{
off_time=temptime;
//显示当前运行时间
Show_mininum(7,20,off_time/60);//显示分钟
show_minichar(7,32,10);//显示冒号
Show_mininum(7,38,off_time%60);//显示秒钟
}
npos=npos*80;//放大一百倍
mnum=npos/m_c[mnum].FileLen;//获得当前的位置百分比
if(mnum>80)return;//越界处理
Set_page(6);//定位行(页0~7)
Set_column(12);//定位列
for(t=0;t<mnum;t++)Write_data(0xFC);
}
//设置模式下的界面显示
//显示vs1003的gui图标
void Vs1003_GUI(void)
{
Cleardisplay(4); //清屏
invt=0; //防止反相显示
LCD_write_cstr(0,35,"VS1003 Set");
//音量界面
LCD_write_cstr(1,35,"Volume:");
//高频界面
LCD_write_cstr(2,0,"H Freq:");
LCD_write_cstr(2,54,"Khz");
LCD_write_cstr(2,78,"Treb:");
//低音界面
LCD_write_cstr(3,0,"L Freq:");
LCD_write_cstr(3,54,"0hz");
LCD_write_cstr(3,78,"Bass:");
}
//设置模式下的信息显示
void Vs1003_msg()
{
//显示音量大小
Show_char(1,77,vs1003ram[4]/100+'0');
Show_num(1,83,vs1003ram[4]);
//高频界面
Show_num(2,42,vs1003ram[1]);//高频大小
Show_num(2,108,vs1003ram[0]);//设定dB
//低音界面
Show_num(3,42,vs1003ram[3]);//低频大小
Show_num(3,108,vs1003ram[2]);//设定dB
}
//收音机频率显示
void Show_Freq(unsigned char x,unsigned char y,unsigned int num)
{
Show_char(x,y,(num/1000)%10+'0');
Show_char(x,y+6,(num/100)%10+'0');
Show_char(x,y+12,(num/10)%10+'0');
Show_char(x,y+18,'.');
Show_char(x,y+24,num%10+'0');
Show_char(x,y+30,'M');
}
//---------------------LCD初始化-----------------------
void LCD_init()
{
DDRC|=0XFC; //PORTC.2~7输出
LCD_SDA=0; //初始化为0
LCD_SCK=0;
LCD_RS=0;
LCD_RST=1;
LCD_CS=1;
LCD_LED=0; //关闭背光
LCD_RST=0; //硬复位
delay_ms(10);
LCD_RST=1;
Write_comd(0xae); //0B10101110,最后一位为0 关闭显示
Write_comd(0xa1); //ADC select,remap 131-->0,设定行对应起始位置
Write_comd(0xc8); //com select,remap 63-->0 ,设定列对应起始位置
Write_comd(0xa2); //lcd bias select 1/9 BIAS,设置偏压,不用管,默认1/9
Write_comd(0x2f); //power control(VB,VR,VF=1,1,1),电压控制,不用管
Write_comd(0x22); //Set Regulator rsistor ratio ,粗调对比度 0~7.作用不大
Write_comd(0x81); //Contrast Control Register ,细调对比度
Write_comd(0x18); //对比度值:0~63,总共64级,值越小,越暗
delay_ms(7); //延时
Write_comd(0xaf); //0B10101111,最后一位为1 开启显示
Cleardisplay(4); //清屏
//Write_comd(0xad);//TURN ON THE STATIC INDICATOR MODE
//Write_comd(0x02);//是否要发送第二级命令
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -