📄 lcddrive._c
字号:
//*********************************************
//MCU:ATMEL AVR MEGA8 ,晶振频率:8MHz,频率越高,播放Mp3越流畅
//LCD:128*64
//LCD型号:FYD12864-0402B
//制作人:平顶山工学院计算机系,郭猛
//*********************************************
# include "iom8v.h"
# include "macros.h"
#include <math.h>
#include "FontModel.h"
#include "LCDFun.h"
//LCD驱动用到的变量:
uchar LCD_COM; //LCD控制命令字
uchar LCD_DAT; //LCD数据
//绘图方式下的坐标:
uchar AC_X; //X坐标
uchar AC_Y; //Y坐标
//延时1ms
void Delay_1ms(void)
{
unsigned int j;
for(j=1;j<(unsigned int)(XTAL*143-2);j++) NOP();
}
/*******************************************延时子程序**********************************************/
///////////////////n的取值最好不要超过500!!!
void Delay(unsigned int n)
{
uchar i,j;
for(i=0;i<(uchar)(n/100);i++)
for(j=0;j<100;j++) Delay_1ms(); //100mS
}
//*************************************LCD背光控制***************************************
void LCD_AK_Control(uchar OnOff) //On0FF=1,背光显示开;
{
if(OnOff) CLRPORT(LCD_AK); else SETPORT(LCD_AK);
}
void SendToSID(unsigned char bitNum, unsigned char dat)//向串行数据线发送指定位数一个数据
{
unsigned char i,bitcode;
for(i=0;i<bitNum;i++)
{
bitcode=dat & 0x80;
if(bitcode!=0) SETPORT(SID); else CLRPORT(SID); //SID = dat & 0x80;
dat = dat << 1;
CLRPORT(SCLK); //SCLK = 0;
SETPORT(SCLK); //SCLK = 1;
CLRPORT(SCLK); //SCLK = 0;
}
}
//*************************************写入LCD控制字******************************
void Write_LCD_Com(void) //对LCD写入控制命令
{
// SynCode为同步码
unsigned char SynCode;
CLRPORT(CS); //CS=0;
SETPORT(CS); //CS=1;
SynCode = 0xFF; //同步码
SendToSID(5,SynCode);
SynCode = 0x00; //写入代码RW,RS,0,3位代码
SendToSID(3,SynCode);
SynCode = LCD_COM & 0xF0; //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
SendToSID(8,SynCode);
SynCode = LCD_COM & 0x0F; //写入代码COM数据的低四位 0000XXXX
SynCode = SynCode<<4; //要发送的数据格式是XXXX0000
SendToSID(8,SynCode);
Delay_1ms() ; //必要的延时
}
//*************************************写入LCD数据**********************************
void Write_LCD_Data(void) //对LCD写入8位数据
{
// iSynCode为同步码计数器,同步码为5位, SynCode为同步码
unsigned char iSynCode,SynCode;
uchar bitcode;
CLRPORT(CS); //CS=0;
SETPORT(CS); //CS=1;
SynCode = 0xFF; //同步码
SendToSID(5,SynCode);
SynCode = 0x40; //写入代码RW,RS,0,3位代码
SendToSID(3,SynCode);
SynCode = LCD_DAT & 0xF0; //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
for(iSynCode=0;iSynCode<8;iSynCode++)
{
bitcode = SynCode & 0x80;
if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;
SynCode = SynCode << 1;
CLRPORT(SCLK); //SCLK = 0;
SETPORT(SCLK); //SCLK = 1;
CLRPORT(SCLK); //SCLK = 0;
}
SynCode = LCD_DAT & 0x0F; //写入代码COM数据的低四位 0000XXXX
SynCode = SynCode<<4; //要发送的数据格式是XXXX0000
for(iSynCode=0;iSynCode<8;iSynCode++)
{
bitcode = SynCode & 0x80;
if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;
SynCode = SynCode << 1;
CLRPORT(SCLK); //SCLK = 0;
SETPORT(SCLK); //SCLK = 1;
CLRPORT(SCLK); //SCLK = 0;
}
Delay_1ms();
}
//*************************************LCD屏幕初始化**************************************
//LCD接口:
//CS <==>PD5;
//SID <==>PD6;
//SCLK <==>PD7;
//LCD_AK<==>PD3; //背光控制,=0时打开背光
void LCD_Ini(void) //初始化,并进入文本模式
{
//LCD端口初始化,将PD7~PD5端口设置为输出方式
DDRD|=0xE0;
_NOP();
LCD_COM =0x30;//功能设置为8BIT控制界面,基本指令集
Write_LCD_Com();//调用写指令子程序
Delay(5);//39uS
LCD_COM =0x0C;//显示打开,光标关,反白不显示
Write_LCD_Com();//调用写指令子程序
Delay(5);//39uS
LCD_COM =0x01;//清除屏幕显示,将DDRAM的地址计数器归零
Write_LCD_Com();//调用写指令子程序
Delay(5);//39uS
LCD_COM =0x06;//DDRAM的地址计数器(AC)加1
Write_LCD_Com();//调用写指令子程序
Delay(5);//39uS
AC_X=1;AC_Y=1;
}
void LCD_Contrl_Cursor(uchar ON) //打开游标显示
{
if (ON) LCD_COM =0x0F;else LCD_COM=0x0C; //ON:显示打开,光标开,反白显示
Write_LCD_Com();//调用写指令子程序
Delay(5);//39uS
}
void DispSetCursor(uchar x,uchar y) //设置光标到指定位置
//x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7
//y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3
{
LCD_COM=CharMap[y][x]; //查表得到DDRAM地址AC
Write_LCD_Com();
}
void DispHalfWord(uchar x,uchar y,uchar HASC,uchar LASC) //在指定位置处显示半角ASCII字符
{
unsigned int HH;
LCD_COM=CharMap[y][x]; //查表得到DDRAM地址AC
Write_LCD_Com();
LCD_DAT=HASC;
Write_LCD_Data(); //显示ASCII字符
LCD_DAT=LASC;
Write_LCD_Data(); //显示ASCII字符
}
//**************************************在指定位置处打印ASCII字符串**********************************
//x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7
//y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3
//*str:存放ASCII字符串的指针
void PrintS(uchar x,uchar y,uchar *str) //在指定位置打印字符串
{
uchar i,Tx,Ty;
// EA=0;
Ty=y;Tx=x;
for(i=0;str[i]!='\0';i=i+2)
{
DispHalfWord(Tx,Ty,str[i],str[i+1]);
Tx++;
if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
}
// EA=1;
}
//**************************************在指定位置打印指定长度字符串**********************************
//x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7
//y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3
//*str:存放ASCII字符串的指针
//Len:字符串的长度,字节为单位
void PrintSLen(uchar x,uchar y,uchar *str,uchar Len) //在指定位置打印字符串
{
uchar i,Tx,Ty;
Ty=y;Tx=x;
for(i=0;i<Len;i=i+2)
{
if((Len-i)==1) DispHalfWord(Tx,Ty,str[i],'\0'); else DispHalfWord(Tx,Ty,str[i],str[i+1]);
Tx++;
if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
}
// EA=1;
}
void DisplayNumChar(unsigned char l,unsigned char h,unsigned int ll)
{
unsigned char knnum,hunum,tnnum,srnum; //百、十、个位
knnum=ll/1000;
hunum=ll/100-10*knnum; //百位
srnum=ll%10; //个位
tnnum=(ll-knnum*1000-hunum*100)/10; //十位
knnum+=0x30;hunum+=0x30;srnum+=0x30;tnnum+=0x30;
DispHalfWord(l,h,knnum,hnnum);
DispHalfWord(l+1,h,tnnum,snnum);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -