#define uchar unsigned char #define uint unsigned int #define bingxing P3
sbit shuju_mingling_RS=P2^6; sbit du_xie_RW=P2^5; sbit shineng_EN=P2^7;
uchar code display1[] = \"welcome!\"; uchar code display2[] = \"wangjixue\"; uchar code display3[] = \"I like MCU\"; uchar i,j,k;
unsigned char a, hour,minute,second;
/*************************************************************** 函数声明
/**************************************************************/ void init();
void delay(uint x);
void write_data(uchar n);
void write_command(uchar m); void init_clock(void); void panduan(void); void flash();
/*************************************************************** 主函数
/**************************************************************/
void main() { init(); //初始化 delay(10); write_command(0x80+0x00); // 设置显示位置为第一行的第5个字符,0x80为第一行第一个字符,0x04为第五个字符 i = 0; while(display1[i] != '\\0') // 显示字符\"welcome!\" { write_data(display1[i]); delay(200); i++; } write_command(0xc0+0x00); // 设置显示位置为第二行第四个字符,0xc0=0x80+0x40,0x03为第三个字符
i = 0; while(display2[i] != '\\0') { write_data(display2[i]); // 显示字符\" wangjixue \" delay(200); i++; }
delay(1000);
write_command(0x01); write_command(0xc0+0x00); i = 0; while(display3[i] != '\\0') { delay(200); write_data(display3[i]); // 显示字符\" wangjixue \" i++; }
flash(); while(1); // }
/*id exter1() interrupt 1 //中断服务子程序,1代表定时器/计数器0中断 { TH0=0x3c;//定时器/计数器0的高八位重新赋初值 TL0=0xb0;//定时器/计数器0的低八位重新赋初值
a++; //每进入一次中断函数历时50ms,我们让计时器a加1 }*/
void flash() // 闪动子程序 { delay(1000); //控制停留时间 write_command(0x08); //关闭显示 delay(1000); //延时 write_command(0x0c); //开显示 delay(1000); write_command(0x08); //关闭显示 delay(1000); //延时 write_command(0x0c); //开显示 delay(1000); }
/*************************************************************** 延时函数
/**************************************************************/ void delay(uint x) { uint y,z; for(y=x;y>0;y--) for(z=110;z>0;z--); }
/*************************************************************** 写数据函数
/**************************************************************/ void write_data(uchar n) {
shuju_mingling_RS=1; //将数据/命令选择端设置为高电平 1表示选择数据 0表示选择命令 du_xie_RW=0; //将读/写令选择端设置为低电平 1表示选择读数据 0表示选择写数据 shineng_EN=0; //将使能端设置为低电平 bingxing=n; //将数据送到P0口 delay(5); //以下三行使使能端出现高电平 shineng_EN=1; delay(5); shineng_EN=0; }
/*************************************************************** 写命令函数
/**************************************************************/ void write_command(uchar m) { shuju_mingling_RS=0; //将数据/命令选择端设置为低电平 1表示选择数据 0表示选择命令 du_xie_RW=0; //将读/写令选择端设置为低电平 1表示选择读数据 0表示选择写数据 shineng_EN=0; //将使能端设置为低电平 bingxing=m; //将命令送到P0口 delay(5); shineng_EN=1; //以下三行使使能端出现高电平 delay(5); shineng_EN=0; }
/***************************************************************
初始化函数
/**************************************************************/ void init() { shineng_EN=0; //先让使能端设置为低电平 delay(5); write_command(0x38); //显示模式设置为0x38,表示设置为16*2显示,5*7点阵,8位数据接口 write_command(0x0c); //显示开/关及光标设置0000 1DCB D=1开显示 D=0关显示 //C=1显示光标 C=0不显示光标 //B=1光标闪烁 B=0光标不闪烁 write_command(0x06); //显示开/关及光标设置0000 01NS N=1当读或写一个字符后地址指针加一,且光标加一 // N=0当读或写一个字符后地址指针减一,且光标减一 // S=1当写一个字符整屏显示左移(N=1)或右移(N=0)以得到光标不移动而屏幕移动的效果 // S=0当写一个字符整屏显示不移动 write_command(0x01); //显示清屏 数据指针清零和所有数据清零 }
/*************************************************************** 中断和定时器初始化函数
/**************************************************************/ /*id init_clock(void) { TMOD=0x01;//设置定时器0为工作方式M1M0=01是16位定时器/计数器 TH0=0x3c;//定时器/计数器0的高八位赋初值 TL0=0xb0;//定时器/计数器0的低八位赋初值 //以上两行设置定时时间为50ms,以后只需改动50000的数值即可 EA=1;//打开总中断
ET0=1;//定时器/计数器0的中断打开,允许定时器/计数器0申请中断 TR0=1;//启动定时器/计数器0 }*/
/*************************************************************** 判断函数
/**************************************************************/ /*id panduan(void) {
if(a==20) //计时器a等于20时历时 T=20*50ms=1000ms=1秒 {
a=0; //计时器清零
second++; //计时器 second加1
if(second==60) //计时器second等于60时历时 T=60*(20*50)ms=60000ms=60秒 {
second=0; minute++; } } */
if(minute==60) {
minute=0; hour++; if(hour==24) {
hour=0; } } }
因篇幅问题不能全部显示,请点此查看更多更全内容