现在正在做的设计的一部分-------------用S52和1602液晶做的可进行设置的多级菜单

2020-01-27 11:29发布

原理图:点击此处下载ourdev_222975.rar(文件大小:5K)
程序由于是系统的一部分,就直接贴出来了

实物图:
1
硬件是我做的89S52的单片机系统,然后把连线改成跟上附的原理图一样。

效果图:顺序对应下面程序里的 工作流程的 1~6级子菜单
1
2
3
4
5
6
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
39条回答
shrlyq
2020-01-27 20:43
文件名:lcm.h

#define Lcd1602CmdPort XBYTE[0x0000]    //E=1 RS=0 RW=0
#define Lcd1602WdataPort XBYTE[0x0100]  //E =1 RS=1 RW=0
#define Lcd1602StatusPort XBYTE[0x0200] //E=1 RS=0 RW=1
#define Busy 0x80                       // 忙判别位

void LcdWriteCommand(unsigned char CMD,unsigned char AttribC);
void LcdWriteData(char dataW)reentrant;
void LcdReset(void);
void DispOneChar(unsigned char x,unsigned char y,unsigned char Wdata)reentrant;
void Delay400Ms(void);                                         
void Delay5Ms(void);

void LcdWriteCommand(unsigned char CMD,unsigned char AttribC)
{
        if(AttribC)
        {
                while(Lcd1602StatusPort & Busy);
        }
        Lcd1602CmdPort = CMD;
}

void LcdWriteData( char dataW )reentrant
{
        while( Lcd1602StatusPort & Busy );                // 检测忙信号
        Lcd1602WdataPort = dataW;
}

void Delay5Ms(void)                                            //短延时
{
        unsigned int i = 5552;
        while(i--)_nop_();
}

void Delay400Ms(void)                                   //长延时
{
        unsigned char i = 5;
        unsigned int j;
        while(i--)
        {
                j=7269;     
                while(j--)
                {
                        _nop_();
                }
        };
}

void LocateXY(char posx,char posy)reentrant
{  
        unsigned char temp;       
        temp = posx & 0x0f;
        posy &= 0x01;
        if ( posy )temp |= 0x40;
        temp |= 0x80;
        LcdWriteCommand(temp,0);
}

void DispOneChar(unsigned char x,unsigned char y,unsigned char Wdata)reentrant
{
        LocateXY(x, y);                       // 定位显示地址
        LcdWriteData(Wdata);                  // 写字符
}

void LcdReset( void )
{  
        LcdWriteCommand( 0x38, 0);            // 显示模式设置(不检测忙信号)
        Delay5Ms();
        LcdWriteCommand( 0x38, 0);            // 共三次
        Delay5Ms();
        LcdWriteCommand( 0x38, 0);
        Delay5Ms();
       
        LcdWriteCommand( 0x38, 1);            // 显示模式设置(以后均检测忙信号)
        LcdWriteCommand( 0x08, 1);            // 显示关闭
        LcdWriteCommand( 0x01, 1);            // 显示清屏
        LcdWriteCommand( 0x06, 1);            // 显示光标移动设置
        LcdWriteCommand( 0x0c, 1);            // 显示开及光标设置
}

void printx(unsigned char x,unsigned char y,unsigned char *ptr)reentrant
{
        LocateXY(x, y);                       // 定位显示地址
        while(*ptr++!='')
        {
                LcdWriteData(*(ptr-1));
        }
}

一周热门 更多>