这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » LCD 关于LCD显示的一个程序,看看错在哪里

共3条 1/1 1 跳转至

LCD 关于LCD显示的一个程序,看看错在哪里

院士
2006-09-17 18:14:16     打赏
LCD 关于LCD显示的一个程序,看看错在哪里



关键词: 关于     显示     一个     程序     看错     在哪里    

院士
2006-12-22 22:43:00     打赏
2楼
问 昨天写了一个LCD的C程序,但是结果就是不对。
找了好久,找不到错误,帖出,希望大家指点。程序如下
---------------------------------------------------------------------

#include<AT89X52.H>
#include <intrins.h>
#define DATALINE P0

sbit BUSY=P0^7;
sbit DI=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
sbit CS1=P2^4;
sbit CS2=P2^3;

void lcd_init(void);//LCD初始化
void lcd_clr(void);//清屏
void write_cmd_l(unsigned char);//给左屏写指令
void write_cmd_r(unsigned char);//给右屏写指令
void write_dat_l(unsigned char);//给左屏写数据
void write_dat_r(unsigned char);//给右屏写数据


//时
code unsigned char shi[]=
{
   0x00,  0x00,  0x3F, 0xFC,  0x10,  0x84,  0x10,  0x84,
   0x10,  0x84,  0x3F, 0xFE,  0x00,  0x14,  0x00,  0x10,
   0x00,  0x90,  0x23, 0x10,  0x40,  0x10,  0x80,  0x10,
   0x7F,  0xFF,  0x00, 0x10,  0x00,  0x10,  0x00,  0x00
};

void delay(int x)   //延时程序
{    int i,j;
    for(i=0;i<600;i++)
        for(j=0;j<x;j++);
}


//********************************************************88
//写左边指令
void write_cmd_l(unsigned char cmd)
{
    CS1=1;
    CS2=0;//选择左边屏幕
    DI=0;
    RW=1;//读操作
    do
    {
         DATALINE=0xff;
         E=1;//  RW=1 E=1 数据读到DB0-DB7
         _nop_();
    }
    while(BUSY);//检验是否可写
    E=0;
    RW=0;
    DATALINE=cmd;
    E=1;//RW=0  E的下降沿锁存DB0-DB7
    _nop_();
    E=0;
}
//******************************************************

//写右边指令
void write_cmd_r(unsigned char cmd)
    {
    CS1=0;
    CS2=1;//选择右边屏幕
      DI=0;
    RW=1;//读操作
    do
    {
        DATALINE=0xff;
        E=1;
        _nop_();
    }
    while(BUSY);
    E=0;
    RW=0;
    DATALINE=cmd;
    E=1;
    _nop_();
    E=0;
}
//******************************************************

//写左数据
void write_dat_l(unsigned char ch)
{
    CS1=1;
    CS2=0;//选择左边屏幕
    DI=0;
    RW=1;//读操作
    do
    {
        DATALINE=0xff;
        E=1;
        _nop_();
    }
    while(BUSY);
    E=0;
    DI=1;
    RW=0;
    DATALINE=ch;     
    E=1;//RW=0  E的下降沿锁存DB0-DB7
    _nop_();
    E=0;
    CS1=0;
    CS2=0;
}
//******************************************************

//写右数据
void write_dat_r(unsigned char ch)
{
    CS1=0;
    CS2=1;//选择右边屏幕
    DI=0;
    RW=1;//读操作
    do
    {
        DATALINE=0xff;
        E=1;
        _nop_();
    }
    while(BUSY);
    E=0;
    DI=1;
    RW=0;
    DATALINE=ch;    
    E=1;//RW=0  E的下降沿锁存DB0-DB7
    _nop_();
    E=0;
    CS1=0;
    CS2=0;     
}
//********************************************************

//清屏
void lcd_clr(void)
{    
    unsigned char i,j,page;
    for( i = 0; i < 8; i++ )
    {
        page = i;
        page |= 0xb8;//1011 1000  X地址
        write_cmd_l(page);
        write_cmd_l(0x40);//0100 0000
        for( j = 0; j < 64; j++ )// Y地址自动加1,此时输入0
            write_dat_l(0);
        write_cmd_r(page);
        write_cmd_r(0x40);//0100 0000
        for( j = 0; j < 64; j++ )
            write_dat_r(0);
    }    
}
//******************************************************

//液晶初始化
void lcd_init(void)
    {
        write_cmd_l(0x3e);//0011 1110 关左边显示
        write_cmd_r(0x3e);//0011 1110 关右边显示
        write_cmd_l(0xc0);//1100 0000 设置左边从第一行显示
        write_cmd_r(0xc0);//1100 0000 设置右边从第一行显示
        write_cmd_l(0x3f);//0011 1111 开左边显示
        write_cmd_r(0x3f);//0011 1111 开右边显示    
        lcd_clr();// 清屏        
    }
//***************************************************


//在屏幕的任意位置写待显示的数据(一字节)
//XPOS为行,YPOS为列
void write_data(unsigned char xpos,unsigned char ypos,unsigned char lcddata)//在屏幕的任意位置写待显示的数据
{
    if ((ypos&0x40)==0)//0100 0000  
    {
        write_cmd_r(0xb8|xpos);//X页地址
        write_cmd_r(0x40|ypos);//Y地址
          write_dat_r(lcddata);    
    }
    else
    {
        write_cmd_l(0xb8|xpos);
        write_cmd_l(0x40|ypos);
          write_dat_l(lcddata);    
    }     
}

//*****************************************************
//显示(x,y)一个汉字
void diaplay_hz(unsigned char x,unsigned char y,unsigned char *chhz)
{
    unsigned char i;
    for (i=0;i<16;i++)
    {
        write_data(x+1,y+i,chhz[0]);
        chhz++;
        write_data(x,y+i,chhz[0]);
        chhz++;
    }
}
//*****************************************************


void main()
{
    lcd_init();
    lcd_clr();
    while(1)
    {
        diaplay_hz(0,26,shi);
    }
} 1: 搬个板凳慢慢看。我马上也要做这个。 2: 就是不知道哪里错了啊!看出来告诉我一下。 3: 知道错误了,管教定义错误!

高工
2022-08-20 11:50:59     打赏
3楼

学习一下


共3条 1/1 1 跳转至

回复

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