单片机/MCU论坛
直播中

暗夜千羽

7年用户 23经验值
擅长:可编程逻辑 控制/MCU
私信 关注
[问答]

Proteus仿真,LCD1602只亮不显示

proteus 仿真程序,结果1602 只亮不显示,数据端全处于高位。
仿真.png
LCD子程序如下(仿真proteus文件在附件):
#include"LCD1602.h"
#include"delay.h"
xdata LCD_Type  LCD;


static void LCD_CheckBusy(void)
{
        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)
                return;

        if(pos<16)
        {
                LCD_SendCommand(0x80+pos);
                }
                else
                {
                        LCD_SendCommand(0xC0+pos-16);
                        }
   }

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=' ';
                }
                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
                        {
                                if(LCD.BlinkAdd+i==16)
                                        LCD_Pos(16);
                                LCD_SendData(0x20);
                                }
                                }
                                else if(LCD.BlinkCon==10)
                                {
                                        LCD_Pos(LCD.BlinkAdd);
                                        for(i=0;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;
                                                        }
                                }


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))
                {
                        do
                        {
                                i++;
                                }
                                while(i<(LCD.BlinkAdd+LCD.BlinkLen));
                                LCD_Pos(LCD.BlinkAdd+LCD.BlinkLen+1);
                        }
                        else
                        {
                                LCD_SendData(LCD.Buf);
                                }
                                }
                                LCD.RefFlag=0;
                                }
                                }

//时分秒
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)

{
        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]='';
        if(hide)
        {
                for(i=0;i<4;i++)
                {       
                        if(temp=='0')
                                temp=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;
        DisBuff[0] = Change / 1000+'0';
        DisBuff[1] = Change %1000 /100 +'0';
        DisBuff[2] = Change %100 /100 +'0';
        DisBuff[3] = '.';
        DisBuff[4] = Change %10 +'0';
       
        if(DisBuff[0]=='0')
        {
                DisBuff[0] = 0x20;
                if(DisBuff[1] == '0')
                {
                        DisBuff[1] = 0x20;
                        }
                }
                DisBuff[5] = 0xdf;
                DisBuff[6] = 0x43;
                DisBuff[7] = '';
                LCD_DisplayString(add,DisBuff);
                }


-------主函数部分---------
void main(void)
{
        delay_1ms(100);
        LCD_Init();
        TimerInit();
        PageInit();
        DataLoad();
        //EX0Init();
        while(1)
        {
                ModeDisplay();
                DS1302_Read();
                PageDisplay();
                GetTemp();
                GetLight();
                Lan_Sever();
                LanControl();
                TimeControl();
                TempLightControl();
                LCD_Refresh();
                delay_1ms(50);
                                }
                }

























  • 截错图了.png

回帖(2)

暗夜千羽

2018-10-25 12:01:49
截错图了,应该是这个
举报

朱权

2018-10-25 18:34:39
三个电阻串联部分:最上面的是阻容电路,利用电容充电升压原理,最下面电阻是分压。刚上电瞬间电容短路
举报

更多回帖

×
20
完善资料,
赚取积分