📄 5110-avr.txt
字号:
/**********************************************
NOKIA5110LCD驱动函数
-----------------------------------------------
1:模拟SPI方式实现任意端口接入液晶
2:能实现中英文,图片的显示,由于液晶没有y轴指针,
使用起来不是很方便.
3:汉字或图片必须使用纵向取模,字节倒序方式
-----------------------------------------------
***********************************************/
#include "font.h"
/*************************************************************
5110LCD与单片机的连接如下
RESET PB0
D/C PB1
SDIN PB2
SCLK PB3
SCE GND
常用函数:
1:LCD_clr(); 清屏函数
2:LCD_init(); 初始化函数
3:LCD_SET_XY(x,y); 光标定位函数
4:LCD_write_char('A'); 字符输入函数
5:LCD_write_string(x,y,"AA") 字符串输入函数
6:LCD_draw_bmp(x,y,bmp,x_pix,y_pix) 位图绘制函数
7:LCD_write_hz(x,y,"字") 汉字输入函数
8:LCD_write_hz_sring(x,y,"汉字") 多汉字输入函数
****************************************************************/
#define SET_BIT(io,bit) ( io |= (1<<bit) ) //example: SET_BIT(PORTA,0);SET_BIT(DDRA,0);
#define CLR_BIT(io,bit) ( io &= ~(1<<bit) ) //example: CLR_BIT(PORTA,0);CLR_BIT(DDRA,0);
#define GET_BIT(pin ,bit) ( pin & (1<<bit) ) //example: GET_BIT(PINA,0);
#define LCD_DDR_RESET SET_BIT(DDRB,0 )
#define LCD_SET_RESET CLR_BIT(PORTB,0) //RESET=0时,LCD复位
#define LCD_CLR_RESET SET_BIT(PORTB,0)
#define LCD_DDR_DATA SET_BIT(DDRB,1 )
#define LCD_SET_DATA SET_BIT(PORTB,1) //DC=0_指令,DC=1_数据
#define LCD_SET_COM CLR_BIT(PORTB,1)
#define LCD_DDR_SDIN SET_BIT(DDRB,2 )
#define LCD_SDIN_1 SET_BIT(PORTB,2)
#define LCD_SDIN_0 CLR_BIT(PORTB,2)
#define LCD_DDR_SCLK SET_BIT(DDRB,3 )
#define LCD_SCLK_1 SET_BIT(PORTB,3)
#define LCD_SCLK_0 CLR_BIT(PORTB,3)
/*-----------------------------------------------------------------------
LCD_write : 液晶位操作函数
-----------------------------------------------------------------------*/
void LCD_write(unsigned char byte)
{
unsigned char i; //先写数据的高位,后写低位
for(i=128;i>0;i>>=1)
{
if( byte & i ) LCD_SDIN_1;
else LCD_SDIN_0;
LCD_SCLK_0;
LCD_SCLK_1;
}
}
#include "font.h"
/*************************************************************
5110LCD与单片机的连接如下
RESET PB0
D/C PB1
SDIN PB2
SCLK PB3
SCE GND
常用函数:
1:LCD_clr(); 清屏函数
2:LCD_init(); 初始化函数
3:LCD_SET_XY(x,y); 光标定位函数
4:LCD_write_char('A'); 字符输入函数
5:LCD_write_string(x,y,"AA") 字符串输入函数
6:LCD_draw_bmp(x,y,bmp,x_pix,y_pix) 位图绘制函数
7:LCD_write_hz(x,y,"字") 汉字输入函数
8:LCD_write_hz_sring(x,y,"汉字") 多汉字输入函数
****************************************************************/
#define SET_BIT(io,bit) ( io |= (1<<bit) ) //example: SET_BIT(PORTA,0);SET_BIT(DDRA,0);
#define CLR_BIT(io,bit) ( io &= ~(1<<bit) ) //example: CLR_BIT(PORTA,0);CLR_BIT(DDRA,0);
#define GET_BIT(pin ,bit) ( pin & (1<<bit) ) //example: GET_BIT(PINA,0);
#define LCD_DDR_RESET SET_BIT(DDRB,0 )
#define LCD_SET_RESET CLR_BIT(PORTB,0) //RESET=0时,LCD复位
#define LCD_CLR_RESET SET_BIT(PORTB,0)
#define LCD_DDR_DATA SET_BIT(DDRB,1 )
#define LCD_SET_DATA SET_BIT(PORTB,1) //DC=0_指令,DC=1_数据
#define LCD_SET_COM CLR_BIT(PORTB,1)
#define LCD_DDR_SDIN SET_BIT(DDRB,2 )
#define LCD_SDIN_1 SET_BIT(PORTB,2)
#define LCD_SDIN_0 CLR_BIT(PORTB,2)
#define LCD_DDR_SCLK SET_BIT(DDRB,3 )
#define LCD_SCLK_1 SET_BIT(PORTB,3)
#define LCD_SCLK_0 CLR_BIT(PORTB,3)
/*-----------------------------------------------------------------------
LCD_write : 液晶位操作函数
-----------------------------------------------------------------------*/
void LCD_write(unsigned char byte)
{
unsigned char i; //先写数据的高位,后写低位
for(i=128;i>0;i>>=1)
{
if( byte & i ) LCD_SDIN_1;
else LCD_SDIN_0;
LCD_SCLK_0;
LCD_SCLK_1;
}
}
/*-----------------------------------------------------------------------
LCD_SET_XY : 光标定位函数
输入参数:X、Y :光标定位,x(0-83)是列地址,y(0-5)是行地址?
-----------------------------------------------------------------------*/
void LCD_SET_XY(unsigned char x,unsigned char y)
{
LCD_SET_COM;
LCD_write(x+128);
LCD_write(y+64);
}
/*-----------------------------------------------------------------------
LCD_write_char : 字符输入函数
输入参数:X、Y :字符串的起始X、Y坐标;
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char character) //显示ASCII值的字符
{
unsigned char i=0;
unsigned int No;
No=character-32; //字模数据是由空格开始,空格字符的ASCII的值就是32
No=No*5; //每个字符的字模是5个字节
LCD_SET_DATA;
while(i<5) //一个字符的字模是5个字节,就是5*8点阵
{
LCD_write(data[No]);
i++;
No++;
}
LCD_write(0); //每个字符之间空一列
}
/*-----------------------------------------------------------------------
lcd_put_string : 字符串输入函数
输入参数:X、Y :字符串的起始X、Y坐标;
*string :最多14*6=84个字符
-----------------------------------------------------------------------*/
void LCD_write_string(unsigned char x,unsigned char y, unsigned char *string ) //显示FLASH里面的字符串
{
LCD_SET_XY(x,y);
while(*string)
{
LCD_write_char( *string++ ); //顺序显示字符
}
}
/*-----------------------------------------------------------------------
LCD_draw_bmp : 位图绘制函数
输入参数:X、Y :位图绘制的起始X、Y坐标;
*map :位图点阵数据;
Pix_x :位图像素(长)
Pix_y :位图像素(宽)
-----------------------------------------------------------------------*/
void LCD_draw_bmp(unsigned char X,unsigned char Y,unsigned char *map,
unsigned char Pix_x,unsigned char Pix_y)
{
unsigned int i,n;
unsigned char row;
if (Pix_y%8==0) row=Pix_y/8; //计算位图所占行数
else
row=Pix_y/8+1;
for (n=0;n<row;n++)
{
LCD_SET_XY(X,Y);
for(i=0; i<Pix_x; i++)
{
LCD_write_data(map[i+n*Pix_x]);
}
Y++; //换行
}
}
/*-----------------------------------------------------------------------
LCD_write_hz : 汉字输入函数
输入参数:X、Y :字符串的起始X、Y坐标;
-----------------------------------------------------------------------*/
void LCD_write_hz(unsigned char x, unsigned char y, unsigned char *hz)
{ unsigned char k,i;
for(k=0;k<sizeof(GB_12)/sizeof(GB_12[0]);k++)
{
if(hz[0] == GB_12[k].Index[0] && hz[1] == GB_12[k].Index[1])
break;
}
LCD_SET_XY(x,y);
for(i=0;i<12;i++)
LCD_write_data(GB_12[k].Msk[i]);
LCD_SET_XY(x,y+1);
for(i=12;i<24;i++)
LCD_write_data(GB_12[k].Msk[i]);
}
/*-----------------------------------------------------------------------
LCD_write_hz_sring : 多汉字输入函数
输入参数:X、Y :汉字的起始X、Y坐标;
*string :没有换行功能,一次最多输入7个汉字
-----------------------------------------------------------------------*/
void LCD_write_hz_sring(unsigned char x, unsigned char y,unsigned char *string)
{unsigned char i=0,j=0,k=0;
while(string[i])
{LCD_write_hz(x,y,&string[i]);
x=x+12;
i=i+2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -