要LCD12864显示汉字,如何编写C程序?用的是51单片机,总线扩展。

我是在校学生,自学单片机,渴望得到前辈指导!
谢谢各位!

第1个回答  2008-09-12
俺有串行方式的.供你参考.
/**********************************************
系统名称:12864串行驱动程序
创建人:w418781840 日期:2008,7,18
功能描述:
***********************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define com 0
#define dat 1
sbit cs =P2^4;
sbit sid=P2^2;
sbit sck=P2^0;
/*********************************************
函数名称:
函数功能:
**********************************************/
void delay1ms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
/*********************************************
函数名称:写字节函数
函数功能:
**********************************************/
void w_12864byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
byte<<=1;
sid=CY;
sck=1;
}
}
/*********************************************
函数名称:读字节函数
函数功能:
**********************************************/
uchar r_12864byte(void)
{
uchar i,temp1,temp2;
temp1 = 0;
temp2 = 0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
sck = 0;
sck = 1;
sck = 0;
if(sid) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
sck = 0;
sck = 1;
sck = 0;
if(sid) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
/*********************************************
函数名称:检测忙函数
函数功能:
**********************************************/
void c_12864busy( void )
{
do
w_12864byte(0xfc); //11111,RW(1),RS(0),0
while(0x80&r_12864byte());
}
/*********************************************
函数名称:写入函数
函数功能:
**********************************************/
void w_12864(bit dat_com,uchar byt)
{
uchar temp;
if(dat_com==0) //为零,写入指令
temp=0xf8; //11111,RS(0),RW(0),0
else //否则,写入数据
temp=0xfa; //11111,RS(1),RW(0),0
cs=1;
c_12864busy();
w_12864byte(temp);
w_12864byte(byt&0xf0); //写入高四位
w_12864byte(byt<<4); //写入低四位
cs=0;
}
/*********************************************
函数名称:初始化函数
函数功能:
**********************************************/
void init_12864(void)
{
w_12864(com,0x30); //基本指令功能.
w_12864(com,0x0c); //显示打开,关光标,反白关.
w_12864(com,0x01); //清屏指令.
w_12864(com,0x06); //AC自动加一
}
/*********************************************
函数名称:绘图函数
函数功能:
**********************************************/
void w_12864bmp(uchar *puts)
{
uint x=0;
uchar i,j;
w_12864(com,0x34); //扩展指令
w_12864(com,0x36); //打开绘图
for(i=0;i<32;i++)
{
w_12864(com,0x80|i);//列32行,双屏结构中上半屏
w_12864(com,0x80); //X地址坐标,自动加1.
for(j=0;j<16;j++) //16*8=256
w_12864(dat,puts[x++]);

}
for(i=0;i<32;i++)
{
w_12864(com,0x80|i);
w_12864(com,0x88); //下半屏
for(j=0;j<16;j++)
w_12864(dat,puts[x++]);
}

}
/*********************************************
函数名称:清屏函数
函数功能:
**********************************************/
void lcd_clear(void)
{
w_12864(com,0x30);
w_12864(com,0x01);
}

/*********************************************
函数名称:
函数功能: 清图形函数
**********************************************/
void BMP_clear( void )
{
uchar i,j;
w_12864(com,0x34); //8Bit扩充指令集,即使是36H也要写两次
w_12864(com,0x36); //绘图ON,基本指令集里面36H不能开绘图
for(i=0;i<32;i++) //12864实际为256x32
{
w_12864(com,0x80|i); //行位置
w_12864(com,0x80); //列位置
for(j=0;j<32;j++) //256/8=32 byte
w_12864(dat,0);
}
}
/*********************************************
函数名称:
函数功能: 清文本函数
**********************************************/
void TXT_Clear( void )
{
uchar i;
w_12864(com,0x30); //8BitMCU,基本指令集合
w_12864(com,0x80); //AC归起始位
for(i=0;i<64;i++)
w_12864(dat,0x20);
}
/*********************************************
函数名称:
函数功能:
**********************************************/
void w_12864Poss(uchar x,uchar y,uchar *buff)
{
uchar addr,i=0;
if(x==1)addr=0x80;
if(x==2)addr=0x90;
if(x==3)addr=0x88;
if(x==4)addr=0x98;
addr=addr+y;
w_12864(com,0x30);
w_12864(com,addr);

while(buff[i]!='\0')
{
w_12864(dat,buff[i]);
i++;
}
}
相似回答