📄 lcm320240.c
字号:
/*****************************************
程序名称:cm320240底层驱动子程序
功能说明:
更新时间:2008-05-3 8:33
******************************************/
/* `CM320240-3E模拟口线接线方式
连接线图:
-----------------------------------------------
|VDD,LEDA-----+5V VSS,LEDK-----GND
|VO接20K可调电阻
|DB0-----PB0 | DB4-----PB4 | WR-------PC0 |
|DB1-----PB1 | DB5-----PB5 | RD-------PC1 |
|DB2-----PB2 | DB6-----PB6 | CS-------PC6 |
|DB3-----PB3 | DB7-----PB7 | A0-------PC7 |
------------------------------------------------- */
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
#define SystemSet 0x40 //初始化指令代码为40H,以下是该指令带有的8个参数设置
uchar ParaSysTable[8]= {0x30,0x87,0x07,0x27,0x42,0xF0,0x28,0x00}; //320*240
/*SystemSet指令带有的8个参数定义:
P1=0x30---P1.5=IV= 1 : 画面无边界; P1.3=W/S=0:为单屏结构LCD驱动系统,(为0则为双屏);
P1.2=M2= 0 : 外部CGRAM的字符点阵格式为8*8,(为1则为8*16);
P1.1=M1= 0 : 外部CGRAM的字符代码范围选择80H-9FH,(为1则选择E0H-FFH);
P1.0=M0= 0 : 内、外发生器选择内部有效,(为1则外部有效,内部被屏蔽)。
P2=0x87---P2(7--3)="10000",WF=1,交流驱动波形
P2(2--0)=FX="111",字符宽+字距=7H
P3=0x07---P3(3--0)=FY="0111",字符高+行距=7H
P4=0x28---P4=C/R=28H=40,设置有效显示长度(字符数)为40,即整行均有效
P5=0x42---P5=TC/R=66,
P6=0xF0---P6=L/F=240,LCD的点行数
P7=30,P8=00---P(8,7)=AP,通常为C/R+1,AP为双字节参数,为显示屏一行所占显示缓冲器的个数??? */
#define Scroll 0x44 //设置RAM区中显示区的起始地址及所占有的显示行数;
//它与SystemSet中AP数结合,可确定显示区所占的字节数,有是个参数
uchar ParaScrTableA[10]={0x00,0x00,0xF0,0x00,0x40,0xF0,0x00,0x80,0x00,0x00};
//uchar ParaScrTableA[10]={0x00,0x00,0xF0,0x00,0x00,0x80,0x00,0x00,0x00,0x00};
/*Scroll指令各参数定义:
P1=0,P2=0,P3=F0H : SAD1=0000H,SL1=F0H=240;
P4=0,P5=40H,P6=F0H : SAD2=4000H,SL2=F0H=240;
P7=0,P8=80H : SAD3=8000H, P9=P10=0 : SAD4=0; */
#define DispOn 0x59
#define DispOnP1 0x56 //P1=54H=01010100B,光标显示不闪烁/?只显示第一区//00000110???
#define Ovlay 0x5B
#define OvlayP1 0x04 //一区为图形显示,二区为文本方式
#define HdotScr 0x5A //设置以点为单位的显示画面水平移动量
#define HdotScrP1 0x00 //P1=0
#define CsrForm 0x5D //设置光标的显示方式与形状
#define CsrFormP1 0x07 //CRX=07H
#define CsrFormP2 0x87 //CRY=07H,(若CM=1,但仅在文本方式下有效)
#define CgramAdr 0x5C //设置CGRAM的起始地址SAG;SAG只是相对地址
#define CgramAdrP1 0x00 //SAG=8000H
#define CgramAdrP2 0x80
#define CsrDirR 0x4C //设置光标地址指针自动移动方向为Right
#define CsrDirL 0x4D //设置光标地址指针自动移动方向为Left
#define CsrDirUp 0x4E //设置光标地址指针自动移动方向为Up
#define CsrDirDn 0x4F //设置光标地址指针自动移动方向为Down
#define CsrW 0x46 //设置光标地址CSR
#define CsrR 0x47 //该指令读光标当前地址值
#define mWrite 0x42
#define mRead 0x43
#define paraP9 0x28 //because the number of word ???
#define PARA 0x30
#define BasePart1 0x00
#define BasePart2 0x40
#define BasePart3 0x80
#define BasePart4 0x00
void WriteDataLCM(uchar data); //写数据
uchar ReadDataLCM(void); //读数据
void WriteCommandLCM(uchar cmd); //写指令
void LCMInit(void); //LCM初始化
void LCMClear(void);
void Locatexy(uchar x,uchar y, uchar attribs);
void Point(uint Px, uchar Py, uchar attr );
void DrawRim(void);
void circle(uint Ox,uchar Oy,uchar Rx,uchar attr);
void TextDisp( uchar Ox,uchar Oy, uchar *ptr );
void PutCdotInGraph( uint Ox, uchar Oy, uchar Cnumber, uchar DotWidth );
void delay_1us(void);
void delay_nus(uint n);
void delay_nms(uint n);
void delay_ns(uint n);
uchar Cdotlib[][32]={
{0x80,0x00,0x7F,0xFE,0x02,0x22,0x82,0x22,//脉
0xFF,0xFF,0x10,0x42,0x0C,0x48,0x43,0x48,
0x80,0xC9,0x7F,0xFA,0x00,0xC0,0x03,0x20,
0x0C,0x10,0x18,0x18,0x08,0x00,0x00,0x00},
{0x02,0x10,0x42,0x10,0x81,0x10,0x7F,0xFF,//搏
0x08,0x90,0x08,0x04,0x1B,0xF4,0x29,0x54,
0x09,0x54,0x4B,0xFF,0x89,0x54,0x7D,0x55,
0x0B,0xF6,0x08,0x04,0x08,0x00,0x00,0x00},
{0x08,0x40,0x87,0x7C,0x40,0x40,0x2F,0xFF, //频
0x10,0x48,0x0F,0x6C,0x80,0x4A,0x8F,0xF2,
0x40,0x12,0x20,0x1A,0x1F,0xD6,0x20,0x12,
0x40,0x12,0xCF,0xFB,0x00,0x12,0x00,0x00},
{0x08,0x00,0x09,0x14,0x08,0xA4,0x08,0x44, //率
0x09,0x04,0x09,0x24,0x09,0xB5,0xFF,0x6E,
0x09,0x24,0x09,0x94,0x0B,0x04,0x08,0x44,
0x08,0xA6,0x0D,0x14,0x08,0x00,0x00,0x00},
/* {0x00,0x00,0x00,0x00,0x33,0x00,0x33,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},*/
{
0x20,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,//Hz
0x01,0x00,0x21,0x08,0x3F,0xF8,0x20,0x08,
0x00,0x00,0x21,0x80,0x30,0x80,0x2C,0x80,
0x22,0x80,0x21,0x80,0x30,0x80,0x00,0x00},
{0x02,0x10,0xFE,0x21,0x01,0x86,0x40,0x70,
0x7F,0x00,0x41,0x7E,0x41,0x4A,0x7F,0x4A,
0x41,0x4A,0x41,0x4A,0x7F,0x4A,0x41,0x7E,
0x41,0x00,0x7F,0x00,0x40,0x00,0x00,0x00},
{0x80,0x00,0x60,0x00,0x1F,0xFC,0x80,0x04,//度
0x80,0x24,0x42,0x24,0x46,0xFC,0x2A,0xA5,
0x12,0xA6,0x12,0xA4,0x2A,0xFC,0x26,0x24,
0x42,0x24,0xC0,0x24,0x40,0x04,0x00,0x00},
{
0x00,0x00,0x00,0x18,0x00,0x24,0x00,0x24,//°C
0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xC0,0x18,0x30,0x20,0x08,0x20,0x08,
0x20,0x08,0x10,0x08,0x08,0x38,0x00,0x00}
};
// 24点阵汉字演示,每个汉字72字节,每行3字节
uchar Cdot24lib[10*9*8]={
/*-- 文字: 江 --*/
/*-- 华文行楷18; 此字体下对应的点阵为:宽x高=24x25 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0xCF,0x80,0x0F,
0xFE,0x4C,0x0F,0xC0,0x7C,0x01,0xF0,0x78,0x00,0x78,0x78,0x00,0xE0,0x70,0x00,0xE1,
0x00,0x00,0xE3,0x80,0x00,0xFF,0x80,0x00,0x7F,0x80,0x00,0x7F,0xC0,0x00,0x7F,0xC0,
0x00,0x77,0xC0,0x00,0xF3,0x80,0x00,0xF0,0x00,0x00,0xE0,0x00,0x00,0xC0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0x00,0x00,0x00,
/*-- 文字: 西 --*/
/*-- 华文行楷18; 此字体下对应的点阵为:宽x高=24x25 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x01,
0xFC,0x00,0x03,0xF0,0x00,0x03,0x18,0x00,0x03,0x9C,0xD0,0x03,0xFF,0x70,0x03,0xBF,
0x78,0x01,0x8E,0x78,0x01,0xCE,0x78,0x01,0xFE,0xF8,0x01,0xBF,0xFC,0x07,0x87,0xB8,
0x07,0xC6,0x10,0x03,0xFA,0x00,0x01,0xFE,0x00,0x00,0xFE,0x00,0x00,0x1C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0x00,0x00,0x00,
/*-- 文字: 财 --*/
/*-- 华文行楷18; 此字体下对应的点阵为:宽x高=24x25 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x3F,0xC0,0x07,
0x7F,0xE0,0x03,0xF0,0x30,0x01,0xFC,0xB8,0x01,0xFF,0x98,0x03,0xF0,0x18,0x07,0xFF,
0xF8,0x0F,0xFF,0xF0,0x05,0xC3,0x00,0x0C,0xE3,0x00,0x1C,0x73,0x80,0x18,0x3F,0x80,
0x3F,0xFF,0xEF,0x3F,0xFF,0xFF,0x1F,0x0F,0xFE,0x00,0x07,0xE0,0x00,0x00,0xE0,0x00,
0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 经 --*/
/*-- 华文行楷18; 此字体下对应的点阵为:宽x高=24x25 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x3B,0xC0,0x0E,0x7B,0xC0,0x1F,
0x7D,0xE0,0x0F,0xFF,0xF0,0x01,0xFF,0xFE,0x00,0xFF,0x3E,0x0E,0x1F,0x3E,0x06,0x1D,
0xDC,0x06,0x7E,0x30,0x07,0xEF,0xB0,0x07,0xEF,0xF8,0x03,0xFF,0xF8,0x03,0xFF,0xFC,
0x02,0xFF,0x78,0x06,0x67,0x38,0x06,0x07,0x00,0x06,0x06,0x00,0x06,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 大 --*/
/*-- 华文行楷18; 此字体下对应的点阵为:宽x高=24x25 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0E,
0x00,0x00,0x0E,0x18,0x00,0x0E,0x38,0x00,0x07,0xBC,0x00,0x07,0xFC,0x00,0x03,0xFF,
0x0C,0x00,0xFF,0xFE,0x00,0xDF,0xFC,0x00,0xCF,0xFC,0x01,0xC7,0xC0,0x01,0xC3,0xC0,
0x03,0x81,0xC0,0x07,0x81,0xC0,0x0F,0x81,0x80,0x0F,0x00,0x00,0x0E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 学 --*/
/*-- 华文行楷18; 此字体下对应的点阵为:宽x高=24x25 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x7F,0x00,0x00,
0x0F,0x80,0x00,0x02,0xB8,0x03,0x83,0xF8,0x04,0xC1,0xFC,0x0C,0xCF,0xF0,0x1C,0xEF,
0xCF,0x18,0xFE,0xFF,0x1C,0x7E,0xF1,0x1F,0xFF,0x78,0x0F,0xFF,0x7E,0x03,0xF7,0xEF,
0x00,0xE3,0xE7,0x00,0x41,0xE0,0x00,0x01,0xE0,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 电 --*/
/*-- 黑体16; 此字体下对应的点阵为:宽x高=21x21 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFF,0xE0,0x01,0xFF,0xE0,0x00,
0x62,0x20,0x00,0x62,0x20,0x00,0x62,0x20,
0x00,0x62,0x20,0x03,0xFF,0xFE,0x07,0xFF,
0xFE,0x04,0x62,0x20,0x04,0x62,0x20,0x04,
0x62,0x20,0x04,0x62,0x20,0x04,0x7F,0xE0,
0x04,0x7F,0xE0,0x06,0x00,0x00,0x07,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 子 --*/
/*-- 黑体16; 此字体下对应的点阵为:宽x高=21x21 --*/
0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x0C,0x00,0x06,0x0C,0x00,
0x06,0x04,0x00,0x06,0x04,0x0C,0x06,0x04,0x0C,0x06,0x04,0x0C,0x06,0x04,0x07,0xFF,
0xC4,0x00,0x06,0x64,0x00,0x06,0x64,0x00,0x06,0x34,0x00,0x06,0x1C,0x00,0x06,0x1C,
0x00,0x06,0x0C,0x00,0x06,0x0C,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 学 --*/
/*-- 黑体16; 此字体下对应的点阵为:宽x高=21x21 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0xC0,0x00,0x61,0xC0,0x00,0x60,0x44,0x00,
0x66,0x5C,0x00,0x62,0x58,0x00,0x62,0x40,0x0C,0x62,0x40,0x0C,0x62,0x46,0x0F,0xF2,
0x4E,0x07,0xFA,0x40,0x00,0x6A,0x40,0x00,0x6E,0x60,0x00,0x66,0x78,0x00,0x66,0x4E,
0x00,0x60,0x44,0x00,0x61,0xC0,0x00,0x61,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 院 --*/
/*-- 黑体16; 此字体下对应的点阵为:宽x高=21x21 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x08,0x00,0x41,0x08,0x00,
0xC7,0xF8,0x00,0x7C,0x38,0x04,0x78,0x00,0x04,0x00,0x70,0x06,0x08,0x70,0x03,0x89,
0x10,0x01,0xF9,0x10,0x00,0x09,0x10,0x00,0x09,0x1E,0x07,0xF9,0x10,0x07,0xF9,0x10,
0x0C,0x09,0x10,0x0C,0x09,0x10,0x07,0x08,0x70,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
int main()
{
uchar i,j;
SREG |= 0x80;
DDRC |= 0xC3;
DDRB = 0xFF;
delay_nms(10);
LCMInit(); //LCM初始化
delay_nms(2);
LCMClear();
WriteCommandLCM(DispOn); //写入LCM开显示屏幕指令
WriteDataLCM(DispOnP1); //写入P1参数,光标显示,
delay_nus(20);
DrawRim();
delay_nms(200);
WriteCommandLCM(CsrDirDn);
WriteCommandLCM(mWrite);
for(i=3;i<120;i+=10)
{
circle(120,120,i,1);
delay_nms(15);
}
for(i=0;i<8;i++)
PutCdotInGraph( 35,16*i,i,16);
for(i=0;i<10;i++)
PutCdotInGraph( 37,24*i,i,24);
WriteCommandLCM(CsrDirR);
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{Locatexy(37+i,236+j, 0);
WriteCommandLCM(mWrite);
WriteDataLCM(0x00);}
while(1);
return 0;
}
/*=====================================================
写指令函数,写数据函数,读读数据函数
时序已调好08.5.2
=====================================================*/
void WriteCommandLCM(uchar cmd)
{
DDRB = 0xFF;
PORTB= cmd;
DDRC =0xC3;
PORTC = 0x83; //CS=0,A0=1,RD=1,WR=1
PORTC &= 0xFE;//CS=0,A0=1,RD=1,WR=0
PORTC |= 0x01;//CS=0,A0=1,RD=1,WR=1
PORTC |= 0x40;//CS=1,A0=1,RD=1,WR=1
}
void WriteDataLCM(uchar data) //写数据参数
{
DDRB = 0xFF;
PORTB = data;
DDRC = 0xC3;
PORTC = 0x03; //CS=0,A0=0,RD=1,WR=1
PORTC &= 0xFE;//CS=0,A0=0,RD=1,WR=0
PORTC |= 0x01;//CS=0,A0=0,RD=1,WR=1
PORTC |= 0x40;//CS=1,A0=0,RD=1,WR=1
}
uchar ReadDataLCM(void) //读数据参数
{
uchar res;
DDRC = 0xC3;
PORTC = 0x83; //CS=0,A0=1,RD=1,WR=1
PORTB = 0xFF;
DDRB = 0x00;
PORTC &= 0xFD;//CS=0,A0=1,RD=0,WR=1
asm("nop");
res = PINB;
PORTC |= 0x02;//CS=0,A0=1,RD=1,WR=1
PORTC |= 0x40;//CS=1,A0=1,RD=1,WR=1
return res;
}
/*===================================================*/
void LCMInit(void) //LCM初始化
{
uint i;
delay_nms(5);
DDRC = 0xC3;
WriteCommandLCM(SystemSet); //写系统设置命令
for(i=0;i<8;i++)
{
WriteDataLCM(ParaSysTable[i]); //写P1—P8参数
};
delay_1us();
WriteCommandLCM(Scroll); //写显示区域设定命令
for(i=0;i<10;i++)
{
WriteDataLCM(ParaScrTableA[i]);
};
delay_1us();
WriteCommandLCM(HdotScr); //写入点位移设置指令
WriteDataLCM(HdotScrP1); //写入P1参数,点位移0
delay_1us();
WriteCommandLCM(Ovlay); //写入区域合成设定指令
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -