4846|7

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一个12864液晶显示的问题,虚拟仿真没问题,但实际硬件不显示。控制器为ks0108(S6B0108) [复制链接]

#include
#include

#define uchar unsigned char
#define uint unsigned int
#define Dis_ON        0x3F                //开显示
#define Dis_off        0x3E                //关显示
#define X_Adr        0xB8                //X初始地址
#define Y_Adr        0x40                //Y初始地址
#define Z_Adr        0xC0                //Z初始地址
#define com        0                //指令
#define data        1                //数据

sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;
sbit CS1=P1^3;
sbit CS2=P1^4;
sbit RST=P1^6;
sbit B_Flag=P0^7;
sbit RES=P0^4;
sbit INT_0=P3^2;

uchar code hz[6][128]={}

void service_int0()interrupt 0 using 2                                 //中断服务,功能:暂停
{
        uchar flag=0;
        while (!flag)             
        {
                break;                  
        }

}

void Delay1(uchar n)                                                                 //延时
{
        uchar i;
        for(i=0;i }
void Delay2(uint n)
{
        uint i;
        for(i=0;i         Delay1(250);
}

/*读忙标志*/
void Busy()                                                                                       
{
//        uchar temp;
        do
        {
                RS=0;_nop_();_nop_();
                RW=1;_nop_();_nop_();
                E=1;_nop_();_nop_();
                E=0;_nop_();_nop_();
        }
        while(B_Flag);
        E=0;_nop_();_nop_();
}

void Wr_LCD(uchar com_data,uchar content)                        //写指令(com_data=com)或数据(com_data=data)
{
        Busy();
        RS=com_data;
        _nop_();_nop_();
        RW=0;_nop_();_nop_();
        P0=content;
        E=1;_nop_();_nop_();
        E=0;_nop_();_nop_();
}

/*
void SET_X_Adr(uchar page)                                                        //设置X地址(页地址)
{
        page=page&0x07; // 0<=line<=7
        page=page|0xb8;
        Wr_LCD(com,page);
}
                                                                                                        //设置Y地址(列地址)
void SET_Y_Adr(uchar line)
{
        line=line&0x3f;
        line=line|0x40;
        Wr_LCD(com,line);
}
                                                                                                        //设置Z地址(起始行)
void SET_Z_Adr(uchar startline)
{
        startline=startline&0x3f;
        startline=startline|0xc0;
        Wr_LCD(com,startline);
}
*/
                                                                                                   //初始化
void init()
{
        P0=0xff;
        P1=0x00;
        _nop_();_nop_();
        RST=0;
        Delay1(50);
        RST=1;
        CS1=0;_nop_();_nop_();
        CS2=0;_nop_();_nop_();
        Wr_LCD(com,Dis_off);
        Wr_LCD(com,Dis_ON);
}

void Disp_dot(uchar data1,uchar data2)                          //显示点
{
        uchar i,j;
        CS1=0;_nop_();_nop_();
        CS2=0;_nop_();_nop_();
        Wr_LCD(com,Dis_ON);
        for(j=0;j<8;j++)
        {
                Wr_LCD(com,X_Adr+j);
                Wr_LCD(com,Z_Adr);
                Wr_LCD(com,Y_Adr);
                for(i=0;i<32;i++)
                {
                        Wr_LCD(data,data1);
                        Wr_LCD(data,data2);
                }
        }
}

void Disp_hz()                                                                          //自定义汉字
{
        uchar i,j;
        for(i=1;i<7;i++)
        {
                CS1=0;_nop_();_nop_();
                CS2=0;_nop_();_nop_();
                Wr_LCD(com,Dis_ON);
                Wr_LCD(com,X_Adr+i);
                Wr_LCD(com,Z_Adr);
                Wr_LCD(com,Y_Adr);

                CS1=1;_nop_();_nop_();
                CS2=0;_nop_();_nop_();
                for(j=0;j<64;j++)
                {
                        Wr_LCD(data,hz[i-1][j]);
                }
                CS1=0;_nop_();_nop_();
                CS2=1;_nop_();_nop_();
                for(j=64;j<128;j++)
                {
                        Wr_LCD(data,hz[i-1][j]);
                }
        }
}

void main()
{
        init();
        IP=0x01;                  
        IE=0x81;
        while(1)
        {
                Disp_dot(0xff,0xff);
                Delay2(500);
                Disp_dot(0xff,0x00);
                Delay2(500);
                Disp_dot(0x00,0xff);
                Delay2(500);
                Disp_dot(0xaa,0x55);
                Delay2(500);
                Disp_dot(0x55,0xaa);
                Delay2(500);
                Disp_dot(0xaa,0xaa);
                Delay2(500);
                Disp_dot(0x55,0x55);
                Delay2(500);
                Disp_dot(0x00,0x00);
                Delay2(10);
                Disp_hz();
                Delay2(500);
        }
}

最新回复

void Busy() 里不用do-while试试  详情 回复 发表于 2009-11-10 10:24
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
小弟编译器为KEIL 虚拟仿真用的是PROTEUS。
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
那就是硬件问题咯 呵呵

我用过这个控制器的,没问题
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
硬件没问题,因为用另一个程序,显示没问题...
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
仿真和实际是有差别的,
如果确定硬件没问题,可能是时序有问题
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
可以在查查你的LCD的实际地址和仿真地址是否一致
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
调试了一下别的程序,好像是判断忙标志有问题...
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
void Busy() 里不用do-while试试
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表