📄 serial_lcd.c
字号:
/************************************************
文件:serial_lcd.c
用途:ST7920驱动程序
注意:
创建:2008.1.26
修改:2008.1.26
Copy Right (c) www.avrvi.com AVR与虚拟仪器
************************************************/
#include "..\config.h"
/******************************************************************
** 函数名称: void delay_lcd(void)
** 功能描述: lcd初始化后的延时
** 输 入: 无
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************/
void delay_lcd(void)
{
unsigned char i=200;
unsigned char j=0;
for(j=0;j<6;j++)
{
while(i--);
}
}
/******************************************************************
** 函数名称: void wr_lcd(unsigned char data,unsigned char flag)
** 功能描述: 向lcd写入1B的数据或者命令
** 输 入: unsigned char data,unsigned char flag data为要写入的数据或者命令,flag=1为命令传送,flag=0为数据传送
** 全局变量: 无
** 调用模块: 无
** 说明:首先要传送5个bit的1,起始位,flag=1为命令传送,5个bit的1起始位后面接着为000
flag=0为数据传送,5个bit的1起始位后面接着为010
** 注意:
*******************************************************************/
void wr_lcd(unsigned char data,unsigned char flag)
{
unsigned char i,j,k;
CLR_LCD_SCLK; //clock清零
SET_LCD_STD; //data置1
for(i=0;i<5;i++) //首先要传送5个bit的1,起始位
{
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
if(flag) //flag=1为命令传送,5个bit的1起始位后面接着为000
{
CLR_LCD_STD; //清零数据线,传送3个bit的0
for(i=0;i<3;i++)
{
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
}
else //flag=0为数据传送,5个bit的1起始位后面接着为010
{
CLR_LCD_STD; //传送一位0
SET_LCD_SCLK;
CLR_LCD_SCLK;
SET_LCD_STD; //传送一位1
SET_LCD_SCLK;
CLR_LCD_SCLK;
CLR_LCD_STD; //传送一位0
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
k=0x80; //后面传送信息的时候用来取得特定的位
for(j=0;j<2;j++)//每一个八位的指令将被分为两个字节接收到:
//较高4位的指令资料将会被放在第一个字节的MSB部分
//而较低4位(DB3~DB0)的指令资料则会被放在第二个字节的MSB部分
//至于相关的另四位则都为0。
{
for(i=0;i<4;i++)
{
if(data&k) //如果相应的位为高
{
SET_LCD_STD; //传送一位1
}
else //如果相应的位为低
{
CLR_LCD_STD; //传送一位0
}
k>>=1;
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
CLR_LCD_STD; //传送4位0
for(i=0;i<4;i++)
{
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
}
//CLR_LCD_SCLK;
CLR_LCD_STD;
}
/******************************************************************
** 函数名称: void initial_lcd(void)
** 功能描述: lcd初始化
** 输 入: 无
** 全局变量: 无
** 调用模块: wr_lcd();
** 说明:
** 注意:
*******************************************************************/
void initial_lcd(void)
{
LCD_DDR |= (1<<LCD_STD)|(1<<LCD_SCLK);
wr_lcd(Lcd_Set_Function_Basic,1); //指令集设定
wr_lcd(Lcd_Set_Entrance_Point+2,1); //光标右移
wr_lcd(Lcd_Display_Status+4,1); //整屏显示
wr_lcd(Lcd_Clear,1); //clear the screen
delay_lcd();
}
/*********************************************************************************************************
** 函数名称: Lcd_drawbmp(unsigned char col,unsigned char row,unsigned char col1,unsigned char row1,const unsigned char *bmp)
** 功能描述: 绘制bmp图片
** 输 入: col 起始行 col1 图片行数
** row 起始列 row1 图片列数
** *bmp:图片字型码指针
** 输 出:
**
** 全局变量: 无
** 调用模块: wr_lcd();
** 说明:
** 注意:
********************************************************************************************************/
void Lcd_drawbmp(const unsigned char *bmp)
{
unsigned char i,j;
Lcd_clrbmp();
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend,1);
for(i=0;i<32;i++)
{
for(j=0;j<8;j++)
{
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend+2,1);
wr_lcd(0x80+i,1);
wr_lcd(0x80+j,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(*bmp++,0);
wr_lcd(*bmp++,0);
}
}
for(i=0;i<32;i++)
{
for(j=8;j<16;j++)
{
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend+2,1);
wr_lcd(0x80+i,1);
wr_lcd(0x80+j,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(*bmp++,0);
wr_lcd(*bmp++,0);
}
}
wr_lcd(0x36,1);
wr_lcd(Lcd_Set_Function_Basic,1); //30H--基本指令操作
}
/*********************************************************************************************************
** 函数名称: void Lcd_clrbmp(void)
** 功能描述: 清除bmp图片
** 输 入:
** 输 出:
** 全局变量: 无
** 调用模块: Lcd_scomm() Lcd_sdata()
** 说明:
** 注意:
********************************************************************************************************/
void Lcd_clrbmp(void)
{
unsigned char i,j;
// wr_lcd(Lcd_Clear,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend,1);
for(i=0;i<32;i++)
{
for(j=0;j<16;j++)
{
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend+2,1);
wr_lcd(0x80+i,1);
wr_lcd(0x80+j,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(0x00,0);
wr_lcd(0x00,0);
}
}
wr_lcd(0x36,1);
wr_lcd(Lcd_Set_Function_Basic,1); //30H--基本指令操作
}
/*********************************************************************************************************
** 函数名称: Lcd_lineclr()
** 功能描述: 清除一行的显示
** 输 入: unsigned char row 要清除显示的行
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************************************************/
void Lcd_lineclr(unsigned char row)
{
unsigned char i;
switch(row)
{
case 1:
{
wr_lcd(Lcd_Set_Ddram,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
case 2:
{
wr_lcd(Lcd_Set_Ddram+0x10,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
case 3:
{
wr_lcd(Lcd_Set_Ddram+0x08,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
case 4:
{
wr_lcd(Lcd_Set_Ddram+0x18,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
default: break;
}
}
/*********************************************************************************************************
** 函数名称: void Lcd_linedisp(unsigned char *p,unsigned char row)
** 功能描述: 在一行中显示
** 输 入: unsigned char row 要清除显示的行
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************************************************/
void Lcd_linedisp(unsigned char *p,unsigned char row)
{
unsigned char i;
switch(row)
{
case 1:
{
Lcd_lineclr(1);
wr_lcd(Lcd_Set_Ddram,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
case 2:
{
Lcd_lineclr(2);
wr_lcd(Lcd_Set_Ddram+0x10,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
case 3:
{
Lcd_lineclr(3);
wr_lcd(Lcd_Set_Ddram+0x08,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
case 4:
{
Lcd_lineclr(4);
wr_lcd(Lcd_Set_Ddram+0x18,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
}
}
/*********************************************************************************************************
** 函数名称: void Lcd_backwhite(unsigned char line)
** 功能描述: 反白显示
** 输 入: unsigned char row 要反白显示的行 row=0,1行3行反白显示 row=1,二行四行反白显示
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************************************************/
void Lcd_backwhite(unsigned char line)
{
wr_lcd(Lcd_Set_Function_Extend,1);
wr_lcd(Lcd_Back_White+line,1);
wr_lcd(Lcd_Set_Function_Basic,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -