|
仿真过后,出现这样的情况,是不是判忙函数出了问题,导致一直处于在忙状态。
附件为 仿真电路图
下载:
已改好的仿真图10.25-22.27.rar
(21.31 KB, 下载次数: 271)
单片机源程序:
- #include "1602.h"
- #include "delay.h"
- xdata LCD_Type LCD; //LCD设备
- static void LCD_CheckBusy(void) //检测LCD状态,看它是不是还在忙呢
- {
- do
- {
- LCD_EN=0;
- LCD_RS=0;
- LCD_RW=1;
- LCDIO=0xff;
- LCD_EN=1;
- }
- while(LCD_BUSY==1);
- LCD_EN=LOW;
- }
- static void LCD_SendCommand(unsigned char command)
- {
- LCD_CheckBusy();
- LCD_RS=LOW;
- LCD_RW=LOW;
- LCD_EN=HIGH;
- LCDIO=command;
- LCD_EN=LOW;
- }
- static void LCD_SendData(unsigned char dat)
- {
- LCD_CheckBusy();
- LCD_RS=HIGH;
- LCD_RW=LOW;
- LCD_EN=HIGH;
- LCDIO=dat;
- LCD_EN=LOW;
- }
- /*---------------------光标设置函数-------------------------*/
- static void LCD_Pos(unsigned char pos) //写入的是实际的地址
- {
- if(pos>31) //光标地址0-31 共32个
- return;
- /*----------------------------------------------------------*/
- if(pos<16) //第一行
- {
- LCD_SendCommand(0x80+pos);
- }
- else //第二行
- {
- LCD_SendCommand(0xC0+pos-16);
- }
- }
- //add 0-31对应两行
- //void LCD_DisPlayChar(unsigned char add,unsigned char ch)
- //{
- //LCD.RefFlag = 0;
- //LCD.Buf[add]=ch;
- //LCD.RefFlag = 1;
- //}
- void LCD_DisplayString(unsigned char add,unsigned char *str)
- {
- unsigned char i;
- LCD.RefFlag = 0;
- i = 0;
- while(*str)
- {
- LCD.Buf[add+i]=*str;
- str++;
- i++;
- }
- LCD.RefFlag = 1;
- }
- void LCD_ScreenClear(void)
- {
- unsigned char i = 0;
- LCD.RefFlag = 0;
- for(i=0;i<32;i++)
- {
- LCD.Buf[i]=' ';
- }
- LCD.RefFlag = 1;
- }
- void LCD_Init(void)
- {
- LCD_SendCommand(0x38);
- LCD_SendCommand(0x38);
- LCD_SendCommand(0x38);
- LCD_SendCommand(0x06);
- LCD_SendCommand(0x0c);
- LCD_SendCommand(0x01);
- LCD.BlinkEN = 0;
- LCD.BlinkAdd = 0;
- LCD.BlinkLen = 1;
- LCD.BlinkCon = 0;
- LCD_ScreenClear();
- }
- void LCD_Refresh(void)
- {
- unsigned char i=0;
- /*------------------闪烁设置---------------------------*/
- if(LCD.BlinkEN) //如果闪烁开关打开
- {
- LCD.BlinkCon++;
- if(LCD.BlinkCon==1)
- {
- LCD_Pos(LCD.BlinkAdd); //设置地址
- for(i=0;i<LCD.BlinkLen;i++)
- {
- if(LCD.BlinkAdd+i==16)
- LCD_Pos(16);
- LCD_SendData(0x20); //隐藏显示
- }
- }
- else if(LCD.BlinkCon==10) //开启显示
- {
- LCD_Pos(LCD.BlinkAdd);
- for(i=0;i<LCD.BlinkLen;i++)
- {
- if(LCD.BlinkAdd+i==16)
- LCD_Pos(16);
- LCD_SendData(LCD.Buf[LCD.BlinkAdd+i]); //显示缓存直接写入
- }
- }
- else if(LCD.BlinkCon>=20)
- {
- LCD.BlinkCon = 0;
- LCD.RefFlag = 1;
- }
- }
- /*-----------------LCD刷新显示----------------------------*/
- if(LCD.RefFlag ==1) //有待刷新
- {
- LCD_Pos(0);
- for(i=0;i<32;i++) //从闪烁开始的地址就不要写数据了
- {
- /*-------------------换行------------------------------*/
- if(i==16)
- LCD_Pos(16);
- /*-------------------闪烁功能打开并且到了开始闪烁的地址----------------------------------*/
- if((LCD.BlinkEN)&&(i==LCD.BlinkAdd)) //跳过LCD.BlinkLen个显示地址
- {
- do
- {
- i++;
- }
- while(i<(LCD.BlinkAdd+LCD.BlinkLen)); // 0 1
- LCD_Pos(LCD.BlinkAdd+LCD.BlinkLen+1);
- }
- else //正常模式写入
- {
- LCD_SendData(LCD.Buf[i]);
- }
- }
- LCD.RefFlag =0;
- }
- }
- //显示地址Add:0-31 *time //时分秒
- void LCD_DisplayTime(unsigned char add,unsigned char *time)
- {
- LCD.RefFlag =0;
- /*-------------小时----------------------*/
- LCD.Buf[add+0] = time[0]/10+'0';
- LCD.Buf[add+1] = time[0]%10+'0';
- LCD.Buf[add+2] = ':';
- LCD.Buf[add+3] = time[1]/10+'0';
- LCD.Buf[add+4] = time[1]%10+'0';
- LCD.Buf[add+5] = ':';
- LCD.Buf[add+6] = time[2]/10+'0';
- LCD.Buf[add+7] = time[2]%10+'0';
- LCD.RefFlag = 1;
- }
- /*----------------------------年月日显示显示函数-------------------------------------*/
- void LCD_DisplayDate(unsigned char add,unsigned char *date)
- {
- LCD.RefFlag =0;
- /*-------------小时----------------------*/
- LCD.Buf[add+0] = '2';
- LCD.Buf[add+1] = '0';
- LCD.Buf[add+2] = date[0]/10+'0'; //年
- LCD.Buf[add+3] = date[0]%10+'0';
- LCD.Buf[add+4] = '-';
- LCD.Buf[add+5] = date[1]/10+'0'; //月
- LCD.Buf[add+6] = date[1]%10+'0';
- LCD.Buf[add+7] = '-';
- LCD.Buf[add+8] = date[2]/10+'0'; //日期
- LCD.Buf[add+9] = date[2]%10+'0';
- LCD.Buf[add+10]= 0x20;
- switch(date[3])
- {
- case 1:{LCD_DisplayString(add+11,"Mon");}break;
- case 2:{LCD_DisplayString(add+11,"Tue");}break;
- case 3:{LCD_DisplayString(add+11,"Wed");}break;
- case 4:{LCD_DisplayString(add+11,"Thu");}break;
- case 5:{LCD_DisplayString(add+11,"Fri");}break;
- case 6:{LCD_DisplayString(add+11,"Sat");}break;
- case 7:{LCD_DisplayString(add+11,"Sun");}break;
- default:break;
- }
- LCD.RefFlag = 1;
- }
- void DisplayU16(unsigned char add,unsigned int num,unsigned char hide) //hide =1 隐藏0 =0的时候不隐藏0
- {
- xdata unsigned char temp[6]={0};
- unsigned char i = 0;
- for(i=0;i<5;i++)
- {
- temp[4-i]= num % 10 +'0';
- num = num / 10;
- }
- temp[5]='\0';
- if(hide)
- {
- for(i=0;i<4;i++)
- {
- if(temp[i]=='0')
- temp[i]=0x20;
- else
- break;
- }
- }
- LCD_DisplayString(add,temp);
- }
- //温度显示函数
- void TempDisplay(unsigned char add,float Temp)
- {
- unsigned char DisBuff[8]={0,0,0,0,0};
- unsigned int Change = 0;
- Change = 10*Temp; //温度数据放大10倍 102.8 1028
- DisBuff[0] = Change / 1000+'0'; //百位
- DisBuff[1] = Change % 1000 / 100+'0'; //十位
- DisBuff[2] = Change % 100 / 10+'0'; //个位
- DisBuff[3] = '.';
- DisBuff[4] = Change % 10+'0';
- if(DisBuff[0]=='0') //百位消0
- {
- DisBuff[0] = 0x20;
- if(DisBuff[1]=='0')
- { DisBuff[1]= 0x20; }
- }
- DisBuff[5]=0xdf,
- DisBuff[6]=0x43;
- DisBuff[7]='\0';
- LCD_DisplayString(add,DisBuff);
- }
复制代码
|
|