📄 lcddriver._c
字号:
//*********************************************
//液晶驱动.C
//MCU:AVR_MEGA16L ,晶振频率:8.0 MHz
//LCD:OCM12864-9 ,并口LCD
//制作人:平顶山工学院计算机系,郭猛
//**********************************************
# include "iom16v.h"
# include "macros.h"
# include "FontModel.h"
# include "LCDFun.h"
//延时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,背光显示开;
{
SETDDRC(LCD_AK);
if(OnOff) CLRPORTC(LCD_AK); else SETPORTC(LCD_AK);
}
//=====忙检测=================
void check_busy(void)
{
uchar read_data=0xFF;
SETDDRD();//要输出LCD_DATA_OUT
LCD_DATA_OUT=0xFF;
CLRPORTC(LCD_RS);
SETPORTC(LCD_RW); //读命令
CLRPORTC(LCD_CS1); //片使能
while((read_data&0x80)==0x80)
{
SETPORTC(LCD_E);
;
SETPORTD();
CLRDDRD();//要输入LCD_DATA_IN
SETPORTD();
;
read_data=LCD_DATA_IN;
CLRPORTC(LCD_E);
}
CLRPORTC(LCD_E);
SETPORTC(LCD_CS1); //片禁能
}
//=====写命令到寄存器=========
void send_cmd(uchar cmd)
{
check_busy();
CLRPORTC(LCD_RS);
CLRPORTC(LCD_RW); //写命令
CLRPORTC(LCD_CS1); //片使能
SETDDRD(); //要输出LCD_DATA_OUT
LCD_DATA_OUT=cmd;
SETPORTC(LCD_E);
;
CLRPORTC(LCD_E);
;
SETPORTC(LCD_CS1); //片禁能
}
//=====写数据到DDRAM=========
void send_dat(uchar dat)
{
check_busy();
SETPORTC(LCD_RS);
CLRPORTC(LCD_RW); //写数据
CLRPORTC(LCD_CS1); //片使能
SETDDRD(); //要输出LCD_DATA_OUT
LCD_DATA_OUT=dat;
SETPORTC(LCD_E);
;
CLRPORTC(LCD_E);
;
SETPORTC(LCD_CS1); //片禁能
}//=======初始化==============
void LCD_Ini(void)
{
//控制端口设置为输出:
DDRC=0xFF;;
SETPORTC(LCD_RES);
CLRPORTC(LCD_E);
Delay(50);
send_cmd(LCD_ADC_NORMAL);
send_cmd(LCD_COMMON_REVERSE);
send_cmd(LCD_BIAS_1DIV9);
send_cmd(LCD_POWER_CONTROL+4);
send_cmd(LCD_POWER_CONTROL+6);
send_cmd(LCD_POWER_CONTROL+7);
send_cmd(LCD_RESISTOR_RATIO+5);
send_cmd(LCD_ELEC_VOLUME_SET);
send_cmd(0x14); //0X14
send_cmd(LCD_ON);
send_cmd(LCD_RMW);
send_cmd(LCD_START_LINE_SET);
}
//=======写页地址==============
void Set_Page_Address(unsigned char dat)
{
send_cmd(LCD_PAGE_SET|dat);
}
//=======写列地址==============
void Set_Colume_Address(unsigned char dat)
{
unsigned char tmp;
tmp=dat>>4;
send_cmd(LCD_COLUME_SET_H|tmp); //送列地址高三位
tmp=0x0f&dat;
send_cmd(tmp); //送列地址低四位
}
//在指定的位置显示1个ASCII码字符
//h,l:行位置与列位置
//Asc:字符的ASC值,注意ASC字符为可显示字符(ASCII>=0x20)
void PrintOneASCII(uchar h,uchar l,uchar Asc)
{
uchar Tmp,j;
Set_Page_Address(h);
Set_Colume_Address(l);
if (Asc>=0x20) Tmp=Asc-0x20;else Tmp=0;
for(j=0;j<8;j++)
{
send_dat(Ascii[Tmp][j]);
}
}
void ClearLCD(void) //LCD清屏
{
uchar i,j;
for(i=0; i<9; i++) //clear page 0~8
{
Set_Page_Address(i);
Set_Colume_Address(0);
for(j=0; j<132; j++) //clear colum
{
send_dat(0);
}
}
}
//=======显示电池电量============
void Display_BattVol(uchar const *pic,uchar Vol)
{
unsigned char j;
Set_Page_Address(7); //LCD的左下角显示电池电量
Set_Colume_Address(0x00);
for(j=0;j<0x10;j++) //16列
{
send_dat(*(pic+0x10*Vol+j));
}
if(Vol==0)
{
PrintConstAscStr(7,16,Menustr6[5],13)
}
}
//=======显示图形===============
void Display_Picture(uchar const *pic)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
Set_Page_Address(i);
Set_Colume_Address(0x00);
for(j=0;j<0x80;j++)
{
send_dat(*(pic+0x80*i+j));
}
}
}
//在指定位置显示指定长度的ASCII字符串
//h,l:行位置与列位置
//str:字符串
//Len:字符串长度,以字节为单位
void PrintConstAscStr(uchar h,uchar l,uchar const *str,uchar Len)
{
uchar i,Tx,Ty;
Ty=h;Tx=l;
for(i=0;i<Len;i++)
{
PrintOneASCII(Ty,Tx,str[i]);
Tx+=8;
if (Tx>=128) { Ty=(Ty+1)&0x07;Tx=0; }
}
}
//在指定位置显示指定长度的ASCII字符串
//h,l:行位置与列位置
//str:字符串
//Len:字符串长度,以字节为单位
void PrintAscStr(uchar h,uchar l,uchar *str,uchar Len)
{
uchar i,Tx,Ty;
Ty=h;Tx=l;
for(i=0;i<Len;i++)
{
PrintOneASCII(Ty,Tx,str[i]);
Tx+=8;
if (Tx>=128) { Ty=(Ty+1)&0x07;Tx=0; }
}
}
//在指定的位置显示1个16*16中文字符
//h,l:行位置与列位置
//hzm:指向汉字字型数据的指针
void PrintOneHZ(uchar h,uchar l,unsigned char *hzm)
{
uchar i,Tmp_x,Tmp_y,LCD_DAT;
if(h<=6 && h>=0 && l>=0 && l<=112) //检查汉字能否正常显示出来
{
/* for(i=0;i<16;i++) //竖字
{
Tmp_x=h;Tmp_y=l+i;
Set_Page_Address(Tmp_x);
Set_Colume_Address(Tmp_y);
LCD_DAT=*(hzm+(i<<1));
send_dat(LCD_DAT);
Set_Page_Address(Tmp_x-1);
Set_Colume_Address(Tmp_y);
LCD_DAT=*(hzm+(i<<1)+1);
send_dat(LCD_DAT);
} */
Set_Page_Address(h);
Set_Colume_Address(l);
/*先显示汉字上半部分*/
for(i=0;i<8;i++) send_dat(*(hzm+0+i));
for(i=0;i<8;i++) send_dat(*(hzm+8+i));
/*再显示汉字下半部分*/
Set_Page_Address(h+1);
Set_Colume_Address(l);
for(i=0;i<8;i++) send_dat(*(hzm+16+i));
for(i=0;i<8;i++) send_dat(*(hzm+24+i));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -