为什么我下载别人的程序,可以正常显示,然后把一些我不需要的东西删了只要初始化以及主函数,就不能正常显示了,主函数里面我加了while(1);的话就显示不出来,原本程序是可以的,不加while(1)的话能显示,但是数据一直在闪。下边的程序是网上的程序的初始化,都差不多的,是不是我删多了什么?
- //端口定义
- sbit LCD_CS=P2^4;
- sbit LCD_SID=P2^5; //串行数据线
- sbit LCD_SCLK=P2^6; //串上时钟输入
- sbit PSB=P2^7;
- uchar code a[]={"LCD12864"}; //定义要显示的字符串
-
- /**************************************/
- //延时函数
- /**************************************/
- void Delay_nms(uchar n)
- {
- uchar i;
- uchar j;
- for(i=0;i<n;i++)
- for(j=0;j<125;j++) //大概1ms
- _nop_();
- }
- /**************************************/
- //串行发送一个字节
- /**************************************/
- void LCD_sendbyte(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD_SCLK=0; //拉低时钟线
- _nop_();
- LCD_SID=(bit)(byte&0x80); //发送最高位数据
- LCD_SCLK=1; //上升沿发送数据
- byte=byte<<1; //左移一位
- }
- }
- /****************************************/
- //写指令
- /****************************************/
- void LCD_write_com(uchar com)
- {
- LCD_CS=1;
- LCD_sendbyte(0xf8); //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(0),0
- LCD_sendbyte(0xf0&com); //取高四位,数据分两次传送,
- //每个字节的内容被送入两个字节
- //高四位放在第一个字节的高四位
- LCD_sendbyte(0xf0&(com<<4)); //低四位放在第二个字节的高四位
- LCD_CS=0;
- Delay_nms(10); //串行不支持读操作,不可检测忙操作,这里用延时替代
- }
- /******************************************/
- //写数据
- /******************************************/
- void LCD_write_dat(uchar dat)
- {
- LCD_CS=1;
- LCD_sendbyte(0xfa); //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(1),0
- LCD_sendbyte(0xf0&dat); //取高四位,数据分两次传送,
- //每个字节的内容被送入两个字节
- //高四位放在第一个字节的高四位
- LCD_sendbyte(0xf0&(dat<<4)); //低四位放在第二个字节
- LCD_CS=0;
- Delay_nms(10);
- }
- /********************************************/
- //LCD初始化
- /********************************************/
- void LCD_init(void)
- { PSB=0;
- LCD_write_com(0x30); //选择基本指令集
- LCD_write_com(0x0c); //开显示,无游标,不反白
- LCD_write_com(0x01); //清除显示屏幕,把DDRAM位址计数器调整为00H
- Delay_nms(5); //清屏操作时间较长1.6ms 因此加此延时
- LCD_write_com(0x02); //清DDRAM位址归位,此处貌似与清屏重复
- LCD_write_com(0x06); //设定光标右移,整体显示不移动
- }
- /*************************************************/
- //显示字符串
- /*************************************************/
- void print(uchar *s)
- {
- while(*s!=' ')
- {
- LCD_write_dat(*s);
- s++;
- }
- }
- /***************************************************/
- //设置显示地址
- /***************************************************/
- void LCD_Setaddress(uchar x,uchar y)
- { //地址从第1行第1列开始不从0开始
- uchar addr;
- switch(x)
- {
- case 1: addr=0x80+y-1;
- break;
- case 2: addr=0x90+y-1;
- break;
- case 3: addr=0x88+y-1;
- break;
- case 4: addr=0x98+y-1;
- break;
- default : break;
- }
- LCD_write_com(addr); //字符显示开始地址
- }
- /*****************************************************/
- //让字符串显示在固定位置
- /*****************************************************/
- void LCD_Putstring( uchar x, uchar y, uchar *pData )
- {
- LCD_Setaddress(x,y);
- while( *pData != ' ' )
- {
- LCD_write_dat( *pData++ );
- }
- }
- /******************************************************/
- //主函数
- //用于观看显示效果
- /******************************************************/
- void main(void)
- {
- LCD_init();
- LCD_Setaddress(2,3);
- print("你好");
- LCD_Putstring(3,3,a);
- while(1); //加了这个我就显示不出来,但是原有程序有这个能正常显示的
- }
复制代码
是不是因为没有while(1);main函数程序一直在初始化lcd,所以就一闪一闪的。那为什么加了while就不显示了
已经试了很多个程序了,都是大同小异的初始化,但是还是只要我删了while(1);就能够显示了。会是硬件问题吗?
是硬件问题,我把灰度的电位器拆了就正常了。因为原本我接的滑变调到头了才有显示的,可能程序在加入while()死循环后,要调滑变才能显示,但我已经调不了了。所以,还是得多从自己的硬件找原因
这个如果软件没有问题 或是定型的数据 先检查硬件才是王道
一周热门 更多>