📄 cepark-avr
字号:
/**************************************************
LCD12232.c 文件
**************************************************/
#include "LCD12232.h"
unsigned char Bmp001[]=
{
/*------------------------------------------------------------------------------
; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。
; 源文件 / 文字 : 字模
; 宽×高(像素): 122×32
; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/488字节
; 数据转换日期 : 2009-4-30 10:17:15
------------------------------------------------------------------------------*/
//宽的像素数,高的像素数,宽的字节数,参数设置可选
0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x44,0x5C,
0x78,0x50,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0xE0,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x08,0x00,0x00,0x00,0x40,0x40,0x40,0x40,
0xFC,0xFC,0x40,0x40,0x40,0x40,0xFC,0xFC,0x40,0x40,0x40,0x60,0x70,0x60,0x40,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x03,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x50,0x30,0x38,
0x1C,0x18,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0xE2,
0xFF,0xFF,0x22,0x42,0xC3,0x83,0x02,0x00,0xFC,0xF8,0x4B,0x49,0x48,0x48,0x48,0x48,
0x4B,0x49,0x48,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0xFF,0xFE,0x0B,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x0E,
0x0C,0x08,0x00,0x00,0x00,0xC0,0x20,0x18,0x07,0x03,0xFF,0xFF,0x00,0x00,0x01,0x87,
0x80,0x80,0x8F,0x8F,0x84,0x84,0x84,0xFC,0xBC,0x84,0x84,0x84,0x84,0x8F,0x8F,0x40,
0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x30,0x70,0x3F,0x1F,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x40,0x40,0x40,0x20,0x20,0x10,0x18,0x0E,
0x07,0x01,0x00,0x01,0x02,0x0C,0x18,0x38,0x30,0x70,0x30,0x20,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
unsigned char lab1[]={
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00
};
unsigned char lab2[]={
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00
};
unsigned char lab3[]={
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00
};
unsigned char lab4[]={
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00
};
unsigned char lab5[]={
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00
};
unsigned char lab6[]={
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00
};
unsigned char lab7[]={
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00
};
unsigned char lab8[]={
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00
};
unsigned char lab9[]={
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00
};
unsigned char lab0[]={
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00
};
/*****************************************
//display :汉字显示
****************************************/
unsigned char lab_n[]={
/*-- 文字: 汉 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,
0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00
};
unsigned char lab_y[]={
/*-- 文字: 字 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
0x00,0x10,0x0C,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x14,0x0C,0x00,0x00
};
unsigned char lab_l[]={
/*-- 文字: 显 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00,
0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00
};
unsigned char lab_g[]={
/*-- 文字: 示 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00,
0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00
};
unsigned char lab_x[]={
/*-- 文字: 例 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFF,0x02,0x81,0x40,0x33,0x0C,0x03,0x00,0x00,0x07,0x40,0x80,0x7F,0x00,
0x40,0x20,0xF8,0x07,0x02,0x80,0x62,0x1E,0x12,0xF2,0x02,0xF8,0x00,0x00,0xFF,0x00
};
unsigned char lab_u[]={
/*-- 文字: 子 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00
};
unsigned char Add1=0; //
unsigned char Add2=0; //
unsigned char SEL_E1=1; //
unsigned char SEL_E2=2; //
//端口初始化
void LCDPort_Init()
{
//LCD数据端口设置
PORTB = 0xff; //
DDRB = 0xFF; //配置端口PB全部为输出口,LCD数据端口
//LCD控制端口设置
SET_RES;
SET_A0;
SET_RW;
SET_E1;
SET_E2;
DDRA = 0xff; //
Delayms(15);
}
//LCD初始化
void LCD_Init()
{
WriteCommand(0x01,0xe2); //rest 复位
WriteCommand(0x02,0xe2);
//WriteCommand(0x01,0xae); //close display 关显示
//WriteCommand(0x02,0xae);
//WriteCommand(0x01,0xa4); //static driver关静态驱动
//WriteCommand(0x02,0xa4);
WriteCommand(0x01,0xa9); //duty 1/32占空比1/32
WriteCommand(0x02,0xa9);
//WriteCommand(0x01,0xa0); //clockwise output ADC选择,顺时针还是逆时针读取RAM数据
//WriteCommand(0x02,0xa0);
//WriteCommand(0x01,0xee); //end 关闭读修改写,无论读或写操作后,列地址都加1
//WriteCommand(0x02,0xee);
//WriteCommand(0x01,0x00); //行地址设置,设置显示RAM的行地址(Y地址)
//WriteCommand(0x02,0x00);
//WriteCommand(0x01,0xc0); //显示起始行设置。指定显示器从显示RAM中的那一行开始显示
//数据,(起始行=0)
//WriteCommand(0x02,0xc0);
WriteCommand(0x01,0xaf); //opend display 开显示
WriteCommand(0x02,0xaf);
}
//LCD写指令,
void WriteCommand(unsigned char chip_select,unsigned char cmd)
{
if(chip_select & 1) //判断对左页还是右页的操作
{
SET_E1; //如果是左页,E1使能
}
else if(chip_select & 2) //
{
SET_E2; //右页,E2使能
}
CLR_A0; //A0=0 写命令
CLR_RW; //RW=0 写操作
PORTB = cmd; //写命令数据到数据端口
if(chip_select & 1) //
{
CLR_E1; //关闭左右页使能
}
else if(chip_select & 2) //
{
CLR_E2; //
}
SET_A0; //
SET_RW; //
}
//写数据
void WriteData(unsigned char chip_select,unsigned char data)
{
if(chip_select & 1) //判断左右页
{
SET_E1; //
}
else if(chip_select & 2) //
{
SET_E2; //
}
SET_A0; //A0=1,写数据
CLR_RW; //RW=0,写操作
PORTB = data; //写数据到数据端口
if(chip_select & 1) //
{
CLR_E1; //结束使能
}
else if(chip_select & 2) //
{
CLR_E2; //
}
CLR_A0; //
SET_RW; //
}
//清屏
void clear_lcd(void)
{
unsigned char a,b,c;
for(a = 0xb8;a < 0xbc;a++) //清屏0-3页,指令分别是b8,b9,ba,bb(X地址)
{
b = 0; //
WriteCommand(0x01,a); //左,第0页开始
WriteCommand(0x02,a); //右,第0页开始
WriteCommand(0x02,b); //右,第0行开始(Y地址)
WriteCommand(0x01,b); // 左,第0行开始
for(c = 0;c < 61;c++) //总共122列,左右各61列
{
WriteData(0x01,0x00); //左,每列均填充0
WriteData(0x02,0x00); //右,每列均填充0
}
}
}
//写字符
void tex_Write(unsigned char *pt)
{
unsigned char a,b;
if(SEL_E1) //左选中?
{
WriteCommand(0x01,0xb8); //页设置,第0页(X地址)
WriteCommand(0x01,Add1); //第0行开始(Y)地址
for(a = 8;a < 16;a++) //
{
WriteData(0x01,*(pt + a)); //上半部分8-16,总高度16,
}
WriteCommand(0x01,0xb9); //第一页
WriteCommand(0x01,Add1); //
for(b = 0;b < 8;b++) //
{
WriteData(0x01,*(pt + b)); //下半部分
}
}
else if(SEL_E1 == 0) //若为0,写右半边
{
WriteCommand(0x02,0xb8); //
WriteCommand(0x02,Add1); //
for(a = 8;a < 16;a++) //
{
WriteData(0x02,*(pt + a)); //
}
WriteCommand(0x02,0xb9); //
WriteCommand(0x02,Add1); //
for(b = 0;b < 8;b++) //
{
WriteData(0x02,*(pt + b)); //
}
}
if((Add1 + 8) < 61)
Add1 += 8; //如果不超过61列列地址+8
else //
{
Add1 = 0; //超过61列,则列地址置0,写右半边
WriteCommand(0x02,0xb8); //
WriteCommand(0x02,Add1); //
for(a = 12;a < 16;a++) //一个字符占8列,所以在61列之后还要写4列
WriteData(0x02,*(pt + a)); //
WriteCommand(0x02,0xb9); //
WriteCommand(0x02,Add1); //
for(b = 4;b < 8;b++) //
WriteData(0x02,*(pt + b)); //
Add1 += 4; //
SEL_E1 = 0; //
}
}
// 写汉字
void WriteCharacter(unsigned char *pt)
{
unsigned char a,b;
if(SEL_E2) //
{
WriteCommand(0x01,0xba); //
WriteCommand(0x01,Add2); //
for(a=16;a<32;a++) //
{
WriteData(0x01,*(pt+a)); //
}
WriteCommand(0x01,0xbb); //
WriteCommand(0x01,Add2); //
for(b=0;b<16;b++) //
{
WriteData(0x01,*(pt+b)); //
}
}
else if(SEL_E2==0) //
{
WriteCommand(0x02,0xba); //
WriteCommand(0x02,Add2); //
for(a=16;a<32;a++) //
{
WriteData(0x02,*(pt+a)); //
}
WriteCommand(0x02,0xbb); //
WriteCommand(0x02,Add2); //
for(b=0;b<16;b++) //
{
WriteData(0x02,*(pt+b)); //
}
}
if((Add2+16)<61)
Add2+=16; //
else
{
Add2=0; //
WriteCommand(0x02,0xba); //
WriteCommand(0x02,Add2); //
for(a=29;a<32;a++)
WriteData(0x02,*(pt+a)); //一个汉字16列,写完61列之后还要写3列
WriteCommand(0x02,0xbb); //
WriteCommand(0x02,Add2); //
for(b=13;b<16;b++)
WriteData(0x02,*(pt+b)); //
Add2+=3; //
SEL_E2=0; //
}
}
//绘图
void Drawing_Map(unsigned char *pt)
{
unsigned char half,seg,page;
unsigned char flag = 1;
for(page = 0xb8;page < 0xbc;page++)
{
for(half = 0;half < 2;half++)
{
flag = !flag;
if(flag)
{
WriteCommand(0x02,page);
WriteCommand(0x02,0x00);
}
else
{
WriteCommand(0x01,page);
WriteCommand(0x01,0x00);
}
for(seg = 0;seg < 61;seg++)
{
if(flag)
{
WriteData(0x02,*pt++);
}
else
{
WriteData(0x01,*pt++);
}
}
}
}
}
//us级别的延时函数
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(3); //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
//个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
}
}
//ms级别的延时函数
void Delayms(unsigned int lms)
{
while(lms--)
{
_delay_loop_2(3000); //延时1ms
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -