/******************************************************************************
文件名 : .c
模块名称:并行方式驱动12864液晶驱动
完成日期:2013.05.19
驱动芯片:st7920 SP=0x5f; init_lcd();
******************************************************************************/
#include <STC12C5A60S2.h>
#include <intrins.h>
#include <math.h>
#include "stdio.h"
#include "delay.h"
#define DATA P0 //P0接数据口
sbit RS = P1^0; //H=data; L="command";
sbit RW = P1^1; //H=read; L="write";
sbit E = P1^2; //input enable;
sbit busy=P0^7; //lcd busy bit
uchar shit,ge; //两位数,拆开为十位,个位
uchar code tab1[]={"当前状态: "};
uchar code tab2[]={"行驶: 00: 00: 00"};
uchar code tab3[]={"路程: 0000.0 cm"};
uchar code tab4[]={"L:00R:00F:00B:00"};
/********************测忙碌**********************/
//测忙碌子程序
//RS=0,RW=1,E=H,D0-D7=状态字
/************************************************/
static void lcd_busy(void)
{
uchar temp1;//状态信息(判断是否忙)
DATA=0xFF;
RS = 0;
delay1(10);
RW = 1;
delay1(10);
do{
E = 1;
delay1(10);
temp1 = DATA;
E = 0;
delay1(10);
} while(temp1&0x80);//??????
RS = 0;
delay1(10);
RW = 0;
delay1(10);
}
/********************写命令**********************/
//写命令子程序
/************************************************/
extern void write_com(uchar cmd)/*写命令*/
{
lcd_busy();
delay1(10);
RS = 0;
delay1(10);
RW = 0;
delay1(10);
E = 1;
delay1(10);
DATA = cmd;
E = 0;
delay1(10);
}
/********************写数据**********************/
//写数据子程序
/************************************************/
extern void write_data(uchar dat)
{
lcd_busy();
RS = 1;
delay1(10);
RW = 0;
delay1(10);
E = 1;
delay1(10);
DATA = dat;
E = 0;
delay1(10);
}
extern void lcm_w_word(uchar *s) //向LCM发送一个字符串,长度64字符之内
{
while(*s>0)
{
write_data(*s);
s++;
} //应用:lcm_w_word("您好!");
}
/*******************************************************************/
// 设置字符串显示位置 xpos(0~7),ypos(1~4)
/*******************************************************************/
extern void lcd_pos(uchar x,uchar yy) //汉字显示坐标,x为哪一行,y为哪一列
{
uchar pos;
if(x==0)
x=0x80; //第一行
else if(x==1)
x=0x90; //第二行
else if(x==2)
x=0x88; //第三行
else if(x==3)
x=0x98; //第四行
pos=x+yy; //显示哪一行(总共有4行)哪一竖(总共有8竖,每16列为1竖)
write_com(pos);
}
extern void write_sfm(uchar add,uchar date)//写时分秒函数
{
shit=date/10; //分解一个2位数的十位和个位
delay1(10);
ge=date%10;
delay1(10);
write_com(0x88+add); //设置显示位置
delay1(10);
write_data(0x30+shit); //送去液晶显示十位
delay1(20);
write_data(0x30+ge); //送去液晶显示个位
delay1(20);
}
extern void clrram(void) //清屏函数
{
write_com(0x30);
write_com(0x01);
}
/*******************************************/
//LCD字库初始化函数
/*******************************************/
extern void init_lcd12864(void)
{
delay(4000);
write_com(0x30); /*30---基本指令动作*/
delay(1000);
write_com(0x0C); /*开显示,关游标*/
delay(1000);
write_com(0x01); /*清屏,地址指针指向00H*/
delay(1000);
write_com(0x06); /*光标的移动方向*/
}
/*-----------------------------------------*/
/*--------------显示8个汉字-------------------*/
extern void disp_hanzi(uchar code *chn) //显示8个汉字
{
uchar i;
write_com(0x30); //基本指令操作方式
for(i=0;i<16;i++) //16列*8个汉字=128(刚好)
write_data(chn[i]);
}
/*-----------------------------------------*/
/*--------------显示数字-------------------*/
extern void disp_num(uchar code *chn) //显示数字
{
uchar i;
write_com(0x30); //基本指令操作方式
for(i=0;i<2;i++) //1个数字
write_data(chn[i]);
}
评论0