我用51单片机来调试一个液晶显示的程序,为什么液晶显示不出来 1602的液晶,下面是撑血帮我看下,谢谢了 10
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitrs=P3^5;sbitwr=P3^...
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit wr=P3^6;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
uchar table1[]=" OK400C SYSTEM ";
uchar table2[]=" www.AOKEMCU.CN";
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void delay1(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_com(uchar com)
{
P0=com;
rs=0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void write_date(uchar date)
{
P0=date;
rs=1;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void init()
{
dula=0;
wela=0;
wr=0;
write_com(0x38);
delay(20);
write_com(0x0f);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
void main()
{
uchar a;
P0=0;
P2&=0x1F;
init();
write_com(0x80+17);
delay(20);
for(a=0;a<16;a++)
{
write_date(table1[a]);
delay(20);
}
write_com(0xc0+17);
delay(50);
for(a=0;a<14;a++)
{
write_date(table2[a]);
delay(40);
}
for(a=0;a<16;a++)
{
write_com(0x18);
delay1(200);
}
while(1);
} 展开
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit wr=P3^6;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
uchar table1[]=" OK400C SYSTEM ";
uchar table2[]=" www.AOKEMCU.CN";
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void delay1(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_com(uchar com)
{
P0=com;
rs=0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void write_date(uchar date)
{
P0=date;
rs=1;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void init()
{
dula=0;
wela=0;
wr=0;
write_com(0x38);
delay(20);
write_com(0x0f);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
void main()
{
uchar a;
P0=0;
P2&=0x1F;
init();
write_com(0x80+17);
delay(20);
for(a=0;a<16;a++)
{
write_date(table1[a]);
delay(20);
}
write_com(0xc0+17);
delay(50);
for(a=0;a<14;a++)
{
write_date(table2[a]);
delay(40);
}
for(a=0;a<16;a++)
{
write_com(0x18);
delay1(200);
}
while(1);
} 展开
5个回答
展开全部
1、write_com(0x80+17);write_com(0xc0+17);中的【17】改成【0】试试。
2、P0口需全部上拉电阻。有吗?
3、对比度调节电压VL,直接接地试试?
4、初始化时,多写数次write_com(0x38);
5、断点放在write_com(0x18);执行之前,看看显示情况。0x18干嘛的?
2、P0口需全部上拉电阻。有吗?
3、对比度调节电压VL,直接接地试试?
4、初始化时,多写数次write_com(0x38);
5、断点放在write_com(0x18);执行之前,看看显示情况。0x18干嘛的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
本解码程序适用于NEC的upd6121及其兼容芯片的解码,支持大多数遥控器 实验板采用11.0592MHZ晶振
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
sbit IR=P3^2; //将IR位定义为P3.2引脚
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
sbit BEEP = P3^6; //蜂鸣器控制端口P36
unsigned char flag;
unsigned char code string[ ]= ;
unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度
/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*********************************************************/
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<100;i++)
{
delay1ms();
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(250); //延时
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0C); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)
{
unsigned char i,j;
unsigned char temp; //储存解码出的数据
for(i=0;i<4;i++) //连续读取4个用户码和键数据码
{
for(j=0;j<8;j++) //每个码有8位数字
{
temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是高位数据
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==0) //如果是低电平就等待
; //低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平宽度
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==1) //如果是高电平就等待
;
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存高电平宽度
if((LowTime<370)||(LowTime>640))
return 0; //如果低电平长度不在合理范围,则认为出错,停止解码
if((HighTime>420)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次
temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1
}
a[i]=temp; //将解码出的字节值储存在a[i]
}
if(a[2]=~a[3]) //验证键数据码和其反码是否相等,一般情况下不必验证用户码
return 1; //解码正确,返回1
}
/*------------------二进制码转换为压缩型BCD码,并显示---------------*/
void two_2_bcd(unsigned char date)
{
unsigned char temp;
temp=date;
date&=0xf0;
date>>=4; //右移四位得到高四位码
date&=0x0f; //与0x0f想与确保高四位为0
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示键值高四位
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示低四位值
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
WriteData(0x48); //显示字符'H'
}
/************************************************************
函数功能:1602LCD显示
*************************************************************/
void Disp(void)
{
WriteAddress(0x40); // 设置显示位置为第一行的第1个字
two_2_bcd(a[0]);
WriteData(0x20);
two_2_bcd(a[1]);
WriteData(0x20);
two_2_bcd(a[2]);
WriteData(0x20);
two_2_bcd(a[3]);
}
/************************************************************
函数功能:主函数
*************************************************************/
void main()
{
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
delay(10);
WriteInstruction(0x01);//清显示:清屏幕指令
WriteAddress(0x00); // 设置显示位置为第一行的第1个字
i = 0;
while(string[i] != '\0') //'\0'是数组结束标志
{ // 显示字符
WriteData(string[i]);
i++;
}
EA=1; //开启总中断
EX0=1; //开外中断0
ET0=1; //定时器T0中断允许
IT0=1; //外中断的下降沿触发
TMOD=0x01; //使用定时器T0的模式1
TR0=0; //定时器T0关闭
while(1); //等待红外信号产生的中断
}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0
{
EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==0); //如果是低电平就等待,给引导码低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平时间
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==1); //如果是高电平就等待,给引导码高电平计时
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存引导码的高电平长度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
{
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
if(DeCode()==1) // 执行遥控解码功能
{
Disp();//调用1602LCD显示函数
beep();//蜂鸣器响一声 提示解码成功
}
}
EX0=1; //开启外中断EX0
}
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
sbit IR=P3^2; //将IR位定义为P3.2引脚
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
sbit BEEP = P3^6; //蜂鸣器控制端口P36
unsigned char flag;
unsigned char code string[ ]= ;
unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度
/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*********************************************************/
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<100;i++)
{
delay1ms();
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(250); //延时
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0C); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)
{
unsigned char i,j;
unsigned char temp; //储存解码出的数据
for(i=0;i<4;i++) //连续读取4个用户码和键数据码
{
for(j=0;j<8;j++) //每个码有8位数字
{
temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是高位数据
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==0) //如果是低电平就等待
; //低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平宽度
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==1) //如果是高电平就等待
;
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存高电平宽度
if((LowTime<370)||(LowTime>640))
return 0; //如果低电平长度不在合理范围,则认为出错,停止解码
if((HighTime>420)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次
temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1
}
a[i]=temp; //将解码出的字节值储存在a[i]
}
if(a[2]=~a[3]) //验证键数据码和其反码是否相等,一般情况下不必验证用户码
return 1; //解码正确,返回1
}
/*------------------二进制码转换为压缩型BCD码,并显示---------------*/
void two_2_bcd(unsigned char date)
{
unsigned char temp;
temp=date;
date&=0xf0;
date>>=4; //右移四位得到高四位码
date&=0x0f; //与0x0f想与确保高四位为0
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示键值高四位
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示低四位值
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
WriteData(0x48); //显示字符'H'
}
/************************************************************
函数功能:1602LCD显示
*************************************************************/
void Disp(void)
{
WriteAddress(0x40); // 设置显示位置为第一行的第1个字
two_2_bcd(a[0]);
WriteData(0x20);
two_2_bcd(a[1]);
WriteData(0x20);
two_2_bcd(a[2]);
WriteData(0x20);
two_2_bcd(a[3]);
}
/************************************************************
函数功能:主函数
*************************************************************/
void main()
{
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
delay(10);
WriteInstruction(0x01);//清显示:清屏幕指令
WriteAddress(0x00); // 设置显示位置为第一行的第1个字
i = 0;
while(string[i] != '\0') //'\0'是数组结束标志
{ // 显示字符
WriteData(string[i]);
i++;
}
EA=1; //开启总中断
EX0=1; //开外中断0
ET0=1; //定时器T0中断允许
IT0=1; //外中断的下降沿触发
TMOD=0x01; //使用定时器T0的模式1
TR0=0; //定时器T0关闭
while(1); //等待红外信号产生的中断
}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0
{
EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==0); //如果是低电平就等待,给引导码低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平时间
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==1); //如果是高电平就等待,给引导码高电平计时
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存引导码的高电平长度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
{
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
if(DeCode()==1) // 执行遥控解码功能
{
Disp();//调用1602LCD显示函数
beep();//蜂鸣器响一声 提示解码成功
}
}
EX0=1; //开启外中断EX0
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
下面的程序我已通过测试,我所用的1602是还几年前买的,可能跟现在卖的在初始化的子程序内有点区别,但是调准延时程序的延时时间很重要,延时时间短了,也不能正常初始化,也就显示不正确了。下面的功能是演示,将1602的字库内容全都轮流的显示一遍边又一遍。
The program below I have passed through the test, I used the 1602 display was bought at few years ago . Probably it had a little bit difference with now selling the 1602.But i knewn the difference place is in the initialing subroutines. So you shoul focuse the delay program, the delay time is very important, delay time short, also cannot normal initialization, also display incorrectly. The following function is demo, it will display all the content of 1602 again and again.
//=============================
//#include "STC11F.h"
#include<reg51.h>
// ==================================================================
//定义数据结构的简易写法
#define u8 unsigned char
sbit rs = P3^4;
sbit r_w = P3^6;
sbit e = P3^3;
idata u8 disp_buff[24];
u8 su_0=0x30;
u8 su_1=0x31;
u8 su_2=0x32;
u8 su_3=0x33;
u8 su_4=0x34;
u8 su_5=0x35;
u8 su_6=0x36;
u8 su_7=0x37;
u8 su_8=0x38;
u8 su_9=0x39;
u8 CHA=0x41;
u8 CHB=0x42;
u8 CHC=0x43;
u8 CHD=0x44;
u8 CHE=0x45;
u8 CHF=0x46;
u8 CHG=0x47;
u8 CHH=0x48;
u8 CHI=0x49;
u8 CHJ=0x4A;
u8 CHK=0x4B;
u8 CHL=0x4C;
u8 CHM=0x4D;
u8 CHN=0x4E;
u8 CHO=0x4F;
u8 CHP=0x50;
u8 CHQ=0x51;
u8 CHR=0x52;
u8 CHS=0x53;
u8 CHT=0x54;
u8 CHU=0x55;
u8 CHV=0x56;
u8 CHW=0x57;
u8 CHX=0x58;
u8 CHY=0x59;
u8 CHZ=0x5A;
u8 ch_a=0x61;
u8 ch_b=0x62;
u8 ch_c=0x63;
u8 ch_d=0x64;
u8 ch_e=0x65;
u8 ch_f=0x66;
u8 ch_g=0x67;
u8 ch_h=0x68;
u8 ch_i=0x69;
u8 ch_j=0x6a;
u8 ch_k=0x6b;
u8 ch_l=0x6c;
u8 ch_m=0x6d;
u8 ch_n=0x6e;
u8 ch_o=0x6f;
u8 ch_p=0x70;
u8 ch_q=0x71;
u8 ch_r=0x72;
u8 ch_s=0x73;
u8 ch_t=0x74;
u8 ch_u=0x75;
u8 ch_v=0x76;
u8 ch_w=0x77;
u8 ch_x=0x78;
u8 ch_y=0x79;
u8 ch_z=0x7a;
u8 blank=0x20;
u8 point=0x2e;
//Here the MCU is STC1F32XE(1T MCU. If you used to be normal MCU,
//you should have changed the delay software. if not to change it,
//It is not work well ) WITH 22.1184MHZ.
//The dalay software as follow:
void delay1us()
{
u8 i=3; //when Fosc=22.1184M 1T=0.045 here will delay 1.08us
while(--i);
}
void D20us() // 22.1184 MHz
{ u8 i;
for(i=20;i>0;i--) //20US
delay1us();
}
void D250us(u8 Delay) // 22.1184 MHz
{ u8 i;
for(;Delay>0;Delay--)
{ for(i=250;i>0;i--) //250US
delay1us();
}
}
void d1ms(u8 Delay) // Delay 1 mS Fm = 22.1184 MHz
{ u8 i;
for(;Delay>0;Delay--)
{ for(i=50;i>0;i--) //50*20US=1000US=1MS
D20us();
}
}
//---------------------------------
u8 bf_and_ac () /*read busy and adrss counter*/
{
u8 x;
r_w=0;
rs=0;
e=0;
d1ms(10); //the delay time have tried OK!
r_w=1;
e=1;
d1ms(10);
x=P1;
e=0;
r_w=0;
return(0);
}
//-------------------------
void w_code(u8 order) // write cmd
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
e=1;
P1=order;
e=0;
r_w=0;
}
//----------------------------------------------
void w_data(u8 su) // write data
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
rs=1;
e=1;
P1=su;
e=0;
r_w=0;
}
//----------------------------
u8 r_data()
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
rs=1;
e=1;
x=P1;
e=0;
r_w=0;
return(x);
}
void w_ram(u8 adrss,u8 su,u8 length) //set position;data;data length
{
u8 i;
w_code(adrss);
for(i=0;i<length;i++)
w_data(su);
}
void DisplayOneChar(u8 x,u8 y,u8 su)
{
x=x&0x0f;
y=y&0x01;
if(y)x=x|0x40;
x|=0x80;
w_code(x);
w_data(su);
}
void DispLstChar(u8 x,u8 y,u8 slength,u8 *su)
{
u8 ListLength;
ListLength=0;
x=x&0x0f;
y=y&0x01;
while(ListLength<slength)
{
DisplayOneChar(x,y,su[ListLength]);
ListLength++;
x++;
}
}
void init()
{
w_code(0x38);
d1ms(10);//dSP1ms(1);
w_code(0x01);
d1ms(10);//dSP1ms(1);
w_code(0x06);
d1ms(10);//dSP1ms(1);
w_code(0x0e);
}
void main()
{
char l0,l1,l2;
init();
while(1)
{
disp_buff[0] = CHO;
disp_buff[1] = CHK;
disp_buff[2] = su_4;
disp_buff[3] = su_0;
disp_buff[4] = su_0;
disp_buff[5] = CHC;
disp_buff[6] = blank;
disp_buff[7] = CHS;
disp_buff[8] = CHY;
disp_buff[9] = CHS;
disp_buff[10] = CHT;
disp_buff[11] = CHE;
disp_buff[12] = CHM;
disp_buff[13] = blank;
disp_buff[14] = CHO;
disp_buff[15] = CHK;
DispLstChar(0,0,16,disp_buff);
w_ram(0x80,0XFF,0x01);
w_ram(0x81,0XFF,0x01);
w_ram(0x82,0XFF,0x01);
w_ram(0x83,0XFF,0x01);
w_ram(0x84,0xFF,0x01);
w_ram(0x85,0xFF,0x01);
w_ram(0x86,0xFF,0x01);
w_ram(0x87,0xFF,0x01);
w_ram(0xc0,0XFF,0x01);
w_ram(0xc1,0XFF,0x01);
w_ram(0xc2,0XFF,0x01);
w_ram(0xc3,0XFF,0x01);
w_ram(0xc4,0XFF,0x01);
w_ram(0xc5,0XFF,0x01);
w_ram(0xc6,0XFF,0x01);
w_ram(0xc7,0XFF,0x01);
w_ram(0x88,0XFF,0x01);
w_ram(0x89,0XFF,0x01);
w_ram(0x8A,0XFF,0x01);
w_ram(0x8B,0XFF,0x01);
w_ram(0x8C,0XFF,0x01);
w_ram(0x8D,0XFF,0x01);
w_ram(0x8E,0XFF,0x01);
w_ram(0x8F,0XFF,0x01);
w_ram(0xc8,0XFF,0x01);
w_ram(0xc9,0XFF,0x01);
w_ram(0xcA,0XFF,0x01);
w_ram(0xcB,0XFF,0x01);
w_ram(0xcC,0XFF,0x01);
w_ram(0xcD,0XFF,0x01);
w_ram(0xcE,0XFF,0x01);
w_ram(0xcF,0XFF,0x01);
d1ms(255);
w_ram(0x80,0X20,0x01);
w_ram(0x81,0X20,0x01);
w_ram(0x82,0X20,0x01);
w_ram(0x83,0X20,0x01);
w_ram(0x84,0x20,0x01);
w_ram(0x85,0x20,0x01);
w_ram(0x86,0x20,0x01);
w_ram(0x87,0x20,0x01);
w_ram(0xc0,0X20,0x01);
w_ram(0xc1,0X20,0x01);
w_ram(0xc2,0X20,0x01);
w_ram(0xc3,0X20,0x01);
w_ram(0xc4,0X20,0x01);
w_ram(0xc5,0X20,0x01);
w_ram(0xc6,0X20,0x01);
w_ram(0xc7,0X20,0x01);
w_ram(0x88,0X20,0x01);
w_ram(0x89,0X20,0x01);
w_ram(0x8A,0X20,0x01);
w_ram(0x8B,0X20,0x01);
w_ram(0x8C,0X20,0x01);
w_ram(0x8D,0X20,0x01);
w_ram(0x8E,0X20,0x01);
w_ram(0x8F,0X20,0x01);
w_ram(0xc8,0X20,0x01);
w_ram(0xc9,0X20,0x01);
w_ram(0xcA,0X20,0x01);
w_ram(0xcB,0X20,0x01);
w_ram(0xcC,0X20,0x01);
w_ram(0xcD,0X20,0x01);
w_ram(0xcE,0X20,0x01);
w_ram(0xcF,0X20,0x01);
d1ms(255);
l0=0x20;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x30;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0x40;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x50;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0x60;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x70;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xa0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xb0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xc0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xd0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xe0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xf0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
}
}
The program below I have passed through the test, I used the 1602 display was bought at few years ago . Probably it had a little bit difference with now selling the 1602.But i knewn the difference place is in the initialing subroutines. So you shoul focuse the delay program, the delay time is very important, delay time short, also cannot normal initialization, also display incorrectly. The following function is demo, it will display all the content of 1602 again and again.
//=============================
//#include "STC11F.h"
#include<reg51.h>
// ==================================================================
//定义数据结构的简易写法
#define u8 unsigned char
sbit rs = P3^4;
sbit r_w = P3^6;
sbit e = P3^3;
idata u8 disp_buff[24];
u8 su_0=0x30;
u8 su_1=0x31;
u8 su_2=0x32;
u8 su_3=0x33;
u8 su_4=0x34;
u8 su_5=0x35;
u8 su_6=0x36;
u8 su_7=0x37;
u8 su_8=0x38;
u8 su_9=0x39;
u8 CHA=0x41;
u8 CHB=0x42;
u8 CHC=0x43;
u8 CHD=0x44;
u8 CHE=0x45;
u8 CHF=0x46;
u8 CHG=0x47;
u8 CHH=0x48;
u8 CHI=0x49;
u8 CHJ=0x4A;
u8 CHK=0x4B;
u8 CHL=0x4C;
u8 CHM=0x4D;
u8 CHN=0x4E;
u8 CHO=0x4F;
u8 CHP=0x50;
u8 CHQ=0x51;
u8 CHR=0x52;
u8 CHS=0x53;
u8 CHT=0x54;
u8 CHU=0x55;
u8 CHV=0x56;
u8 CHW=0x57;
u8 CHX=0x58;
u8 CHY=0x59;
u8 CHZ=0x5A;
u8 ch_a=0x61;
u8 ch_b=0x62;
u8 ch_c=0x63;
u8 ch_d=0x64;
u8 ch_e=0x65;
u8 ch_f=0x66;
u8 ch_g=0x67;
u8 ch_h=0x68;
u8 ch_i=0x69;
u8 ch_j=0x6a;
u8 ch_k=0x6b;
u8 ch_l=0x6c;
u8 ch_m=0x6d;
u8 ch_n=0x6e;
u8 ch_o=0x6f;
u8 ch_p=0x70;
u8 ch_q=0x71;
u8 ch_r=0x72;
u8 ch_s=0x73;
u8 ch_t=0x74;
u8 ch_u=0x75;
u8 ch_v=0x76;
u8 ch_w=0x77;
u8 ch_x=0x78;
u8 ch_y=0x79;
u8 ch_z=0x7a;
u8 blank=0x20;
u8 point=0x2e;
//Here the MCU is STC1F32XE(1T MCU. If you used to be normal MCU,
//you should have changed the delay software. if not to change it,
//It is not work well ) WITH 22.1184MHZ.
//The dalay software as follow:
void delay1us()
{
u8 i=3; //when Fosc=22.1184M 1T=0.045 here will delay 1.08us
while(--i);
}
void D20us() // 22.1184 MHz
{ u8 i;
for(i=20;i>0;i--) //20US
delay1us();
}
void D250us(u8 Delay) // 22.1184 MHz
{ u8 i;
for(;Delay>0;Delay--)
{ for(i=250;i>0;i--) //250US
delay1us();
}
}
void d1ms(u8 Delay) // Delay 1 mS Fm = 22.1184 MHz
{ u8 i;
for(;Delay>0;Delay--)
{ for(i=50;i>0;i--) //50*20US=1000US=1MS
D20us();
}
}
//---------------------------------
u8 bf_and_ac () /*read busy and adrss counter*/
{
u8 x;
r_w=0;
rs=0;
e=0;
d1ms(10); //the delay time have tried OK!
r_w=1;
e=1;
d1ms(10);
x=P1;
e=0;
r_w=0;
return(0);
}
//-------------------------
void w_code(u8 order) // write cmd
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
e=1;
P1=order;
e=0;
r_w=0;
}
//----------------------------------------------
void w_data(u8 su) // write data
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
rs=1;
e=1;
P1=su;
e=0;
r_w=0;
}
//----------------------------
u8 r_data()
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
rs=1;
e=1;
x=P1;
e=0;
r_w=0;
return(x);
}
void w_ram(u8 adrss,u8 su,u8 length) //set position;data;data length
{
u8 i;
w_code(adrss);
for(i=0;i<length;i++)
w_data(su);
}
void DisplayOneChar(u8 x,u8 y,u8 su)
{
x=x&0x0f;
y=y&0x01;
if(y)x=x|0x40;
x|=0x80;
w_code(x);
w_data(su);
}
void DispLstChar(u8 x,u8 y,u8 slength,u8 *su)
{
u8 ListLength;
ListLength=0;
x=x&0x0f;
y=y&0x01;
while(ListLength<slength)
{
DisplayOneChar(x,y,su[ListLength]);
ListLength++;
x++;
}
}
void init()
{
w_code(0x38);
d1ms(10);//dSP1ms(1);
w_code(0x01);
d1ms(10);//dSP1ms(1);
w_code(0x06);
d1ms(10);//dSP1ms(1);
w_code(0x0e);
}
void main()
{
char l0,l1,l2;
init();
while(1)
{
disp_buff[0] = CHO;
disp_buff[1] = CHK;
disp_buff[2] = su_4;
disp_buff[3] = su_0;
disp_buff[4] = su_0;
disp_buff[5] = CHC;
disp_buff[6] = blank;
disp_buff[7] = CHS;
disp_buff[8] = CHY;
disp_buff[9] = CHS;
disp_buff[10] = CHT;
disp_buff[11] = CHE;
disp_buff[12] = CHM;
disp_buff[13] = blank;
disp_buff[14] = CHO;
disp_buff[15] = CHK;
DispLstChar(0,0,16,disp_buff);
w_ram(0x80,0XFF,0x01);
w_ram(0x81,0XFF,0x01);
w_ram(0x82,0XFF,0x01);
w_ram(0x83,0XFF,0x01);
w_ram(0x84,0xFF,0x01);
w_ram(0x85,0xFF,0x01);
w_ram(0x86,0xFF,0x01);
w_ram(0x87,0xFF,0x01);
w_ram(0xc0,0XFF,0x01);
w_ram(0xc1,0XFF,0x01);
w_ram(0xc2,0XFF,0x01);
w_ram(0xc3,0XFF,0x01);
w_ram(0xc4,0XFF,0x01);
w_ram(0xc5,0XFF,0x01);
w_ram(0xc6,0XFF,0x01);
w_ram(0xc7,0XFF,0x01);
w_ram(0x88,0XFF,0x01);
w_ram(0x89,0XFF,0x01);
w_ram(0x8A,0XFF,0x01);
w_ram(0x8B,0XFF,0x01);
w_ram(0x8C,0XFF,0x01);
w_ram(0x8D,0XFF,0x01);
w_ram(0x8E,0XFF,0x01);
w_ram(0x8F,0XFF,0x01);
w_ram(0xc8,0XFF,0x01);
w_ram(0xc9,0XFF,0x01);
w_ram(0xcA,0XFF,0x01);
w_ram(0xcB,0XFF,0x01);
w_ram(0xcC,0XFF,0x01);
w_ram(0xcD,0XFF,0x01);
w_ram(0xcE,0XFF,0x01);
w_ram(0xcF,0XFF,0x01);
d1ms(255);
w_ram(0x80,0X20,0x01);
w_ram(0x81,0X20,0x01);
w_ram(0x82,0X20,0x01);
w_ram(0x83,0X20,0x01);
w_ram(0x84,0x20,0x01);
w_ram(0x85,0x20,0x01);
w_ram(0x86,0x20,0x01);
w_ram(0x87,0x20,0x01);
w_ram(0xc0,0X20,0x01);
w_ram(0xc1,0X20,0x01);
w_ram(0xc2,0X20,0x01);
w_ram(0xc3,0X20,0x01);
w_ram(0xc4,0X20,0x01);
w_ram(0xc5,0X20,0x01);
w_ram(0xc6,0X20,0x01);
w_ram(0xc7,0X20,0x01);
w_ram(0x88,0X20,0x01);
w_ram(0x89,0X20,0x01);
w_ram(0x8A,0X20,0x01);
w_ram(0x8B,0X20,0x01);
w_ram(0x8C,0X20,0x01);
w_ram(0x8D,0X20,0x01);
w_ram(0x8E,0X20,0x01);
w_ram(0x8F,0X20,0x01);
w_ram(0xc8,0X20,0x01);
w_ram(0xc9,0X20,0x01);
w_ram(0xcA,0X20,0x01);
w_ram(0xcB,0X20,0x01);
w_ram(0xcC,0X20,0x01);
w_ram(0xcD,0X20,0x01);
w_ram(0xcE,0X20,0x01);
w_ram(0xcF,0X20,0x01);
d1ms(255);
l0=0x20;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x30;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0x40;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x50;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0x60;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x70;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xa0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xb0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xc0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xd0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xe0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xf0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序没问题,看是不是连线错了.或者液晶坏了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
write_com,write_date函数里面没有对wr赋值啊。WR是决定写入还是读出的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询