这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 8515,t6963c 求助-8515+t6963c

共2条 1/1 1 跳转至

8515,t6963c 求助-8515+t6963c

院士
2006-09-17 18:14:16     打赏
8515,t6963c 求助-8515+t6963c



关键词: t6963c     求助     -8515+t6963c    

院士
2006-12-22 22:43:00     打赏
2楼
问  我现在在用t6963c芯片的24064lcd,用的是at90s8515,4mHz晶振。查了一些资料,但始终无法将其点亮。我下载了晓奇网站上的例子,但液晶仍无显示,出于无奈,只能向各位大虾求助。 谢谢。
    我的程序如下:

    /****    TEST PROGRAM FOR 240646    *****/
;************************************************************************
;连线图:  液晶屏分为8行*15列汉字,使用模拟接口方式。            *
;*DB0-----PA0*      *DB4-----PA4*       *Rd ------PC2*      *Cd ------PC0*    *
;*DB1-----PA1*      *DB5-----PA5*       *Wr ------PC1*      *CE ------GND*    *
;*DB2-----PA2*      *DB6-----PA6*       *RST------PC3*      *FS ------GND*    *
;*DB3-----PA3*      *DB7-----PA7*                        *
;注:S8515的晶振频率为4MHz                                            *
;************************************************************************/

#include <io8515.h>
#include <macros.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
/*   定义24064端口   */

//cd=PORTC.0,通道选择,=1为指令通道,=0为数据通道
#define set_cd asm("sbi 0x15,0")
#define clr_cd asm("cbi 0x15,0")
//ce=PORTc.6低电平有效,T6963C片选信号
#define set_ce asm("sbi 0x15,6")
#define clr_ce asm("cbi 0x15,6")
//rd=PORTc.2,读操作,低电平有效
#define set_rd asm("sbi 0x15,2")
#define clr_rd asm("cbi 0x15,2")
//wr=PORTc.1,写操作,低电平有效
#define set_wr asm("sbi 0x15,1")
#define clr_wr asm("cbi 0x15,1")
//rst=PORTc.3,写操作,低电平有效
#define set_rst asm("sbi 0x15,3")
#define clr_rst asm("cbi 0x15,3")



const uchar hz_001[]=
{
/*------------------------------------------------------------------------------
;  源文件 / 文字 : 肱
;  宽×高(像素): 16×16
------------------------------------------------------------------------------*/
0x00,0x40,0x3C,0x40,0x24,0x40,0x27,0xFE,
0x3C,0x40,0x24,0x40,0x24,0x90,0x24,0x90,
0x3C,0x90,0x25,0x20,0x25,0x28,0x26,0x44,
0x44,0xBE,0x55,0xE6,0x88,0x84,0x00,0x00
};

/* 初始化           */  
void initcomm(void)
{
    DDRA=0xff;    DDRC=0xff;      
    PORTA=0xff; PORTC=0xff;
}

/*  初始化 lcd240128      */
void initlcd(void)
{            
    dmod(0x00,0x00,0x42);  /*图形显示区域首地址*/
    dmod(0x1e,0x00,0x43);  /*图形显示宽度,一行显示所占字节*/
    dmod(0x03,0x00,0x22);  /*cgram首地址 00011 100000000 000 = 1c00h*/
    nmod(0x88);            /*显示方式:逻辑"或"合成*/
    nmod(0x98);            /*显示开关设置,开文本和图形显示*/
}
/* lcd 清0*/
void clear(void)
{uint  i;
    dmod(0x00,0x00,0x24);        /*显示存储器首地址*/
    nmod(0xb0);                  /*自动写方式*/
    for (i = 0;i < 0x2000;i++)
    {
        r_st(3);                  /*等待自动写状态*/
        wdata(0,0);
    }
    nmod(0xb2);             /*自动写结束*/
}
/****************************************************
读状态字
cd_flag = 1 读命令通到。 = 0 读数据通到。
w = 0 指令读,写状态,   返回1 准备好 返回0 忙。  
w = 1 数据读,写状态,   返回1 准备好 返回0 忙。
w = 2 数据自动读状态,   返回1 准备好 返回0 忙。
w = 3 数据自动写状态,   返回1 准备好 返回0 忙。
w = 5 控制运行检测可能性,返回1 准备好 返回0 忙。  
w = 6 屏读/栲贝出错状态, 返回1 正确 返回0 出错。
w = 7 闪烁状态检测,     返回1 正常显示 返回0 关显示。
******************************************************/
void r_st (uchar w)       
{
    uchar  i = 0;            
    uchar  c;
    DDRA=0x00;PORTA=0xff;     
    while (--i)
    {   set_cd;
    clr_rd ; set_wr;     
    c =PINA;        
        set_rd;       
        NOP();
        if ((w == 1) && ((c & 3) == 3)) return;
        if ((w == 3) && ((c & 8) == 8))    return;
    }
}
void wdata(uchar cd_flag,uchar d)     /*数据写操作*/
{   DDRA=0xff;
    if (cd_flag == 0) clr_cd;
    else set_cd;
    PORTA = d;    
    clr_wr; set_rd;
    set_wr;
    NOP();
}
/*双参数指令*/
void dmod(uchar x0,uchar x1,uchar c)
{
    r_st(1);    wdata(0,x0);
    r_st(1);    wdata(0,x1);
    r_st(1);    wdata(1,c);
}
/*单参数指令*/
void smod(uchar x1,uchar c)
{
    r_st(1);    wdata(0,x1);
    r_st(1);    wdata(1,c);
}
/*无参数指令*/
void nmod(uchar c)
{
    r_st(1);    wdata(1,c);
}


/*************************************************************
汉字写入函数(图形方式)16*16
    o_y  Y 坐标 0-29
    o_x  X 坐标 0-63
    *p 写入字符代码
*************************************************************/
void wri_hz(uchar add_x ,uchar add_y,const uchar *p)
{
    uint c,i,j;
    c = add_y*(0x1e)+add_x;
    for (i=0;i<16;i++)
      {  dmod(c,c>> 8,0x24);
         nmod(0xb0);                  /*自动写方式*/
         for (j = 0;j < 4;j++)
           {  r_st(3);                /*等待自动写状态*/
              wdata(0,*p++);
           }
         nmod(0xb2);             /*自动写结束*/
         c += 0x1e;
       }    
}


/****   主函数   ****/
void main(void)
{
    initcomm();             /*初始化*/
    clr_rst;               
    NOP();NOP();
    set_rst ;                 /*复位*/
    initlcd();               /*初始化 lcd240128 */
    clear();                 /* lcd 清0*/
    while(1)
    {wri_hz(2,0,hz_001);    
    }
} 1: 可能是时序不对,反正我是点亮了不过我用的是汇编,是采用访问外设的方法做的

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]