共3条
1/1 1 跳转至页
LCD 关于LCD显示的一个程序,看看错在哪里

问
昨天写了一个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: 知道错误了,管教定义错误!
找了好久,找不到错误,帖出,希望大家指点。程序如下
---------------------------------------------------------------------
#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: 知道错误了,管教定义错误!
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |