共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? |
打赏帖 | |
---|---|
老胖子聊电路--分析一个反馈电路被打赏50分 | |
放大↔震荡被打赏50分 | |
【换取手持数字示波器】RTduino驱动ssd1306+sht31温湿度计被打赏40分 | |
【换取手持数字示波器】称植国产开源TobudOS到雅特力AT32F425被打赏40分 | |
【分享评测,赢取加热台】+Telink-泰凌微电子B91点灯篇被打赏20分 | |
【换取手持数字示波器】+精英板驱动LCD屏被打赏50分 | |
【换取手持数字示波器】+DFR0216全彩灯带WS2812示例分享被打赏50分 | |
【换取手持数字示波器】安装雅特力国产IDE-AT32IDE被打赏30分 | |
【换取手持数字示波器】+DFR0654板卡驱动数码管和串口功能分享被打赏50分 | |
【换取手持数字示波器】+DFPlayerMini模块推喇叭示例分享被打赏50分 |