共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |