金牌会员
无
- 积分
- 1557
- 威望
- 424
- 贡献
- 913
- 兑换币
- 60
- 注册时间
- 2008-10-21
- 在线时间
- 110 小时
|
15贡献
本帖最后由 k410533234 于 2010-4-23 21:00 编辑
使用12864的串行方式^
CS接pS0
SID接pS2
CLK接pS4口
程序如下……
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "mc9S12xs128.h"
//12864LCD指令定义
#define CMD_CLEAR 0x01
#define CMD_RESET 0x02
//设置波特率
#define OSC_FREQ 11059200L
#define BAUD_115200 256 - (OSC_FREQ/192L)/115200L // 255
#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254
#define BAUD_38400 256 - (OSC_FREQ/192L)/38400L // 253
#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 252
#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 250
#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 248
#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 244
void a();
void write_command(unsigned char cmd);
unsigned char read_data(void);
void write_data(unsigned char dat);
void clear_lcd();
void lcd_init();
void lcd_setxy(unsigned char x,unsigned char y);
void lcd_display_str(unsigned char x, unsigned char y,unsigned char *str);
int k;
void a()
{
DDRS=0XFF;
}
void write_command(unsigned char cmd)
{
unsigned char i;
PTS_PTS0=1;
for(i=0;i<5;i++)
{
PTS_PTS4=0;
PTS_PTS2=1;
PTS_PTS4=1;
}
for(i=0;i<5;i++)
{
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
}
for(i=0;i<4;i++)
{
PTS_PTS4=0;
if(cmd&0x80)
PTS_PTS2=1;
else
PTS_PTS2=0;
PTS_PTS4=1;
cmd<<=1;
}
for(i=0;i<4;i++)
{
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
}
//下面发送指令的低4位
for(i=0;i<4;i++)
{
PTS_PTS4=0;
if(cmd&0x80)
PTS_PTS2=1;
else
PTS_PTS2=0;
PTS_PTS4=1;
cmd<<=1;
}
//发送连续4个'0'
for(i=0;i<4;i++)
{
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
}
PTS_PTS0=0;//结束
}
void write_data(unsigned char dat)
{
unsigned char i;
//先产生连续5个'1'
PTS_PTS0=1;
for(i=0;i<5;i++)
{
PTS_PTS4=0;
PTS_PTS2=1;
PTS_PTS4=1;
}
//再发送一个'0',表示写操作
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
//再发送一个'1',表示写数据操作
PTS_PTS4=0;
PTS_PTS2=1;
PTS_PTS4=1;
//再发送一个'0',这是表示第一个字节结束
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
//下面发送具体数据,先发送高4位
for(i=0;i<4;i++)
{
PTS_PTS4=0;
if(dat&0x80)
PTS_PTS2=1;
else
PTS_PTS2=0;
PTS_PTS4=1;
dat<<=1;
}
//发送连续4个'0'
for(i=0;i<4;i++)
{
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
}
//下面发送数据的低4位
for(i=0;i<4;i++)
{
PTS_PTS4=0;
if(dat&0x80)
PTS_PTS2=1;
else
PTS_PTS2=0;
PTS_PTS4=1;
dat<<=1;
}
//发送连续4个'0'
for(i=0;i<4;i++)
{
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
}
PTS_PTS0=0;//结束
}
void clear_lcd()
{
write_command(CMD_CLEAR);
}
void lcd_setxy(unsigned char x,unsigned char y)
{
unsigned char addr;
switch(y)
{
case 0:
addr=0x80+x;
break;
case 1:
addr=0x90+x;
break;
case 2:
addr=0x88+x;
break;
case 3:
addr=0x98+x;
break;
}
write_command(addr);
}
void lcd_display_str(unsigned char x, unsigned char y,unsigned char *str)
{
unsigned char i;
lcd_setxy(x,y);
for(i=0;str!='\0';i++)
{
write_data(str);
}
}
void lcd_init()
{
write_command(CMD_RESET);
write_command(0x0d);//设置显示状态,整体显示ON,游标与游标位置ON
write_command(0x30);//功能设置,基本指令
write_command(0x18);//游标与显示移位控制
clear_lcd();
//write_command(0x80);//设置DDRAM位址,并不必须
}
void main()
{ a();
lcd_init();
//显示武林外传
lcd_setxy(1,2);
write_data(0xce);
write_data(0xe4);
lcd_setxy(2,2);
write_data(0xc1);
write_data(0xd6);
lcd_setxy(3,2);
write_data(0xcd);
write_data(0xe2);
lcd_setxy(4,2);
write_data(0xb4);
write_data(0xab);
k=5000;
while(k--);
clear_lcd();
write_command(CMD_RESET);
k=5000;
while(k--);
lcd_display_str(2,0,"bluehacker");
lcd_display_str(1,1,"QQ:282074921");
lcd_display_str(3,2,"李正平");
while(1)
{
}
}
现在的情况是屏幕只亮,无任何显示
单步运行时比如到这里
for(i=0;i<4;i++)
{
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
}
那么它就只执行
PTS_PTS4=0;
PTS_PTS2=0;
PTS_PTS4=1;
三句中的第一句,后面两句根本不执行,但是这不符合C语言规则啊
迷茫中,盼大神给个解……另或者给个XS128上用12864或1602显示数据的程序最好注明接线位置 |
|