单片机LCD显示问题 50
这是一段c代码~求大神改动一下让显示出圆~成功的话再追加50分~#include<reg51.h>#include<CGRAM.h>#defineucharunsigne...
这是一段c代码~求大神改动一下让显示出圆~成功的话再追加50分~
#include<reg51.h>
#include<CGRAM.h>
#define uchar unsigned char
#define LCDPORT P0
uchar table_grade[]={
0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x00,0x00, //.
0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x00,0x00,
};
sbit LCDE=P3^5;
sbit LCDRW=P3^6;
sbit LCDRS=P3^7;
void writecmd(uchar); //定义写命令函数
void init(); //定义初始化函数
void writedata(uchar); //定义写数据函数
void delay(); //定义延时函数
void mydelay(int);
void main()
{
int i;
init();
while(1)
{
for(i=0;i<50;i++)
{
writedata(table_grade[i]);
mydelay(50);
}
}
mydelay(50);
writecmd(0x01);
writecmd(0x80+15); //改变DDRAM的地址,准备进入下一次循环,显示重新开始
}
void delay()
{
int uicount;
for(uicount=0;uicount<250;uicount++);
}
void writecmd(uchar command) //写命令函数,用于修改液晶的状态寄存器
{
delay(); // 先延时,越过液晶“忙的状态”
LCDE=1; // 使能端先置1
LCDRS=0; // 设置RS为0,打开指令寄存器
LCDRW=0; // 设置为写寄存器状态
LCDPORT=command; // 输出命令
LCDE=0; // 使能端由0变1,出现下降沿有效,执行命令
}
void writedata(uchar dat) //把LCD改为写入数据状态
{
delay();
LCDE=1; //把LCD改为写入数据状态
LCDRS=1;
LCDRW=0;
LCDPORT=dat; //再输出数据
LCDE=0; //使能端有效,显示数据
}
void init() //初始化程序,模块化使程序更清晰
{
LCDRW=0;
LCDE=0;
writecmd(0x38); //设置单行显示,8位数据接口
writecmd(0x0c); //设置整体显示开、光标关、字符不闪烁
writecmd(0x07); //设置为增量模式,整体显示移动开
writecmd(0x01); //清屏
writecmd(0x80+15); //设置字符进入屏幕的初始位置
}
void mydelay(int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=255;j>0;j--);
} 展开
#include<reg51.h>
#include<CGRAM.h>
#define uchar unsigned char
#define LCDPORT P0
uchar table_grade[]={
0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x00,0x00, //.
0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x00,0x00,
};
sbit LCDE=P3^5;
sbit LCDRW=P3^6;
sbit LCDRS=P3^7;
void writecmd(uchar); //定义写命令函数
void init(); //定义初始化函数
void writedata(uchar); //定义写数据函数
void delay(); //定义延时函数
void mydelay(int);
void main()
{
int i;
init();
while(1)
{
for(i=0;i<50;i++)
{
writedata(table_grade[i]);
mydelay(50);
}
}
mydelay(50);
writecmd(0x01);
writecmd(0x80+15); //改变DDRAM的地址,准备进入下一次循环,显示重新开始
}
void delay()
{
int uicount;
for(uicount=0;uicount<250;uicount++);
}
void writecmd(uchar command) //写命令函数,用于修改液晶的状态寄存器
{
delay(); // 先延时,越过液晶“忙的状态”
LCDE=1; // 使能端先置1
LCDRS=0; // 设置RS为0,打开指令寄存器
LCDRW=0; // 设置为写寄存器状态
LCDPORT=command; // 输出命令
LCDE=0; // 使能端由0变1,出现下降沿有效,执行命令
}
void writedata(uchar dat) //把LCD改为写入数据状态
{
delay();
LCDE=1; //把LCD改为写入数据状态
LCDRS=1;
LCDRW=0;
LCDPORT=dat; //再输出数据
LCDE=0; //使能端有效,显示数据
}
void init() //初始化程序,模块化使程序更清晰
{
LCDRW=0;
LCDE=0;
writecmd(0x38); //设置单行显示,8位数据接口
writecmd(0x0c); //设置整体显示开、光标关、字符不闪烁
writecmd(0x07); //设置为增量模式,整体显示移动开
writecmd(0x01); //清屏
writecmd(0x80+15); //设置字符进入屏幕的初始位置
}
void mydelay(int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=255;j>0;j--);
} 展开
2个回答
2014-06-17
展开全部
什么样的LCD ? 1602?12864?如果12864又是哪个芯片的
追问
1602~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include"STC12C5A60S2.H"
#include"DISP12864.H"
#include<intrins.h>
void Delayms(unsigned char ms) //@11.0592MHz
{
unsigned char i,j;
while(ms--)
{
i = 11;
j = 190;
do
{
while (--j);
}
while (--i);
}
}
void Delayus(unsigned char us) //@11.0592MHz
{
unsigned char i;
while(us--)
{
_nop_();
_nop_();
i = 24;
while(--i);
}
}
bit busy()
{
bit mang;
RS=0;
RW=1;
EN=1;
Delayus(2);
mang=(bit)(P0&0x80);//读取P0最高位的值
EN=0;
return mang;//返回读到的忙状态
}
void Write_LcdCom(unsigned char com) //写命令
{
while(busy());//查忙
RS=0;
RW=0;
EN=0;
P0=com;//将指令赋给P0
Delayus(1);//摸拟产生一个脉冲
EN=1;
Delayus(1);
EN=0;
}
void Write_LcdData(unsigned char dat)
{
while(busy());//查忙
RS=1;
RW=0;
EN=0;
P0=dat;//将数据赋给P0
Delayus(1);//摸拟产生一个脉冲
EN=1;
Delayus(1);
EN=0;
}
void Init_Lcd()
{
PSB=1;//并行方式
RST=0;//复位
Delayms(1);
RST=1;
Write_LcdCom(0X34);//扩充指令操作
Delayms(1);
Write_LcdCom(0X30);//基本指令操作
Delayms(1);
Write_LcdCom(0x0C);//开显示,关光标
Delayms(1);
Write_LcdCom(0X01);//清屏
Delayms(10);
}
/****************************************************
函数功能:清除GCROM的内容,如果不清除会出现花屏现象
清除方法:向GCROM中写入0x00来清除内
*****************************************************/
void Clear_LcdDisp()
{
Write_LcdCom(0x01);//清屏
}
void Clear_Gcrom()
{
unsigned char i,j,k;
lcd_x=0x80;
lcd_y=0x80;
Write_LcdCom(0x34);
for(i=0;i<2;i++)
{
for(j=0;j<32;j++)
{
Write_LcdCom(lcd_y+j);
Write_LcdCom(lcd_x);
for(k=0;k<16;k++)
{
Write_LcdData(0x00);
}
}
lcd_x=0x88;
}
Write_LcdCom(0x36);
Write_LcdCom(0x30);
}
void Write_LcdImage(unsigned char *p)//显示一张图片
{
unsigned char i,j,k;
lcd_x=0x80;
lcd_y=0x80;
Write_LcdCom(0x34);
for(i=0;i<2;i++) //分为上下两屏
{
for(j=0;j<32;j++)
{
Write_LcdCom(lcd_y+j);
Write_LcdCom(lcd_x);
for(k=0;k<16;k++) //写入显示数据
{
Write_LcdData(*p++);
}
}
lcd_x=0x88;
}
Write_LcdCom(0x36);
Write_LcdCom(0x30);
}
void Write_LcdRowString(unsigned char row,unsigned char *p)//显示一行字符 入口参数:行数,字符串数组
{
unsigned char i;
switch (row)
{
case 1:Write_LcdCom(0x80);break; //设置第一行地址
case 2:Write_LcdCom(0x90);break; //设置第二行地址
case 3:Write_LcdCom(0x88);break; //设置第三行地址
case 4:Write_LcdCom(0x98);break; //设置第四行地址
//default: break;
}
for(i=0;i<16;i++)//显示一行内容
{
Write_LcdData(*p++);
Delayms(10);
}
}
如果你的lcd是12864的话,可以调用显示图片的那个函数。然后用一个画图软件在128x64像素内画一个圆圈,再用取模软件取数组,copy出来调用就好。网上可以百度。
#include"DISP12864.H"
#include<intrins.h>
void Delayms(unsigned char ms) //@11.0592MHz
{
unsigned char i,j;
while(ms--)
{
i = 11;
j = 190;
do
{
while (--j);
}
while (--i);
}
}
void Delayus(unsigned char us) //@11.0592MHz
{
unsigned char i;
while(us--)
{
_nop_();
_nop_();
i = 24;
while(--i);
}
}
bit busy()
{
bit mang;
RS=0;
RW=1;
EN=1;
Delayus(2);
mang=(bit)(P0&0x80);//读取P0最高位的值
EN=0;
return mang;//返回读到的忙状态
}
void Write_LcdCom(unsigned char com) //写命令
{
while(busy());//查忙
RS=0;
RW=0;
EN=0;
P0=com;//将指令赋给P0
Delayus(1);//摸拟产生一个脉冲
EN=1;
Delayus(1);
EN=0;
}
void Write_LcdData(unsigned char dat)
{
while(busy());//查忙
RS=1;
RW=0;
EN=0;
P0=dat;//将数据赋给P0
Delayus(1);//摸拟产生一个脉冲
EN=1;
Delayus(1);
EN=0;
}
void Init_Lcd()
{
PSB=1;//并行方式
RST=0;//复位
Delayms(1);
RST=1;
Write_LcdCom(0X34);//扩充指令操作
Delayms(1);
Write_LcdCom(0X30);//基本指令操作
Delayms(1);
Write_LcdCom(0x0C);//开显示,关光标
Delayms(1);
Write_LcdCom(0X01);//清屏
Delayms(10);
}
/****************************************************
函数功能:清除GCROM的内容,如果不清除会出现花屏现象
清除方法:向GCROM中写入0x00来清除内
*****************************************************/
void Clear_LcdDisp()
{
Write_LcdCom(0x01);//清屏
}
void Clear_Gcrom()
{
unsigned char i,j,k;
lcd_x=0x80;
lcd_y=0x80;
Write_LcdCom(0x34);
for(i=0;i<2;i++)
{
for(j=0;j<32;j++)
{
Write_LcdCom(lcd_y+j);
Write_LcdCom(lcd_x);
for(k=0;k<16;k++)
{
Write_LcdData(0x00);
}
}
lcd_x=0x88;
}
Write_LcdCom(0x36);
Write_LcdCom(0x30);
}
void Write_LcdImage(unsigned char *p)//显示一张图片
{
unsigned char i,j,k;
lcd_x=0x80;
lcd_y=0x80;
Write_LcdCom(0x34);
for(i=0;i<2;i++) //分为上下两屏
{
for(j=0;j<32;j++)
{
Write_LcdCom(lcd_y+j);
Write_LcdCom(lcd_x);
for(k=0;k<16;k++) //写入显示数据
{
Write_LcdData(*p++);
}
}
lcd_x=0x88;
}
Write_LcdCom(0x36);
Write_LcdCom(0x30);
}
void Write_LcdRowString(unsigned char row,unsigned char *p)//显示一行字符 入口参数:行数,字符串数组
{
unsigned char i;
switch (row)
{
case 1:Write_LcdCom(0x80);break; //设置第一行地址
case 2:Write_LcdCom(0x90);break; //设置第二行地址
case 3:Write_LcdCom(0x88);break; //设置第三行地址
case 4:Write_LcdCom(0x98);break; //设置第四行地址
//default: break;
}
for(i=0;i<16;i++)//显示一行内容
{
Write_LcdData(*p++);
Delayms(10);
}
}
如果你的lcd是12864的话,可以调用显示图片的那个函数。然后用一个画图软件在128x64像素内画一个圆圈,再用取模软件取数组,copy出来调用就好。网上可以百度。
追问
请问你用的是什么头文件啊~为什么我自己编译不能通过~
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询