[quote=河马漫步]弄了个程序没点亮

那位大哥有串行的c驱动借使使。

[/quote]
//***************************************************************************
//连线表: cpu=89c52 systemclock=12mhz *
// reset=rc in board *
//***************************************************************************
#include "at89x51.h"
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
sbit cs =p0^0;
sbit sid=p0^1;
sbit sck=p0^2;
unsigned char code ac_table[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置
};
//串口发送一个字节
void sendbyte(unsigned char dbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
sck = 0;
dbyte=dbyte<<1; //左移一位
sid = cy; //移出的位给sid
sck = 1;
sck = 0;
}
}
//串口接收一个字节
//仅在读取数据的时候用到
//而读出的数据是一次只能读出4bit的
unsigned char receivebyte(void)
{
unsigned char i,temp1,temp2;
temp1=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 checkbusy( void )
{
do sendbyte(0xfc); //11111,rw(1),rs(0),0
while(0x80&receivebyte()); //bf(.7)=1 busy
}
void writecommand( unsigned char cbyte )
{
cs = 1;
checkbusy();
sendbyte(0xf8); //11111,rw(0),rs(0),0
sendbyte(0xf0&cbyte); //高四位
sendbyte(0xf0&cbyte<<4);//低四位(先执行<<)
cs = 0;
}
void writedata( unsigned char dbyte )
{
cs = 1;
checkbusy();
sendbyte(0xfa); //11111,rw(0),rs(1),0
sendbyte(0xf0&dbyte); //高四位
sendbyte(0xf0&dbyte<<4);//低四位(先执行<<)
cs = 0;
}
void write_char(unsigned char ddata)
{
writedata(ddata);
}
/*
unsigned char readdata( void )
{
checkbusy();
sendbyte(0xfe); //11111,rw(1),rs(1),0
return receivebyte();
}
*/
/*
void delayms(unsigned int ms)
{
unsigned char us,usn;
while(ms!=0) //for 12m
{ usn = 2;
while(usn!=0)
{
us=0xf5;
while (us!=0){us--;};
usn--;
}
ms--;
}
}
*/
void lcminit( void )
{
writecommand(0x30); //8bitmcu,基本指令集合
writecommand(0x03); //ac归0,不改变ddram内容
writecommand(0x0c); //显示on,游标off,游标位反白off
writecommand(0x01); //清屏,ac归0
writecommand(0x06); //写入时,游标右移动
}
//文本区清ram函数
void lcmcleartxt( void )
{
unsigned char i;
writecommand(0x30); //8bitmcu,基本指令集合
writecommand(0x80); //ac归起始位
for(i=0;i<64;i++)
writedata(0x20);
}
//图形区和文本区显示在两个不同的ram区
//图形区清ram函数
void lcmclearbmp( void )
{
unsigned char i,j;
writecommand(0x34); //8bit扩充指令集,即使是36h也要写两次
writecommand(0x36); //绘图on,基本指令集里面36h不能开绘图
for(i=0;i<32;i++) //12864实际为256x32
{
writecommand(0x80|i); //行位置
writecommand(0x80); //列位置
for(j=0;j<32;j++) //256/8=32 byte
writedata(0);
}
}
void lcd_set_xy( unsigned char x, unsigned char y )
{
writecommand(0x30); //8bitmcu,基本指令集合
writecommand(ac_table[8*x+y]); //起始位置
}
void lcd_write_char_string(unsigned char row,unsigned char col,unsigned char *puts)
{
writecommand(0x30); //8bitmcu,基本指令集合
writecommand(ac_table[8*row+col]); //起始位置
while(*puts) //判断字符串是否显示完毕
{
writedata(*puts); //一个汉字要写两次
puts++;
}
}