智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3763|回复: 5
打印 上一主题 下一主题

[编程类] 在XS128中用12864出现问题了

[复制链接]

26

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1557

优秀会员奖章

威望
424
贡献
913
兑换币
60
注册时间
2008-10-21
在线时间
110 小时
跳转到指定楼层
1#
发表于 2010-4-23 20:58:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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显示数据的程序最好注明接线位置

最佳答案

查看完整内容

看看是不是时序问题,应该可以解决的!

6

主题

48

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3506

论坛元老奖章

QQ
威望
344
贡献
3106
兑换币
0
注册时间
2009-4-22
在线时间
28 小时
2#
发表于 2010-4-23 20:58:53 | 只看该作者
看看是不是时序问题,应该可以解决的!
回复

使用道具 举报

26

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1557

优秀会员奖章

威望
424
贡献
913
兑换币
60
注册时间
2008-10-21
在线时间
110 小时
3#
 楼主| 发表于 2010-4-23 21:46:08 | 只看该作者
回复 2# sql46


    虽然回答的差强人意,但是这么积极分数也就给你啦!
回复

使用道具 举报

17

主题

71

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2531
QQ
威望
347
贡献
2122
兑换币
0
注册时间
2010-1-16
在线时间
31 小时
4#
发表于 2010-4-23 22:26:21 | 只看该作者
你上面的时序是没问题的,上面的程序是按照51系列单片机写的,写子函数的时候都不用考虑延时问题(因为速度慢),而飞思卡尔的单片机速度比51高很多,又不知道你超频没有。建议你在每个I/O口状态变化时加延时。
回复

使用道具 举报

26

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1557

优秀会员奖章

威望
424
贡献
913
兑换币
60
注册时间
2008-10-21
在线时间
110 小时
5#
 楼主| 发表于 2010-4-24 08:41:31 | 只看该作者
回复 4# luoguoying


    谢谢指导
回复

使用道具 举报

0

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
威望
209
贡献
53
兑换币
0
注册时间
2010-3-27
在线时间
19 小时
6#
发表于 2011-3-25 23:01:45 | 只看该作者
楼主 这个问题解决了没有??小弟有同问,想你请教下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 01:25 , Processed in 0.050085 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表