📄 lcd.c
字号:
////////////////////////////////////////////////////
#include <c8051f020.h> // SFR声明
#include <stdio.h>
#define SYSCLK 22118400 //定义系统时钟22.1184MHz
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
//接口定义////////////////////////////////////
sbit LCDRS = P0^0; // H---DATA, L---INSTRUCT
sbit LCDRW = P0^1; // H---READ, L---WRITE
sbit LCDE = P0^2; // 下降沿---写数据, 高---读数据, 低或上升沿无动作
sbit LCDPSB = P0^3; // 1--并行,0--串行
#define LCDDB = P7; // DATA
//LCD寄存器定义//////////////////////////////
data LCD_DAT;
data LCD_COM;
//外部晶振初始化/////////////////////////////
void SYSCLK_Init ()
{
int i; // 延时计数器
OSCXCN = 0x67; // 开启外部振荡器22.1184MHz晶体
for (i=0; i < 256; i++) ; // 等待振荡器启振
while (!(OSCXCN & 0x80)); // 等待晶体振荡器稳定
OSCICN = 0x88; // 选择外部振荡器为系统时钟源并允许丢失时钟检测器
}
// 交叉开关配置,管脚输入输出配置
void XBR_Init()
{
XBR0 = 0x00; //不配置特殊功能
XBR1 = 0x00;
XBR2 = 0x40; //使能交叉开关,并且总体弱上拉
}
//发送控制命令到LCD
void LCDWRT_COM(unsigned char COM)
{
unsigned char temp;
unsigned int i;
LCDPSB=1;
//读取并判断busy
re: for(i=0;i<100;i++);
LCDRS=0;
LCDRW=1;
LCDE=1;
for (i=0;i<25;i++);
temp=P7;
LCDE=0;
while(temp>=0x80) goto re;//忙则延时再判断
LCDRW=0;
P7=COM;
LCDE=1;
for (i=0;i<25;i++);
LCDE=0;
}
//发送数据到LCD
void LCDWRT_DAT(unsigned char DAT)
{
unsigned int i;
unsigned char temp;
LCDPSB=1;
//读取并判断busy
re: for(i=0;i<100;i++);
LCDRS=0;
LCDRW=1;
LCDE=1;
for (i=0;i<25;i++);
temp=P7;
LCDE=0;
while(temp>=0x80) goto re ;//忙则延时再判断
LCDRS=1;
LCDRW=0;
P7=DAT;
LCDE=1;
for (i=0;i<25;i++);
LCDE=0;
}
void main()
{
unsigned int i;
xdata unsigned int LN1[16]={0xa1,0xa0, 0xb5,0xe7, 0xd7,0xd3, 0xbf,0xc6, 0xbc,0xbc, 0xb4,0xf3, 0xd1,0xa7, 0xa1,0xa0};
xdata unsigned int LN2[16]={0x65,0x43, 0x01,0x27, 0x45,0x36, 0x64,0x24, 0x78,0x54, 0x34,0x57, 0x00,0x31, 0x91,0x00};
xdata unsigned int LN3[16]={0xb5,0xb1, 0xc7,0xb0, 0xce,0xc2, 0xb6,0xc8, 0xcf,0xd4, 0xa1,0x4f, 0xb7,0xb6, 0xc0,0xfd};
xdata unsigned int LN4[16]={0x41,0x61, 0x65,0xa0, 0xa1,0xa0, 0xa1,0xa0, 0xb1,0xa0, 0xca,0xae, 0xce,0xe5, 0xd7,0xe9};
SYSCLK_Init ();
XBR_Init();
WDTCN=0xde;
WDTCN=0xad;
//------液晶初始化--------
LCDPSB=1; //并行方式
LCDWRT_COM(0x30); //8bit控制界面,基本指令集
//LCDWRT_COM(0x07); //反白
LCDWRT_COM(0x0f); //显示打开,光标关,闪烁关
LCDWRT_COM(0x06); //光标右移,AC以1增加
LCDWRT_COM(0x01); //清屏 ,DDRAM地址计数器归零
//第一行显示
for (i=0;i<16;i+=2)
{
LCDWRT_COM(0x80+(i/2));
LCDWRT_DAT(LN1[i]);
LCDWRT_DAT(LN1[i+1]);
}
//第二行显示
for (i=0;i<16;i+=2)
{
LCDWRT_COM(0x90+(i/2));
LCDWRT_DAT(LN2[i]);
LCDWRT_DAT(LN2[i+1]);
}
//第三行显示
for (i=0;i<16;i+=2)
{
LCDWRT_COM(0x88+(i/2));
LCDWRT_DAT(LN3[i]);
LCDWRT_DAT(LN3[i+1]);
}
//第四行显示
for (i=0;i<16;i+=2)
{
LCDWRT_COM(0x98+(i/2));
LCDWRT_DAT(LN4[i]);
LCDWRT_DAT(LN4[i+1]);
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -