打印

OK 已经解决了,非常感谢 huangqi412

[复制链接]
2273|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sTw_gongwen|  楼主 | 2011-6-12 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sTw_gongwen 于 2011-6-12 20:15 编辑

使用硬件:慧净的HJ-1C型的学习实验板;带字库的LCD12864液晶屏;STC89C52单片机;

查资料知道绘图显示步骤为:
1.关闭绘图显示功能;
2.写入水平位元组坐标(X);
3.写入垂直坐标(Y);
4.将D15-D8数据写入;
5.将D7-D0数据写入;
6.打开绘图显示功能;

代码如下:


#include <reg51.h>
#include <intrins.h>
        
#define uchar unsigned char
#define uint  unsigned int

/*TS12864A-3 端口定义*/
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P3^5;            //寄存器选择输入
sbit LCD_RW  =  P3^6;            //液晶读/写控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P3^7;            //串/并方式控制

//***************************************************************************************

void delay(uint z)                //延时z毫秒子函数
{
        uint x;
        uchar y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

//******************************************************************

uchar code picture1[];                                //图片代码  

bit lcd_busy();                                         //LCD测忙  
void lcd_wcmd(uchar cmd);                   //向LCD12864写指令子函数  
void lcd_wdata(uchar Xdata);                 //向LCD12864写数据子函数  
void lcd12864_init();                //LCD12864初始化子函数  
void lcd_weizhi(uchar X,uchar Y);        //确定显示位置  
void print(uchar X,uchar Y,uchar *str);                //打印字符串子函数 举例:print(0x80,"gongwen");  
void print2(uchar X,uchar Y,uchar t);                //打印一个字符子函数        举例:print2(0x80,'0');
void displaypicture(uchar code *pic);                                                //显示图片子函数
void pic_init();

//******************************************************************

void main()
{
        lcd12864_init();                        //显示汉字字母数字
        print2(2,6,'6');
        print(3,0,"ab12您好!");
        delay(10000);

        pic_init();                                    //显示图片
        lcd_wcmd(0x01);                                //清屏指令  
        delay(5);        
        displaypicture(picture1);
        delay(100);
        while(1);
}

//******************************************************************

bit lcd_busy()                                         //LCD测忙  
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delay(1);
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}

//******************************************************************

void lcd_wcmd(uchar cmd)                   //向LCD12864写指令子函数  
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = cmd;
        delay(5);
    LCD_EN = 1;
    delay(5);
    LCD_EN = 0;  
}

//******************************************************************

void lcd_wdata(uchar Xdata)                 //向LCD12864写数据子函数  
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = Xdata;
    delay(5);
    LCD_EN = 1;
    delay(5);
    LCD_EN = 0;
}

//******************************************************************

void lcd12864_init()                //LCD12864初始化子函数  
{
        delay(50);
    LCD_PSB = 1;         //并口方式
   
    lcd_wcmd(0x34);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}

//******************************************************************

void lcd_weizhi(uchar X,uchar Y)        //确定显示位置  
{                          
   uchar  weizhi;
   if (X==1)
     {X=0x80;}
   else if (X==2)
     {X=0x90;}
   else if (X==3)
     {X=0x88;}
   else if (X==4)
     {X=0x98;}
   weizhi = X+Y ;  
   lcd_wcmd(weizhi);     //显示地址
}

//******************************************************************

void print(uchar X,uchar Y,uchar *str)                //打印字符串子函数 举例:print(0x80,"gongwen");  
{
        lcd_weizhi(X,Y);
        while(*str != '\0')
        {
                lcd_wdata(*str++);               
        }
        *str = 0;
}

//******************************************************************

void print2(uchar X,uchar Y,uchar t)                //打印一个字符子函数        举例:print2(0x80,'0');
{
                lcd_weizhi(X,Y);
                lcd_wdata(t);                                //写数据
}

//******************************************************************

void displaypicture(uchar code *pic)                                                //显示图片子函数  
{
        char i,j;
        lcd_wcmd(0x34);                                        //关闭绘图显示  
        for(i=0;i<32;i++)                                 //显示上半屏的内容  
        {
           lcd_wcmd(0x80+i);
           lcd_wcmd(0x80);
           for(j=0;j<16;j++)
           {
                           lcd_wdata(*pic);
                        pic++;        
           }
        }

        for(i=0;i<32;i++)                                 //显示上半屏的内容  
        {
           lcd_wcmd(0x80+i);
           lcd_wcmd(0x88);
           for(j=16;j<32;j++)
           {
                           lcd_wdata(*pic);
                        pic++;        
           }
        }
        lcd_wcmd(0x36);                                        //打开绘图显示  
}

//******************************************************************

uchar code picture1[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x0F,0x07,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1C,0x3C,0x3F,0x1F,0x1F,0x0F,0x03,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x0F,0x07,0x03,0x01,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x1E,0x1E,0x1F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xC0,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
0xC0,0xC3,0xCF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,
0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0xBC,0xFF,0xFF,0xFF,0xFF,0x3F,0x3D,0x3C,0x3C,0x7C,
0xFC,0xF8,0xF0,0xF0,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0xFC,0xFE,0xFE,0xDF,0x0F,
0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xE0,0xC0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,
0x3F,0xFF,0xFC,0xF8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x8F,0xFF,0xFF,0xFF,0xFF,0x07,0x07,0x03,
0x03,0x03,0x03,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x07,0x07,0x07,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x83,0xE1,
0xF0,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x38,0x7C,0x7C,0xBC,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x78,0xF8,0xF8,0x78,0x78,0x78,0x78,
0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x7C,0x7E,0xFE,0xFC,
0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1B,0x3F,0x3F,0x3F,0x3D,0x3C,0xBC,0xBC,0xBC,0xBC,0xFC,0xFC,0xFC,
0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFD,0xFD,0xBC,0x3C,
0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
0x3C,0x3C,0x3E,0x3E,0x1E,0x1F,0x1F,0x1F,0x1F,0x0F,0x00,0x00,0xE0,0xF8,0xF8,0xFC,
0x7E,0x3E,0x1F,0x1F,0x0F,0x07,0x31,0x78,0x78,0x78,0x78,0x79,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x78,0x78,0x78,0x78,0x78,0x78,0x78,
0x78,0x78,0x78,0x7F,0x7F,0x7F,0x7F,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,
0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xF0,0xF8,0xFE,0xFE,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0xFF,0xFF,0x00,
0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x07,
0x07,0x07,0x3F,0x7F,0xFF,0xFE,0xF0,0xF0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0xC0,0xF8,0xFC,0xFC,0xF8,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xE0,0x98,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x1F,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xC3,0xFF,0xFF,0xFF,0xFF,0x03,
0x03,0x03,0x07,0x0F,0x1F,0x1F,0x3F,0x3F,0x7F,0xFF,0xFF,0xF7,0xF7,0x8F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x8F,0xCF,0xEF,0xFF,0xFF,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF,0xEF,0xDF,
0xDF,0x8F,0x8F,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x3F,0x7F,0x7F,0x3F,0x00,0x00,0xC0,0xE0,0xE0,0xC0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x1F,
0xFF,0xFF,0xFF,0xF8,0xC0,0x03,0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,
0x1F,0x3F,0xFF,0xFC,0xF8,0xF0,0xC0,0x60,0xF0,0xF0,0xF0,0xF0,0xF8,0x78,0x78,0x78,};

//**************************************************************************************

void pic_init()                        //绘图模式初始化  
{
        
    delay(100);        
        LCD_PSB = 1;         //并口方式
    lcd_wcmd(0x36);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x36);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x3E);      
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}

//******************************************************************************************

/*程序编译烧写后,文字部分能正常显示,但图片显示时只有一片乱点;
新人真心求教,望各位前辈能抽空给点解答,好人一生平安*/

相关帖子

沙发
sTw_gongwen|  楼主 | 2011-6-12 17:25 | 只看该作者
天啊!我在线等了两小时了,刷新了不知道多少次了呢?咋没人理我呢?

使用特权

评论回复
板凳
NE5532| | 2011-6-12 18:47 | 只看该作者
你丢那么一大堆程序上来谁敢接招,搞技术要学会自己琢磨,人家只能给你指点。你先不要着急送一片点,先看清屏对不对,对了就送2字节的FF上去,找到哪里变黑了,也就知道该怎么写程序了。

使用特权

评论回复
地板
sTw_gongwen|  楼主 | 2011-6-12 19:39 | 只看该作者
本帖最后由 sTw_gongwen 于 2011-6-12 19:41 编辑

也对,程序是太长了,我也没给出重点,我的错,其实程序的读写等底层协议应该没问
题,因为用来显示文字是正常的,但是用来显示图片就只有一整版的乱点了,

在网上找了很多成功的例程,我仿照写了,或者采用了他们的思路,但是仍然只有乱点,甚至干脆的不显示了.

另外,我见别人的程序都有复位端,但是我使用的开发板的复位端是直接接Vcc的(自我感觉这个应该没影响吧),


所以希望各位前辈给我看看程序有没错误,或者有没哪位同学使用过慧净HJ-1C的板子,或者郭天祥的TX-1C的板子做过显示图片的程序,

能否给发给我,让我测试一下会不会非程序的错误...

另外感谢NE5532,至少让我知道了我问问题的错误.以后会注意的了.希望以后能有更多的前辈给予新人解答,哪怕是一点提示也好,我是深深的体会了新人没人理的痛苦了,等了一个下午,刷新了无数次,都没见到有人回复,那滋味...

下面是我将图片写入的子函数,望各位前辈,帮我看看有没错:

void displaypicture(uchar code *pic)                                                //显示图片子函数  
{
        char i,j;
        lcd_wcmd(0x34);                                        //关闭绘图显示  
        for(i=0;i<32;i++)                                 //显示上半屏的内容  
        {
           lcd_wcmd(0x80+i);
           lcd_wcmd(0x80);
           for(j=0;j<16;j++)
           {
                           lcd_wdata(*pic);
                        pic++;        
           }
        }

        for(i=0;i<32;i++)                                 //显示上半屏的内容  
        {
           lcd_wcmd(0x80+i);
           lcd_wcmd(0x88);
           for(j=16;j<32;j++)
           {
                           lcd_wdata(*pic);
                        pic++;        
           }
        }
        lcd_wcmd(0x36);                                        //打开绘图显示  
}
//*********************************************************************

下面是我绘图前的初始化子函数:
void pic_init()                        //绘图模式初始化  
{
        
    delay(100);        
        LCD_PSB = 1;         //并口方式
    lcd_wcmd(0x36);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x36);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x3E);      
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}

//*********************************************************************

使用特权

评论回复
5
sTw_gongwen|  楼主 | 2011-6-12 19:43 | 只看该作者
新人问问题,有不足的地方,有不正确的地方,还望前辈能提出来,新人会坚决改正的,还望各位前辈多多包涵;

使用特权

评论回复
6
huangqi412| | 2011-6-12 19:44 | 只看该作者
既然能显示文字,应该不会有硬件问题。。。

使用特权

评论回复
7
huangqi412| | 2011-6-12 19:45 | 只看该作者
可能指令错了。。。  图片数据先测试FF,F0之类。。。。

使用特权

评论回复
8
sTw_gongwen|  楼主 | 2011-6-12 19:48 | 只看该作者
就是把图片代码全改成FF或F0吗?

使用特权

评论回复
9
sTw_gongwen|  楼主 | 2011-6-12 19:57 | 只看该作者
测试了,用FF全部点亮正常显示,用00全屏空白也正常,难道是我的LCD取模软件有问题,前辈,能发个全屏图形的代码吗?

使用特权

评论回复
10
NE5532| | 2011-6-12 20:13 | 只看该作者
"其实程序的读写等底层协议应该没问
题,因为用来显示文字是正常的
"这个就是你出问题的地方。你认为什么都没问题,请问你还来这里干什么?你想求高手给你一个程序来测,高手的硬件环境和你的一样么?没有高手接招你又怎么办?


正确的做法是检查底层,想办法一步一步向目标接近,用最简单的数据来测试显示,让你送2字节FF就是方法之一。

你要本着世界上没有救世主,只有自己救自己的心态来搞技术,不然得不到进步的。

使用特权

评论回复
11
sTw_gongwen|  楼主 | 2011-6-12 20:13 | 只看该作者
OK 问题已经解决了,

LCD的取模模式没有正确选择,我选取了横向取模,应该选择纵向取模,是huangqi412给了我灵感,

既然是FF和00测试成功就说明程序和硬件都没错,那错误就应该在字模码上面了,

结果,果然问题出现在那里拉,

非常感谢huangqi412的提示,一句话就能解决我几日的困惑,一直都不知道字模有两种取模的方法,经过前辈提示才能想到这方面,然后再在这方面找原因.

希望各位前辈能积极给予指点,哪怕是你觉得很微不足道的小问题,那可能也是我们新人困惑好几日的问题呢,

再次感谢huangqi412前辈;

使用特权

评论回复
12
sTw_gongwen|  楼主 | 2011-6-12 20:41 | 只看该作者
10# NE5532

恩,非常感谢您的指正,我也明白学习这东西要靠自己,我也是弄了快一个星期都没完成才来问的,基本上把我知道的几个论坛的资料都下来看过了,结果还是没弄成,你也说了,用FF测试是一种方法,但是好像我这种完全自学的可怜孩子怎么会无端端就想到呢,还是要靠前辈的提示啊,其实我们新人问的问题有时在其他人眼里看来就是那么的幼稚,但是在我们眼中,你能体会那种我看他是如此高深不可看透的感觉吗?

所以希望您不要太排斥我这个新人:lol ,

我想问人拿程序也是怕你们烦我们新人,又怕程序太长繁琐,我只能找一些硬件环境接近的成功例程来自己去琢磨了,并不是你想象的那样直接拿别人的程序就完事了的,毕竟我们是真心学习的,而且各人写程序的风格是不同的,我拿到程序后怎么样都会把他琢磨透让他变成自己的东西的:L (虽然还是别人的知识产物).

不好意思,作为新人,又刚开始学着发帖,感慨了点,说的有点多了,见谅啊:$ .

使用特权

评论回复
13
NE5532| | 2011-6-12 21:48 | 只看该作者
10# NE5532  

恩,非常感谢您的指正,我也明白学习这东西要靠自己,我也是弄了快一个星期都没完成才来问的,基本上把我知道的几个论坛的资料都下来看过了,结果还是没弄成,你也说了,用FF测试是一种方法,但是好像我这种 ...
sTw_gongwen 发表于 2011-6-12 20:41


我也是自己琢磨出来的,不要用没人带给自己找借口,你不比别人笨,只是逼自己的时候少了而已。

使用特权

评论回复
14
huangqi412| | 2011-6-12 22:39 | 只看该作者
:o 这个,这个主要还是LZ自己悟出来的。
你先用FF,00,F0,0F之类,就能知道他的显示方式了。
LZ还是有悟性的,遇事先自己琢磨。 11# sTw_gongwen

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

9

帖子

1

粉丝