|
|
仿真過后,出現(xiàn)這樣的情況,是不是判忙函數(shù)出了問題,導(dǎo)致一直處于在忙狀態(tài)。
附件為 仿真電路圖
還是不行.png (57.25 KB, 下載次數(shù): 62)
下載附件
2018-10-25 22:32 上傳
下載:
已改好的仿真圖10.25-22.27.rar
(21.31 KB, 下載次數(shù): 271)
2018-10-25 22:34 上傳
點(diǎn)擊文件名下載附件
單片機(jī)源程序:
- #include "1602.h"
- #include "delay.h"
- xdata LCD_Type LCD; //LCD設(shè)備
- static void LCD_CheckBusy(void) //檢測LCD狀態(tài),看它是不是還在忙呢
- {
- 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;
- }
- /*---------------------光標(biāo)設(shè)置函數(shù)-------------------------*/
- static void LCD_Pos(unsigned char pos) //寫入的是實(shí)際的地址
- {
- if(pos>31) //光標(biāo)地址0-31 共32個(gè)
- return;
- /*----------------------------------------------------------*/
- if(pos<16) //第一行
- {
- LCD_SendCommand(0x80+pos);
- }
- else //第二行
- {
- LCD_SendCommand(0xC0+pos-16);
- }
- }
- //add 0-31對應(yīng)兩行
- //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;
- /*------------------閃爍設(shè)置---------------------------*/
- if(LCD.BlinkEN) //如果閃爍開關(guān)打開
- {
- LCD.BlinkCon++;
- if(LCD.BlinkCon==1)
- {
- LCD_Pos(LCD.BlinkAdd); //設(shè)置地址
- 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++) //從閃爍開始的地址就不要寫數(shù)據(jù)了
- {
- /*-------------------換行------------------------------*/
- if(i==16)
- LCD_Pos(16);
- /*-------------------閃爍功能打開并且到了開始閃爍的地址----------------------------------*/
- if((LCD.BlinkEN)&&(i==LCD.BlinkAdd)) //跳過LCD.BlinkLen個(gè)顯示地址
- {
- 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 //時(shí)分秒
- void LCD_DisplayTime(unsigned char add,unsigned char *time)
- {
- LCD.RefFlag =0;
- /*-------------小時(shí)----------------------*/
- 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;
- }
- /*----------------------------年月日顯示顯示函數(shù)-------------------------------------*/
- void LCD_DisplayDate(unsigned char add,unsigned char *date)
- {
- LCD.RefFlag =0;
- /*-------------小時(shí)----------------------*/
- 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的時(shí)候不隱藏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);
- }
- //溫度顯示函數(shù)
- void TempDisplay(unsigned char add,float Temp)
- {
- unsigned char DisBuff[8]={0,0,0,0,0};
- unsigned int Change = 0;
- Change = 10*Temp; //溫度數(shù)據(jù)放大10倍 102.8 1028
- DisBuff[0] = Change / 1000+'0'; //百位
- DisBuff[1] = Change % 1000 / 100+'0'; //十位
- DisBuff[2] = Change % 100 / 10+'0'; //個(gè)位
- 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);
- }
復(fù)制代碼
|
|