这是我写的LCD1602程序,帮帮忙为什么只显示一排方块
时间:10-02
整理:3721RD
点击:
程序在Proteus上仿真是正确的,但是烧到单片机上只显示一排方块,第二行连方块也不显示。请问是什么问题?初步判断不是电路问题。
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define DATE_IO P0//P0口并行传输数据
- sbit EOCADC=P2^1;
- sbit ALEADC=P3^5;
- sbit ENADC=P2^2;
- sbit STARTADC=P2^0;//START与ALE相连
- sbit CLKADC=P2^4;
- sbit RSLCD=P2^5;
- sbit RWLCD=P2^3;
- sbit ENLCD=P2^6;
- sbit SGBJING=P2^7;
- uchar getdata=0;//转换后得到数据
- uchar qian,bai,shi,ge;
- uchar code table1[]="0123456789CO:ppm "; //0123456789CO:ppm
- uchar code table2[]="TEL:15226195907";
- void adc0809();
- void chufa();
- void inityejing();
- void write_command(uchar come);
- void write_date(uchar date);
- void delay(uint z);
- void delayus(unsigned int n);
- void delayms(uint i);
- void SPEAK();
- void alarm(uchar t);
- void initdingshi();
- void CHUANKOU(uchar);
- void main()
- {
- uchar t=0,ZJ=1,num;
- delayms(10);
- inityejing();//调用液晶初始化函数
- delayms(10);
- write_command(0x80+0x40);
- for(num=0;num<=14;num++)
- {
- write_date(table2[num]);
- }
- delayms(5);
- initdingshi();
- while(1)
- {
- delayms(20);
- adc0809();//启动0809转换,并得到转换后的结果
- delayms(50);
- chufa();
- delayms(20);
- if(getdata>=35)
- {
- delayms(1000);
- t=t+1;
- if(t>=20)
- {
- SPEAK();
- }
- }
- else
- t=0;
- }
- }
- //lcd初始化
- void inityejing() //液晶初始化函数
- {
- RWLCD=0; //低电平时进行写操作(高电平时进行读操作)
- ENLCD=0;
- write_command(0x38); //设置LCD两行显示,一个数据由5*7点阵表示,数据由8根线传输
- delayms(5);
- write_command(0x01); //清除屏幕显示
- delayms(5);
- write_command(0x06); //设定输入方式,增量不移位
- delayms(5);
- write_command(0x0c); //开整体显示,关光标,不闪烁
- delayms(5);
- }
- // ADC0809
- void adc0809() //启动0809转换,并得到转换后的结果
- {
- ALEADC=0;
- ALEADC=1;
- STARTADC=0; //以下三表达式表示启动A/D转换
- STARTADC=1;
- STARTADC=0;
- while(!EOCADC); //等待转换结束
- ENADC=1; //为高电平时,转换的数据输送个单片机
- getdata=P1; //从P1引脚读转换后的信息
- ENADC=0;
- }
- //数字拆开
- void chufa() //将各位数字拆开函数
- {
- bai=(getdata*2)/100; //求百位数字
- shi=(getdata*2)%100/10; //求十位数字
- ge=(getdata*2)%10; //求各位数字
- write_command(0x80); //设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移
- write_date(table1[16]);
- write_date(table1[16]);
- write_date(table1[16]);
- write_date(table1[10]); // 第一位显示C
- write_date(table1[11]); // 第二位显示O
- write_date(table1[12]); // 第三位显示:
- write_date(table1[bai]); //第四位显示百位
- write_date(table1[shi]); //第五位显示十
- write_date(table1[ge]); //第六位显示个
- write_date(table1[13]); //第七位显示p
- write_date(table1[14]); //显示p
- write_date(table1[15]); //第七位显示m
- delayms(80); //改变数值可以修改数字滚动的速度
- }
- //控制LCD1602的函数
- void write_command(uchar come)//写指令函数
- {
- RSLCD=0; //选择指令寄存器
- ENLCD=1; //由高电平跳变成低电平时,液晶执行命令
- DATE_IO=come;
- delayms(111);
- ENLCD=0;
- RSLCD=1;
- }
- void write_date(uchar date) //写数据函数
- {
- RSLCD=1; //选择数据寄存器
- ENLCD=1; //由高电平跳变成低电平时,液晶执行命令
- DATE_IO=date;
- delayus(5);
- ENLCD=0;
- RSLCD=0;
- }
- //延时
- void delayus(unsigned int n)
- {
- if(n==0)
- return ;
- while(--n);
- }
- void delayms(uint ms)
- {
- unsigned char a,b;
- for (a=ms;a>0;a--)
- for(b=110;b>0;b--);
- }
- //声光报警
- void SPEAK()
- {
- uchar t;
- delayms(50);
- SGBJING=0;
- for(t=50;t>24;t--)
- {
- alarm(30);
- delayms(t*90);
- }
- while(1)
- {
- alarm(30);
- delayms(200);
- }
- }
- void alarm(uchar t) //产生50个周期为2t的波形
- {
- uchar i,j;
- for(i=0;i<50;i++)
- {
- SGBJING=~SGBJING;
- for(j=0;j<t;j++)
- ;
- }
- }
- void initdingshi()//初始化定时器0模式2(主要是为了给0809提供时钟)
- {
- TMOD=0x02;//定时器0的模式2
- TH0=0xfb;//定时5us
- TL0=0xfb;
- TR0=1;//启动定时器0
- ET0=1;//开定时器0中断控制位
- EA=1;//开总中断
- }
- void time0() interrupt 1//定时器0中断
- {
- CLKADC=~CLKADC;
- }
我的也是第一行只显示方块
问一下:uchar code table1[]="0123456789CO:ppm "; //0123456789CO:ppm
uchar code table2[]="TEL:15226195907" 这个是什么来的,不是用十六进制表示的0到9吗?
是不是你电阻没调好,
问题决解了吗,我的也是一样,不知道怎么弄