📄 main.c
字号:
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_LENGTH 128
#define LCD_WIDTH 64
#define Graphic 1
#define TXT 0
#define LCD_DATA XBYTE[0x0000]
#define LCD_Command XBYTE[0x0100]
sbit P10=P1^0;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
/*************************** 是否处于忙态 ************************/
void CheckRW(void) //指令&数据读写状态,看是否处于忙态
{
while( (LCD_Command & 0x03) != 0x03) ;
}
void CheckAutoWrite(void) //数据自动写状态,看是否处于忙态
{
while( (LCD_Command & 0x08) == 0);
}
void CheckScreen(void) //屏读屏拷贝是否出错
{
while( LCD_Command & 0x40 );
}
/********************** 读写数据 ************************/
void WriteData(uchar uData) //写入
{
LCD_DATA = uData;
}
uchar ReadData(void) //读
{
uchar uData;
uData = LCD_DATA;
return uData;
}
/************************ 设置命令操作 *****************/
void Set_Com(uchar com)
{
CheckRW();
LCD_Command = com;
}
void Set_Com_1(uchar param1,uchar com)
{
CheckRW();
LCD_DATA = param1;
CheckRW();
LCD_Command = com;
}
void Set_Com_2(uchar param1,uchar param2,uchar com)
{
CheckRW();
LCD_DATA = param1;
CheckRW();
LCD_DATA = param2;
CheckRW();
LCD_Command = com;
}
/******************** 延时子程序 **************/
void Delay(uint time)
{
uchar us,usn;
while(time!=0) //12M Crystal
{
usn = 2;
while(usn!=0)
{
us=0xf2;
while (us!=0){us--;};
usn--;
}
time--;
}
}
/************************* 初使化LCD ****************/
void Init_LCD(void)
{
Set_Com_2(0x00,0x00,0x40); //设置文本显示区首地址
Set_Com_2(LCD_LENGTH/8,0x00,0x41); //设置文本显示区宽度
Set_Com_2(0x00,0x08,0x42); //设置图形显示区首地址0x0800
Set_Com_2(LCD_WIDTH/4,0x00,0x43); //设置图形显示区宽度
Set_Com(0xA7); //设置光标形状 8x8方块
Set_Com(0x81); //显示方式设置 文本xor图形(异或)
Set_Com(0x9C); //显示开关设置 文本开,图形开,光标闪烁关
}
/******************** 清屏操作 *******************************/
void Clear_LCD(uchar FillByte) //使用FillByte清屏
{
uint i = 8192;
if(FillByte)
{
i -= 2*1024;
Set_Com_2(0x00,0x08,0x24); //填充0xff时候要在图形区
}
else
Set_Com_2(0x00,0x00,0x24);
Set_Com(0xB0); //进入自动写
while(i--)
{
CheckAutoWrite();
WriteData( FillByte );
}
Set_Com(0xB2);
}
/*********************** 设定显示地址 *****************/
void LocateXY(uchar x,uchar y,uchar mode) //0为字符模式,1为图形模式
{
uint temp;
temp= LCD_LENGTH/8*y + x;
if(mode) //mode=1为Graphic
{ //如果图形模式要加上图形区首地址0x0800
temp+=0x0800;
}
Set_Com_2(temp & 0xff,temp/256,0x24);
}
/*********************** 显示字符和字符串 ***************/
void Show_Char(uchar x,uchar y,uchar CharByte)
{
LocateXY(x,y,TXT);
Set_Com_1(CharByte,0xC4);
}
void Show_String(uchar x,uchar y,uchar *str)
{
while(*str != 0)
{
if(x> 29) //自动换行
{
x=0;
y++;
}
Show_Char(x,y,*str);
++x;
++str;
}
}
/*********************** 显示点阵函数 ***************/
void DisplayDots(uchar DotByte,uchar n)
{
uchar i,j;
LocateXY(0,0,Graphic);
Set_Com(0xB0); //进入自动写
for(i=0;i<LCD_WIDTH/n;i++)
{
for(j=0;j<LCD_LENGTH/8*n;j++)
{
CheckAutoWrite();
WriteData(DotByte);
}
DotByte=~DotByte;
}
Set_Com(0xB2); //退出自动写
}
/*********************** 显示汉字函数 ***************/
void DisplayChinese(uchar posx,uchar posy,uchar * Hanzhi) //在指定位置显示一个汉字
{ //横坐标为0~7,纵坐标为0~3(以一个汉字为单位)
uchar i;
unsigned int start;
start = posy*16*16 + posx*2 + 0x0800;
for(i=0;i<16;i++)
{
Set_Com_2(start & 0xff,start/256,0x24);
Set_Com_1(Hanzhi[2*i],0xc0);
Set_Com_1(Hanzhi[2*i+1],0xc4);
start += 16;
}
}
/*********************** 显示图片函数 ***************/
void DisplayPicture(uchar posx,uchar posy,uchar size_x,uchar size_y,uchar *pic)
{ //横坐标为0~15,纵坐标为0~7
uchar i,j;
uint start;
uint width = size_x/8;
start = posy*16*16 + posx*2 + 0x0800;
for(i=0;i<size_y;i++)
{
Set_Com_2(start & 0xff,start/256,0x24);
for(j=0;j<width-1;j++)
{
Set_Com_1(pic[width*i + j],0xc0);
}
Set_Com_1(pic[width*i+j],0xc4);
start += 16;
}
}
/*--------------------------------------------------------------------------------*/
uchar code str1[]= { //"ShenZhen_SunSon_Electronic_INC";//因为6963字符库非规则的
0x33,0x48,0x45,0x4E,0x3A,0x48,0x45,0x4E,0x3F,0x33,0x55,0x4E,0x33,0x4F,0x4E,
//S h e n Z h e n _ S u n S o n
0x3F,0x25,0x4C,0x45,0x43,0x54,0x52,0x4f,0x4E,0x49,0x43,0x3F,0x29,0x2E,0x23,0x00
//_ E l e c t r o n i c _ I N C /0
};
uchar code guo[32] = {
0x00,0x00,0x30,0x00,0x1B,0xFC,0x0B,0xFC,0x01,0x8C,0x71,0x88,0x31,0x98,0x00,0x98,0x00,0xD0,0x30,0xF0,0x30,0x60,0x30,0xF0,0x21,0x98,0x67,0x0F,0x24,0x06,0x00,0x00
};
uchar code picture[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x00,0x00,0x7F,0xFE,0x00,
0x01,0xE0,0x0F,0x00,0x03,0xFF,0xFF,0x80,0x07,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xE0,
0x0F,0xFF,0xFF,0xF0,0x1F,0xFE,0xFF,0xF0,0x1F,0xFE,0xFF,0xF8,0x3F,0xFE,0xEF,0xF8,
0x3F,0xFF,0xDF,0xF8,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xF7,0xFF,0xFC,0x3F,0xEE,0xFF,0xF8,
0x1F,0xFE,0xFF,0xF8,0x1F,0xFE,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,
0x07,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x00,
0x00,0x3F,0xFC,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
void main()
{
P10 = 0;
Delay(60);
P10 = 1;
Init_LCD(); //准备
Clear_LCD(0); //开始
// DisplayChinese(0,1,guo);
// DisplayPicture(1,1,32,32,picture);
Show_String(0,0,str1); //显示一屏字符串
while(1) {}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -