📄 lcd_test1.c
字号:
/////////////LCD测试程序//////////////
////////////lcd_test1.c//////////////
#include "C8051F040.h" // Register definition file.
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define toup sendc(0x14) //lcd光标右移
#define todown sendc(0x10)//lcd光标左移
#define curshow sendc(0x0f)//显示光标
#define home sendc(0x02)//移到首行
#define cls sendc(0x01)//清屏
sbit lcdrs=P5^2;//硬件控制接口
sbit lcdrw=P5^1;
sbit lcdcs=P5^0;
void delay1ms(uint time){//延迟1ms*time,这不是一个精确值
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void sendc(uchar c){//给lcd送命令
SFRPAGE = 0x0f;//以下实际上是对lcd发送命令的时序图进行操作的
P4=c;
lcdrs=0;
lcdrw=0;
EA=0;
lcdcs=1;
lcdcs=0;
lcdcs=1;
lcdrw=1;
P4=0xff;//先置1,后读取
lcdrs=0;
while(P4>=0x80);
lcdcs=0;
lcdcs=1;
EA=1;
if(c==1)
delay1ms(2);
}
void dispini(){ //lcd显示初始化
delay1ms(100);
SFRPAGE=0xf;
lcdcs=0;
lcdrs=1;
lcdrw=1;
delay1ms(30);
sendc(0x38);//8位,2行,5*7字体
delay1ms(100);
sendc(0x0c);//显示开,光标关;不闪
delay1ms(100);
sendc(0x06);//增量方式,现不移动
delay1ms(100);
sendc(0x01);//清屏
delay1ms(100);
}
void sendd(uchar c){//给lcd送数据
SFRPAGE = 0x0f;
EA=0;
P4=c;
lcdrs=1;
lcdrw=0;
lcdcs=1;
lcdcs=0;
lcdcs=1;
lcdrw=1;
P4=0xff;//先置1,后读取
lcdrs=0;
while(P4>=0x80);
lcdcs=0;
lcdcs=1;
EA=1;
}
void config (void) {
//看门狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出
XBR3 = 0x00;
SFRPAGE = 0x0F;
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P4MDOUT = 0x00; //P4口为开漏
P5MDOUT = 0x07;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN = 0xFF; //所有端口为数字输入,没有模拟输入端口
P2MDIN = 0xFF;
P3MDIN = 0xFF;
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用内部晶振,为24.5MHZ8分频
}
void dispmoveauto(){//自动移位显示
xdata uchar i;
sendc(0x01);//清屏
delay1ms(2);
sendc(0x80);
for(i=0;i<16;i++){
sendd('a'+i);//第一行显示
}
delay1ms(1000);
sendc(0x07);//设置为移动显示模式,AC自增
for(i=0;i<26;i++){
sendd('A'+i);//当CG RAM地址自增超过第一行地址时,自动跳到第二行地址
delay1ms(500);
}
for(i=0;i<26;i++){
sendd('a'+i);
delay1ms(500);
}
}
void makelogo1(){
sendc(0x48);//CG RAM 地址设定指令,写地址0x08,即定义代码0x01的点阵数据
sendd(0x04);//给CG RAM写数据,定义点阵数据,为一片叶子的点阵,一共8行
sendd(0x0e);
sendd(0x1f);
sendd(0x1f);
sendd(0x1f);
sendd(0x0e);
sendd(0x04);
sendd(0x0e);
}
uchar readd(){//给显示lcd送显示字符
uchar k;
SFRPAGE = 0x0f;
EA=0;
lcdrw=1;
P4=0xff;
lcdrs=1;
k=P4;
lcdcs=0;
lcdcs=1;
P4=0xff;//先置1,后读取,否则所读数据可能有误
lcdrs=0;
while(P4>=0x80);//读LCD是否为忙
lcdcs=0;
lcdcs=1;
EA=1;
return k;
}
void dispmovemanual(){
xdata uchar i;
sendc(0x80);
for(i=0;i<26;i++){
sendd('a'+i);//一次性将‘a’至‘z’数据写入第一行内存中
}
delay1ms(100);
for(i=0;i<40;i++){
sendc(0x18);
delay1ms(300);//每隔三十毫秒移动一次数据
}
for(i=0;i<12;i++){
sendd('0'+i);//操作完移位指令后继续在第一行中写入‘0’-‘9’和‘:’,‘;’
}
delay1ms(300);
sendc(0xc0);
for(i=0;i<26;i++){//一次性将‘A’至‘Z’写入第二行的内存中
sendd('A'+i);
}
for(i=0;i<12;i++){//继续在第二行中写入‘0’-‘9’和‘:’,‘;’
sendd('0'+i);
}
delay1ms(1000);
for(i=0;i<40;i++){//移位指令,整屏移动
sendc(0x18);
delay1ms(600);
}
}
main(){
xdata uchar readdata[6];
uchar t;
config();
dispini();
dispmovemanual();//手动移位显示
cls;//清零
makelogo1();//设置自定义点阵
delay1ms(1000);
sendc(0x80);//连续写入5个数据,以供读取值比较
sendd(0x01);//显示自定义点阵
sendd(0x31);
sendd(0x32);
sendd(0x61);
sendd(0x62);
sendd(0x71);
sendc(0x80);
for(t=0;t<6;t++)
readdata[t]=readd();
delay1ms(1000);
dispmoveauto();//自动移位显示,每写一个数据,自动移位一次
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -