找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1009|回复: 0
收起左侧

这段单片机代码,为什么SelectScreen()只在清屏函数里调用过,还会影响显示?

[复制链接]
ID:230742 发表于 2021-4-22 15:58 | 显示全部楼层 |阅读模式
在整个工程里,SelectScreen()只在清屏函数里调用了,为什么也会影响后面的显示?
请各位老师帮我看看。

单片机源程序如下:
#ifndef __19264KS0107_H_
#define __19264KS0107_H_
#define uchar unsigned char  //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
#define uint unsigned int    //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535
/*定义19264液晶屏数据线—————————————————————————————————————————*/
#define Bus_Port P0    // 数据D0~D7
sbit LCD_RS  = P2^6;          // 数据=高,指令=低
sbit LCD_RW  = P2^5;          // 读=高,写=低
sbit LCD_EN  = P2^4;          // 读\写使能
sbit LCD_CS1 = P2^3;          // 片选1
sbit LCD_RST = P2^2;         // 液晶复位,低电平复位
sbit LCD_CS2 = P2^1;          // 片选2
sbit LCD_CS3 = P2^0;          // 片选3
/*写数据————————————————————————————————————————————————————*/
void Write19264_data(uchar dat)
{
        LCD_RS=1;
        LCD_RW=0;
        Bus_Port=dat;
        LCD_EN=1;
        LCD_EN=0;
}
/*写指令———————————————————————————————————————————————*/
void Write19264_com(uchar com)
{                 
        LCD_RS=0;
        LCD_RW=0;  
        Bus_Port=com;
        LCD_EN=1;
        LCD_EN=0;
}
/*选择屏幕,screen: =0左屏;=1中屏;—————————————————————————————————————*/
void SelectScreen(uchar screen)
{
        switch(screen)
        {   
                case 0: LCD_CS1=0; LCD_CS2=1; LCD_CS3=1; break;                 //左屏
                 case 1: LCD_CS1=1; LCD_CS2=0; LCD_CS3=1; break;                 //中屏
            case 2: LCD_CS1=1; LCD_CS2=1; LCD_CS3=0; break;                 //右屏        
        }
}
/*设定行地址(页面)--X=0-7———————————————————————————————————————————————*/
void SetLine(uchar Line)
{
        Line=Line & 0x07;           //0<=line<=7
        Line=Line | 0xb8;           //1011 1xxx
        Write19264_com(Line);                //向LCD发送命令
}
/*清屏函数,screen: =0左屏;=1中屏;=2右屏——————————————————————————————————————————————————————*/
void ClearScreen(uchar screen)
{
        uchar i,j;
        SelectScreen(screen);
        for(i=0;i<8;i++)
        {
                SetLine(i);
                for(j=0;j<64;j++)
                {
                        Write19264_data(0x00);
                }
        }        
}
/********************液晶片选并返回列地址***************************/
uchar LCD19264_PX(uchar add)
{
         uchar ZZY;  //ZZY代表左中右意思
         ZZY = add/64;
         if(ZZY==0){LCD_CS1=0;} else LCD_CS1=1;//片选左屏
         if(ZZY==1){LCD_CS2=0;} else LCD_CS2=1;//片选中屏
         if(ZZY==2){LCD_CS3=0;} else LCD_CS3=1;//片选左屏
         return(add-ZZY*64);                   //返回在哪片小屏上的列开始写               
}
/*初始化LCD函数———————————————————————————————————————————————————*/
void Init19264LCD(void)
{
        uchar i;
        LCD_RST=0;                                    //液晶复位
        Delay_ms(10);
        LCD_RST=1;
        for (i=0;i<3;i++)
        {
                LCD19264_PX(i);            //选择左中右屏
                ClearScreen(i);                  //清除左中右屏显示
        }
        Write19264_com(0x3f);        //操作完毕开显示
}
/***********************************************************************
函数功能:指定位置显示8*16的字符               
colcol列0~23,page行0~3   fb带表反白显示,fb=非0是反白显示,fb=0正常显示
************************************************************************/
void Disp_8x16(uchar col,uchar page,uchar fb,uchar code *cn)
        {                             
                uchar i,j,xpcol,page1;     
                xpcol =LCD19264_PX(col*8); //求出在哪片小屏上的列开始写        
                page1=page*2;         
                for(i=0;i<2;i++)
                        {
                                Write19264_com(0xb8+page1+i);        
                                Write19264_com(0x40+xpcol);
                                for(j=0;j<8;j++)
                                        {
                                                        if(fb)  //如果f非0,则反白显示。
                                                        {
                                                                Write19264_data(~(cn[i*8+j]));
                                                        }
                                                        else   //否则正常显示
                                                        {
                                                                Write19264_data(cn[i*8+j]);
                                                        }
                                        }        
                        }                        
         }
void main()

{
        Init19264LCD(); //19264屏初始化LCD函数
  while(1)
{
         /************说明*********************/
         /*例如:Disp_8x16(0,0,1,ZM_8x16[0]);
           括号第1个数指那一列开始
           括号第2个数指那一行开始
           括号第3个数指 0不反色显示 1反色显示
           括号第4个数指 字库要显示的字或符号*/
         
         Disp_8x16(0,0,1,ZM_8x16[0]); //0
         Disp_8x16(1,0,1,ZM_8x16[1]); //1
     Disp_8x16(2,0,1,ZM_8x16[2]); //2
         Disp_8x16(3,0,1,ZM_8x16[3]); //3
         Disp_8x16(4,0,1,ZM_8x16[4]); //4
         Disp_8x16(5,0,1,ZM_8x16[5]); //5
         Disp_8x16(6,0,1,ZM_8x16[6]); //6
         Disp_8x16(7,0,1,ZM_8x16[7]); //7
         
         Disp_8x16(20,0,1,ZM_8x16[8]); //8
         Disp_8x16(21,0,1,ZM_8x16[9]); //9

}}
主函数只有最后两行在右屏有显示。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表