#include "C8051F020.h"
#include"string.h"
#include"stdio.h"
#include <intrins.h>
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)//移到首行
uchar code lcdbuf1[]={"my lady gaga"} ;
uchar code lcdbuf2[]={"my friend!"} ;
#define cls write_code(0x01)//清屏
#define lcd_data P7 //数据接口
//sbit lcdrs=P1^2; //硬件控制接口
//sbit lcdrw=P1^1;
//sbit lcdcs=P1^0;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
/************************系统配置************************/
void config (void)
{ int n = 0;
//看门狗禁止
EA=0; //关闭中断 ,中断的关闭是为了保证两条操作码能在4个周期内完成
WDTCN = 0xDE;
WDTCN = 0xAD;
EA=1; //恢复中断
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出
P0MDOUT = 0x00;
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P1MDIN=0x00;
P74OUT = 0x00;
OSCXCN = 0x67;//外部晶振24MHZ
for (n = 0; n < 255; n++) ; //等待1ms以上,确保时钟稳定
while ( !(OSCXCN & 0x80) ); //等待外部时钟稳定
OSCICN = 0x88; //选择外部晶振作为系统时钟源,允许时钟丢失检测
}
/*****************延迟1ms*time,这不是一个精确值************/
void delay1ms(uint time)
{
uint i;
uint j;
for (i=0;i<time;i++)
{
for(j=0;j<500;j++);
}
}
/****************************1602A读忙状态函数**************************/
uchar lcd_readstatus(void)
{ lcd_data=0x80; //检测忙信号比较重要
//lcdrs=0;
//lcdrw=1;
//lcdcs=0; //若晶振速度太高可以在这后加小的延时
//lcdcs=0; //延时
//lcdcs=1;
P5=0x02;
P5=0X02;
P5=0X06;
delay1ms(200);
//while(lcd_data & 0x80);//检测忙信号
return(lcd_data);
}
/**********************给lcd送命令*************/
void write_code(uchar c)
{
EA=0;
lcd_readstatus(); //查忙
lcd_data=c;
//lcdrs=0; //选择指令寄存器
//lcdrw=0; //写操作
//lcdcs=1;
P5=0X04;
delay1ms(15);
//lcdcs=0;
P5=0X00;
EA=1;
}
/********************给lcd送数据 *****************/
void write_data(uchar c)
{
EA=0;
lcd_readstatus(); //查忙
lcd_data=c;
//lcdrs=1; //选择数据寄存器
//lcdrw=0; //写操作
//lcdcs=1;
P5=0X05;
delay1ms(15);
//lcdcs=0;
P5=0X01;
EA=1;
}
/*********************lcd显示初始化*************/
void lcd_init(void)
{
lcd_data=0;
//delay1ms(2000);
write_code(0x38);//三次显示模式设置,不检测忙信号
//delay1ms(2000);
write_code(0x38);
//delay1ms(2000);
write_code(0x38);
//delay1ms(2000);
write_code(0x38);//8位,2行,5*7字体
//delay1ms(2000);
write_code(0x08);//显示关闭
//delay1ms(2000);
write_code(0x01);//显示清屏
//delay1ms(2000);
write_code(0x06);//增量方式,现不移动
//delay1ms(2000);
write_code(0x0c);//显示开,光标关;不闪
//delay1ms(1);
//delay1ms(2000);
}
/********************设置光标位置,X是列号,Y是行号*********************/
void display_xy(uchar x,uchar y)
{
//y &= 0x1;
// x &= 0xF;//限制X不能大于15,Y不能大于1
if(y==1)
x+=0x40;
x+=0x80;
write_code(x);//wogaide difang
//write_data(x);
}
/*****************在具体位置显示单个字符,x是列号,y是行号******************/
void display_char(uchar x,uchar y,uchar dat)
{
display_xy(x,y);
write_data(dat);
}
/*******************在具体位置显示字符串,x是列号,y是行号****************/
void display_string(uchar x,uchar y,uchar *s)
{
display_xy(x,y);
while(*s)
{
write_data(*s);
s++;
}
}
/***************主程序*************************/
void main()
{ xdata uchar i;
uchar *s;
//s=&lcdbuf1[0];
config();
lcd_init();
while(1){
display_string(2,0,lcdbuf1);
/* while(1)
{
if(key1==0)
{
display_string(2,0,lcdbuf1);
}
if(key2==0)
{
display_string(1,1,lcdbuf2);
}
if(key3==0)
{
cls;
}
if(key4==0)
{
for(i=0;i<11;i++)
{
display_char(i+2,0,*(s+i));
}
}
}*/
/*******************在第一个行显示16个字母************
//cls;//清屏
//write_code(0x40); //设置显示地址
//display_string(2,1,lcdbuf2);
for(i=0;i<16;i++)
{
write_code(0x40); //设置显示地址
write_data('a'+i);//第一行显示
}
/*********************自动移位显示*********************
write_code(0x07);//设置为移动显示模式,AC自增
for(i=0;i<26;i++)
{
display_char(i,0,'A'+i);//当CG RAM地址自增超过第一行地址时,自动跳到第二行地址
delay1ms(50);
delay1ms(200);
}
delay1ms(200);
for(i=0;i<26;i++)
{
display_char(i,1,'a'+i);
delay1ms(50);
delay1ms(200);
} */
}
}