📄 lcd_24064.c
字号:
#include "c8051f020.h"
#include <string.h>
//#include "all_code.h"
#define uchar unsigned char
#define uint unsigned int
#define DATA_IO P5 //数据线接P5
sbit OUT=P1^6;
sbit KEY=P3^7;
//控制线接P3口 数据线接P5口
//sbit CE = P3^1; // 读\写使能
//CE直接接地
sbit RD = P3^3; // 写 控制
sbit CD = P3^5; // 数据\指令 选择 1为指令,0为数据
sbit WR = P3^7; // 读 控制
//函数声明
void System_Init (void);
void Port_Init (void);
uchar Read_State (void);
void Write_Cmd_Non (uchar cmd);
void Write_Cmd_Single (uchar data1,uchar cmd);
void Write_Cmd_Double (uchar data1,uchar data2,uchar cmd);
void Lcd_Init (void);
void Delay(uchar t)
{
uchar k;
while(t--)
for(k=0;k<10;k++);
}
//配置系统时钟使用外部晶振22.1184MHz
void System_Init(void)
{
uchar i;
WDTCN=0xde; //禁用看门狗
WDTCN=0xad;
OSCXCN=0x67;
for ( i=0; i<255; i++ ) ;
while(!(OSCXCN & 0x80 ) ); //等待晶体振荡器稳定
OSCICN=0x88; //选择外部时钟源 允许时钟丢失检测 检测到时钟丢失将复位
CKCON=0x00; //T0 12分频
}
//端口配置
void Port_Init (void)
{
XBR0=0x00; //
XBR1=0x00;
XBR2=0xc0; //允许交叉开关 禁止弱上拉
P0MDOUT=0xff; //1 为推挽 0为漏极开路
P1MDIN=0xff; //0 配置为模拟输入 1 配置为数字输入
P1MDOUT=0xff; //1 为推挽 0为漏极开路
P2MDOUT=0xff; //1 为推挽 0为漏极开路
P3MDOUT=0xff; //1 为推挽 0为漏极开路
P3IF=0; //端口3中断标志
P74OUT=0xff; //P4~P7设置为推挽方式
}
//读状态字
uchar Read_State (void)
{
uchar r_state;
DATA_IO=0xff;
CD=1;
RD=0;
WR=1;
Delay(1);
r_state=DATA_IO;
RD=1;
return (r_state);
}
//写数据
void Write_Data (uchar W_data)
{
while( ( Read_State () & 0x03 ) != 0x03 ) ; //等待数据指令读写状态准备好
CD=0;
WR=0;
RD=1;
Delay(1);
DATA_IO=W_data;
Delay(1);
WR=1;
CD=1;
}
//写命令1--无参数
void Write_Cmd_Non (uchar cmd)
{
while( ( Read_State () & 0x03 ) != 0x03 ) ; //等待数据指令读写状态准备好
CD=1;
WR=0;
RD=1;
Delay(1);
DATA_IO=cmd;
Delay(1);
WR=1;
}
//写命令2--单参数
void Write_Cmd_Single (uchar data1,uchar cmd)
{
Write_Data (data1);
Write_Cmd_Non (cmd);
}
//写命令3--双参数
void Write_Cmd_Double (uchar data1,uchar data2,uchar cmd)
{
Write_Data (data1);
Write_Data (data2);
Write_Cmd_Non (cmd);
}
//LCD初始化
void Lcd_Init (void)
{
Write_Cmd_Double ( 0x00,0x00,0x40 ); //设置文本显示区首地址为0x0000
Write_Cmd_Double ( 0x1e,0x00,0x41 ); //设置文本显示区宽度为30字节(30*8=240)
Write_Cmd_Double ( 0x00,0x08,0x42 ); //设置图形显示区首地址为0x0800
Write_Cmd_Double ( 0x1e,0x00,0x43 ); //设置图形显示区宽度为30字节
Write_Cmd_Non ( 0xa7 ); //光标形状为8点(列)*N行,N的值为0-7H(参数中低半字节)
Write_Cmd_Non ( 0x80 ); //显示方式设置(使用内部CGROM,逻辑或合成)
Write_Cmd_Non ( 0x9c ); //设置显示开关,开文本显示 显示开关(开文本和图形显示方式,禁止光标显示和闪烁)
}
void Lcd_Clr (void)
{
uint t;
Write_Cmd_Double ( 0x00,0x00,0x24 );
Write_Cmd_Non ( 0xb0 );
for (t=0;t<0x2000;t++)
{
while( ( Read_State () & 0x0c ) != 0x0c ) ;
Write_Data (0x00);
}
Write_Cmd_Non ( 0xb2 );
Write_Cmd_Double ( 0x00,0x00,0x24 );
}
void Write_Eng(uchar add,uchar sentence[])
{
uchar i;
Write_Cmd_Non (0x94); //应用文本显示 关图形显示 光标显示和光标闪烁
Write_Cmd_Non (0x84); //启用CGROM和文本属性
Write_Cmd_Double ( add,0x00,0x24 ); //置显示地址
for(i=0;i<strlen(sentence);i++)
{
Write_Cmd_Single ( sentence[i]-32,0xc0 );
}
Write_Cmd_Double ( add,0x08,0x24 ); //置显示地址 为文本属性
for(i=0;i<strlen(sentence);i++)
{
Write_Cmd_Single ( 0x08,0xc0 ); //正显闪烁
}
}
void main( void )
{
System_Init ();
Port_Init ();
Lcd_Init ();
Lcd_Clr ();
Write_Eng(0 ,"Hello! I'm Elbe! QQ:6036725 ");
Write_Eng(60,"Hello! I'm Elbe! QQ:6036725 ");
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -