📄 lcd.c
字号:
//-----------------------------------------------------------------------------
//程序描述:
// 这个程序可以在该液晶模块上显示字符:" BT F020 V1.0 www.xhl.com.cn"
// 此程序用4位数据线来驱动液晶
// 液晶接线方法 :1脚接地;2脚接+5V;3脚通过1个10K电阻接+5v,通过1个430欧电阻接地;
// 15脚接地;16脚通过1个15R电阻接+5v。液晶别的引脚直接接相应的数据或控制信号线。
//作者:ZDP
//时间:2005-11-30
//版本:V1.0
//-----------------------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------------------
#include <c8051f020.h>
//-----------------------------------------------------------------------------
//全局变量定义
//-----------------------------------------------------------------------------
#define sysclk 22118400
unsigned char kc;
unsigned long x; //"www.xhl.com.cn"
unsigned char code Netdata[]={" www.xhl.com.cn "
" BT F020 V1.0 "
};
//0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
// 0x6d,0x2e,0x63,0x6e,0x20,0x20,0x20,0x20,0x20,0x20,
// 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
// 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//" BT F020 V1.0 "
//unsigned char xdata NCDdata[40]={0x20,0x20,0x42,0x54,0x20,0x46,0x30,0x32,0x30,0x20,
// 0x56,0x31,0x2e,0x30,0x20,0x20,0x20,0x20,0x20,0x20,
// 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
// 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//unsigned char *lcdpoint; //指向 lcddata数组的指针
//-----------------------------------------------------------------------------
// 函数定义
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void LCD_Init(void);
void delayms(unsigned int ms);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{unsigned int i;
static unsigned char data1;
WDTCN = 0xde;
WDTCN = 0xad; //禁止看门狗定时器
PORT_Init (); // 交叉开关和通用I/O口初始化
kc=0;
P2=0x00;
P3=0x00;
EA = 0;
while(1){
SYSCLK_Init (); // 系统时钟初始化
delayms(5000);
if(kc==1)
{ LCD_Init();//LCD初始化
P2 = 0x00;
P3 = 0x80;
P2 = 0x80;
for(x=0;x<1000;x++);
P2 = 0x00;
for(x=0;x<1000;x++);
P2 = 0x20; //准备送数据
for(x=0;x<1000;x++);
for(i=0;i<40;i++)//显示第一行字符
{
data1=*((Netdata+i));
P3 = data1;
//-----------------------------------------------------
P2 = 0xA0; /*原来的LCD程序*/
P2 = 0x20;
//-----------------------------------------------------
// P2 = 0xA0; //修改后的LCD程序
// P2 = 0x20;
//------------------------------------------------------/
// lcdpoint++;
for(x=0;x<1000;x++);
}
P2=0x00;
P3 = 0xc0;
P2 = 0x80;
for(x=0;x<1000;x++);
P2 = 0x00;
for(x=0;x<1000;x++);
P2 = 0x20;
//lcdpoint1=Netdata; //取地址
for(i=0;i<40;i++)//显示第一行字符
{
data1=*((Netdata+i+40)); //读出数据
P3 = data1; //写数据到端口
P2 = 0xA0; //修改后的LCD程序
for(x=0;x<1000;x++);
P2 = 0x20;
//lcdpoint1++;
for(x=0;x<1000;x++);
}
kc=0;
}
}
}
//-----------------------------------------------------------------------------
//函数名称: SYSCLK_Init ()
//函数功能: 系统时钟初始化
//入口参数: 无
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//-----------------------------------------------------------------------------
//
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88;
//OSCICN = 0x05; // 系统时钟初始化为片内的 24.5MHz / 8
}
//-----------------------------------------------------------------------------
//函数名称: PORT_Init ()
//函数功能: 通用I/O口及交叉开关初始化
//入口参数: 无
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x00; // 没有选择数字外设
XBR2 = 0x40;
P2MDOUT = 0xe0; // P2口设为推挽方式
}
//-----------------------------------------------------------------------------
//函数名称: LCD_Init ()
//函数功能: LCD初始化
//入口参数: 无
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//-----------------------------------------------------------------------------
void LCD_Init(void)
{
for(x=0;x<50000;x++);
//P7 = 0x30; /*一行显示*/
P2=0x00;
P3 = 0x38; /*两行显示*/
P2 = 0X80;
for(x=0;x<1000;x++);
P2 = 0X00;//0x08;
for(x=0;x<1000;x++);
P2=0x00;
P3 = 0x04; //显示开,光标开;不闪
P2 = 0X80;//0x09;
for(x=0;x<1000;x++);
P2 = 0x00;
for(x=0;x<1000;x++);
P2 = 0x00;
P3= 0x0c; //增量方式,现不移动
P2 = 0x80;
for(x=0;x<1000;x++);
P2 = 0x00;
for(x=0;x<1000;x++);
P2 = 0x00;
P3 = 0x01;// 清屏
P2 = 0x80;
for(x=0;x<5000;x++);
P2 = 0x00;
for(x=0;x<1000;x++);
P2 = 0x80;
OSCICN = 0x05;
for(x=0;x<5000;x++);
}
void delayms(unsigned int ms)
{int i; // 毫秒计数器
for (i = 0; i < ms; i++) { // 数毫秒
TR0 = 0; // 停定时器T0
TH0 = (-sysclk/1000) >> 8; // 设置定时器T0 1ms溢出
TL0 = -sysclk/1000;
TR0 = 1; // 启动定时器T0
while (TF0 == 0); // 等待溢出
TF0 = 0; // 清除溢出标志
kc=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -