📄 12864.c
字号:
#include "AT89x51.h"
#include <intrins.h>
#define uchar unsigned char
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
//****定义引脚********//
sbit LCD_CS=P0^0; //原来的RS
sbit LCD_DATA=P0^1; //原来的RW
sbit LCD_CLK=P0^2; //原来的E
sbit LCD_PS=P0^3;
uchar show[]="12864液晶测试程序0123456789ABCDEFGHIJKLMNOPQ";
/////////延时程序/////////
void delay(second) //second=1时,延时5ms子程序
unsigned char second;
{
unsigned char i,j,k;
for(i=second;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--) ;
}
////////串口传输3个字节////////
void Send_24bits(uchar com_or_data,uchar DATA)
{
uchar bite,command,DIN;
if(com_or_data) command=0xf8; //写指令到LCD
else command=0xfa; //写数据到LCD
LCD_CS=1;
for(bite=8;bite>=1;bite--)
{
LCD_CLK=0;
LCD_DATA=command&0x80;
LCD_CLK=1;
command<<=1;
}
DIN=DATA;
DIN=DIN&0xf0;
for(bite=8;bite>=1;bite--)
{
LCD_CLK=0;
LCD_DATA=DIN&0x80;
LCD_CLK=1;
DIN<<=1;
}
DIN=DATA;
DIN=DIN&0x0f;
DIN<<=4;
for(bite=8;bite>=1;bite--)
{
LCD_CLK=0;
LCD_DATA=DIN&0x80;
LCD_CLK=1;
DIN<<=1;
}
LCD_CS=0;
}
//////////串口读数据/////////////
uchar Read_from_LCD(void)
{
uchar bite,command,DIN0,DIN1;
uchar DATA;
command=0xfe;
LCD_CS=1;
for(bite=8;bite>=1;bite--)
{
LCD_CLK=0;
LCD_DATA=command&0x80;
LCD_CLK=1;
command<<=1;
}
for(bite=8;bite>=1;bite--)
{
LCD_CLK=0;
DIN0|=LCD_DATA;
LCD_CLK=1;
DIN0<<=1;
}
for(bite=8;bite>=1;bite--)
{
LCD_CLK=0;
DIN1|=LCD_DATA;
LCD_CLK=1;
DIN1<<=1;
}
LCD_CS=0;
DIN1>>=4;
DATA=DIN0|DIN1;
return(DATA);
}
////////读状态////////
void ReadStatusLCD(void)
{
uchar LCD_Data;
LCD_Data=Read_from_LCD();
while (LCD_Data&0x80) //检测忙信号
Read_from_LCD();
}
////////写指令////////
void WriteCommandLCD(uchar Command,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
Send_24bits(1,Command);
}
////////写数据////////
void WriteDataLCD(uchar Data,BuysC)
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
Send_24bits(0,Data);
}
void LCDInit(void) //LCD初始化
{
WriteCommandLCD(0x30,1); //基本指令集动作
WriteCommandLCD(0x01,1); //清除显示
delay(1);
WriteCommandLCD(0x0f,1); //开显示
delay(1);
WriteCommandLCD(0x03,1); //地址归位
//WriteCommandLCD(0x30,1); //基本指令集动作
}
//显示一串汉字
void Display(uchar show[])
{
uchar *p,i=0;
p=show;
WriteCommandLCD(0x80,0);
while(*p!='\0')
{
WriteDataLCD(*p++,0);
i++;
if(i==16) WriteCommandLCD(0x90,1);
else if(i==32) WriteCommandLCD(0x88,1);
else if(i==48) WriteCommandLCD(0x98,1);
}
}
void main(void)
{
uchar i;
LCD_PS=0;
delay(8); //启动等待,等LCM讲入工作状态
LCDInit(); //LCM初始化
P2=0xf0;
Display(show);
for(i=0;i<8;i++) //字符循环左移
{
WriteCommandLCD(0x18,1);
delay(200);
delay(200);
delay(200);
delay(200);
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -