📄 12864.c
字号:
/*******************************************************
连线:RS(D/I)=P2^4 R/W=P2^5 E=P2^6 DB0~DB7=P0^0~P0^7
CS1(left)=P2^1 CS2(right)=P2^2 RET=P2^3
********************************************************/
/******头文件+宏定义**************/
#include<reg52.h>
#include<stdlib.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
/**************引脚定义***************/
#define Dataport P0 //LCD信号I/O管脚
sbit CSl=P2^1; //前64列
sbit CSr=P2^2; //后64列
sbit RET=P2^3; //复位
sbit RS=P2^4; //数据&指令
sbit RW=P2^5; //读写
sbit E=P2^6; //使能
uchar Page; //页地址
uchar Col; //列地址
//uchar code HZK_12[]; //12*12点阵字模
uchar code ASC_57[]; //5*7点阵字模
//uchar str[4];
/************函数定义********************/
void lcd_BusyL(void); //左屏检测忙
void lcd_BusyR(void); //右屏检测忙
void CheckBusy(void); //读取忙信号
void Delay(uint MS); //延时
void Locatexy(void); //将屏幕横向0-128纵向0-7转换成左、右屏的的X、Y
void WriteCommandL( uchar CommandByte ); //向左屏写入指令
void WriteCommandR( uchar CommandByte ); //向右屏写入指令
uchar ReadData( void ); //读数据
void WriteData( uchar DataByte ); //写数据
void lcdClear( void ); //清屏
void lcdInit( void ); //初始化
//void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个12*12的汉字
//uchar * uchartostr(unsigned char unm); //将值转成字符串
void lcdPutAsc( uchar asc ); //显示一个5*7的ASC字符
void lcdPutstr( uchar row,uchar y,uchar * str ); //在设定位置显示字符串
//void LcmPutpoint( uchar ro,uchar lie,uchar colour ); //在设定位置显示一个点
/*************忙判别*****************************/
void lcd_BusyL(void)
{
CSl=1;
CSr=0;
CheckBusy();
}
void lcd_BusyR(void)
{
CSl=0;
CSr=1;
CheckBusy();
}
void CheckBusy(void)
{
RS=0;
RW=1;
Dataport=0xff;
while(1)
{
E=1;
_nop_();
if(Dataport<0x80) break;
E=0;
_nop_();
}
E=0;
_nop_();
}
/**************设定LCD上的坐标数据*****************/
void Locatexy(void)
{
uchar x,y;
switch (Col&0xc0) // col.and.0xC0
{ //条件分支执行
case 0: {lcd_BusyL();break;}//左区
case 0x40: {lcd_BusyR();break;}//右区
}
x = Col&0x3f|0x40; // col.and.0x3f.or.Set Y Address
y = Page&0x07|0xb8; // row.and.0x07.or.set Page
CheckBusy(); // waitting for enable
RS = 0; //指令
RW = 0; //写
Dataport = y; //设置页面地址
E = 1;
_nop_();
E = 0;
_nop_();
CheckBusy(); // waitting for enable
RS = 0;
RW = 0;
Dataport = x; //设置列地址
E = 1;
_nop_();
E = 0;
_nop_();
}
/***************写指令********************/
void WriteCommandL( uchar CommandByte )
{
lcd_BusyL();
Dataport = CommandByte;
RS = 0; //指令
RW = 0;
E = 1;
_nop_();
E = 0;
_nop_();
}
void WriteCommandR( uchar CommandByte )
{
lcd_BusyR();
Dataport = CommandByte;
RS = 0; //指令
RW = 0;
E = 1;
_nop_();
E = 0;
_nop_();
}
/****************读数据*******************/
uchar ReadData( void )
{
uchar DataByte;
Locatexy(); //坐标定位,返回时保留分区状态不变 */
RS = 1; //数据输出
RW = 1; //读入
Dataport = 0xff; //输出0xff以便读取正确
E = 1; //读入到LCD
_nop_();
DataByte = Dataport; //数据读出到数据口P0
E = 0;
_nop_();
return DataByte;
}
/******************写数据***********************/
void WriteData( uchar DataByte )
{
Locatexy(); //坐标定位,返回时保留分区状态不变
RS = 1; //数据输出
RW = 0; //写输出
Dataport = DataByte; //数据输出到数据口
E = 1; //写入到LCD
_nop_();
E = 0;
_nop_();
}
/*****************清屏************************/
void lcdClear( void )
{
Page = 0;
Col = 0;
for(Page=0;Page<8;Page++)
for(Col=0;Col<128;Col++)
WriteData(0);
}
/********************初始化*******************/
void lcdInit( void )
{
Delay(200); //等待复位
WriteCommandL(0x3f); //开显示
WriteCommandR(0x3f);
WriteCommandL(0xc0); //设置起始地址=0
WriteCommandR(0xc0);
WriteCommandL(0x3f); //开显示
WriteCommandR(0x3f);
lcdClear();
Col = 0;
Page= 0;
Locatexy();
}
/************************输入ASC码********************/
void lcdPutAsc( uchar asc )
{
uchar j;
uint x;
x = 5*(asc-32);
for(j=0;j<5;j++)
{
WriteData(ASC_57[x]);
x++;
Col++;
}
WriteData(0x00);
Col++;
}
void lcdPutstr( uchar row,uchar y,uchar * str )
{ unsigned char * x;
x=str;
Page=row;
Col=y;
while(*x!='\0')
{ lcdPutAsc( *x );
x++;
}
}
/**************************延时********************/
void Delay(uint MS)
{
uchar us,usn;
while(MS!=0)
{
usn = 2; //for 12M
while(usn!=0)
{
us=0xf6;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
void Main( void )
{
//uchar x,i;
lcdInit();
lcdClear();
while(1)
{
//LcmClear();
// LcmPutBMP(BMP1);
//Delay(3000);
lcdClear();
//LcmReverseBMP();
//Delay(1000);
//LcmClear();
//x=0;
//for(i=0;i<8;i++)
// {
// LcmPutHZ_12(x,i*7,i);
//x=x+16;
//}
lcdPutstr(1,1,"shall by too dull doll by too jack won,");
lcdPutstr(3,1,"dolphin long can Jim shall by too low,");
lcdPutstr(5,1,"shall by too when dull low, doll car low,");
lcdPutstr(7,1,"dolphin long doll Ham Eason 'more power'!");
//lcdPutstr( 4,2,"Hello" );
//lcdPutstr( 6,35,"World!" );
Delay(5000);
}
}
//ASCII字符
uchar code ASC_57[]={
0x00, 0x00, 0x00, 0x00, 0x00, //space
0x00, 0x00, 0x4F, 0x00, 0x00, //!
0x00, 0x07, 0x00, 0x07, 0x00, //
0x14, 0x7F, 0x14, 0x7F, 0x14, //
0x24, 0x2A, 0x7F, 0x2A, 0x12, //
0x23, 0x13, 0x08, 0x64, 0x62, //
0x36, 0x49, 0x55, 0x22, 0x50, //
0x00, 0x05, 0x03, 0x00, 0x00, //
0x00, 0x1C, 0x22, 0x41, 0x00, //
0x00, 0x41, 0x22, 0x1C, 0x00, //
0x14, 0x08, 0x3E, 0x08, 0x14, //
0x08, 0x08, 0x3E, 0x08, 0x08, //
0x00, 0x50, 0x30, 0x00, 0x00, //
0x08, 0x08, 0x08, 0x08, 0x00, //
0x00, 0x60, 0x60, 0x00, 0x00, //
0x20, 0x10, 0x08, 0x04, 0x02, //
0x3E, 0x51, 0x49, 0x45, 0x3E, //0
0x00, 0x42, 0x7F, 0x40, 0x00, //1
0x42, 0x61, 0x51, 0x49, 0x46, //2
0x21, 0x41, 0x45, 0x4B, 0x31, //3
0x18, 0x14, 0x12, 0x7F, 0x10, //4
0x27, 0x45, 0x45, 0x45, 0x39, //5
0x3C, 0x4A, 0x49, 0x49, 0x30, //6
0x01, 0x01, 0x79, 0x05, 0x03, //7
0x36, 0x49, 0x49, 0x49, 0x36, //8
0x06, 0x49, 0x49, 0x29, 0x1E, //9
0x00, 0x36, 0x36, 0x00, 0x00, //
0x00, 0x56, 0x36, 0x00, 0x00, //
0x08, 0x14, 0x22, 0x41, 0x00, //
0x14, 0x14, 0x14, 0x14, 0x14, //
0x00, 0x41, 0x22, 0x14, 0x08, //
0x02, 0x01, 0x51, 0x09, 0x06, //
0x32, 0x49, 0x79, 0x41, 0x3E, //
0x7E, 0x11, 0x11, 0x11, 0x7E, //A
0x41, 0x7F, 0x49, 0x49, 0x36, //B
0x3E, 0x41, 0x41, 0x41, 0x22, //C
0x41, 0x7F, 0x41, 0x41, 0x3E, //D
0x7F, 0x49, 0x49, 0x49, 0x49, //E
0x7F, 0x09, 0x09, 0x09, 0x01, //F
0x3E, 0x41, 0x41, 0x49, 0x7A, //G
0x7F, 0x08, 0x08, 0x08, 0x7F, //H
0x00, 0x41, 0x7F, 0x41, 0x00, //I
0x20, 0x40, 0x41, 0x3F, 0x01, //J
0x7F, 0x08, 0x14, 0x22, 0x41, //K
0x7F, 0x40, 0x40, 0x40, 0x40, //L
0x7F, 0x02, 0x0C, 0x02, 0x7F, //M
0x7F, 0x06, 0x08, 0x30, 0x7F, //N
0x3E, 0x41, 0x41, 0x41, 0x3E, //O
0x7F, 0x09, 0x09, 0x09, 0x06, //P
0x3E, 0x41, 0x51, 0x21, 0x5E, //Q
0x7F, 0x09, 0x19, 0x29, 0x46, //R
0x26, 0x49, 0x49, 0x49, 0x32, //S
0x01, 0x01, 0x7F, 0x01, 0x01, //T
0x3F, 0x40, 0x40, 0x40, 0x3F, //U
0x1F, 0x20, 0x40, 0x20, 0x1F, //V
0x7F, 0x20, 0x18, 0x20, 0x7F, //W
0x63, 0x14, 0x08, 0x14, 0x63, //X
0x07, 0x08, 0x70, 0x08, 0x07, //Y
0x61, 0x51, 0x49, 0x45, 0x43, //Z
0x00, 0x7F, 0x41, 0x41, 0x00, //
0x02, 0x04, 0x08, 0x10, 0x20, //
0x00, 0x41, 0x41, 0x7F, 0x00, //
0x04, 0x02, 0x01, 0x02, 0x04, //
0x40, 0x40, 0x00, 0x40, 0x40, //
0x01, 0x02, 0x04, 0x00, 0x00, //
0x20, 0x54, 0x54, 0x54, 0x78, //a
0x7F, 0x48, 0x44, 0x44, 0x38, //b
0x38, 0x44, 0x44, 0x44, 0x28, //c
0x38, 0x44, 0x44, 0x48, 0x7F, //d
0x38, 0x54, 0x54, 0x54, 0x18, //e
0x00, 0x08, 0x7E, 0x09, 0x02, //f
0x0C, 0x52, 0x52, 0x4C, 0x3E, //g
0x7F, 0x08, 0x04, 0x04, 0x78, //h
0x00, 0x44, 0x7D, 0x40, 0x00, //i
0x20, 0x40, 0x44, 0x3D, 0x00, //j
0x00, 0x7F, 0x10, 0x28, 0x44, //k
0x00, 0x41, 0x7F, 0x40, 0x00, //l
0x7C, 0x04, 0x78, 0x04, 0x78, //m
0x7C, 0x08, 0x04, 0x04, 0x78, //n
0x38, 0x44, 0x44, 0x44, 0x38, //o
0x7E, 0x0C, 0x12, 0x12, 0x0C, //p
0x0C, 0x12, 0x12, 0x0C, 0x7E, //q
0x7C, 0x08, 0x04, 0x04, 0x08, //r
0x58, 0x54, 0x54, 0x54, 0x64, //s
0x04, 0x3F, 0x44, 0x40, 0x20, //t
0x3C, 0x40, 0x40, 0x3C, 0x40, //u
0x1C, 0x20, 0x40, 0x20, 0x1C, //v
0x3C, 0x40, 0x30, 0x40, 0x3C, //w
0x44, 0x28, 0x10, 0x28, 0x44, //x
0x1C, 0xA0, 0xA0, 0x90, 0x7C, //y
0x44, 0x64, 0x54, 0x4C, 0x44, //z
0x00, 0x08, 0x36, 0x41, 0x00, //
0x00, 0x00, 0x77, 0x00, 0x00, //
0x00, 0x41, 0x36, 0x08, 0x00, //
0x02, 0x01, 0x02, 0x04, 0x02, //
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -