找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 647|回复: 8
收起左侧

请教网友我在本站下载网友的LCD19264C51例程改STC8H不显示该怎么修改

[复制链接]
ID:303735 发表于 2025-10-7 22:19 | 显示全部楼层 |阅读模式
/*系统头文件--------------------------------------------------------------------*/
#include <reg52.h>           //此文件中定义了单片机的一些特殊功能寄存器
#include "Delay.h"           //全局通用延时头文件
#include "19264ks0107ZK.h"   //19264屏字库
#include "19264ks0107.h"     //19264屏驱动

//#define uchar unsigned char  //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
//#define uint unsigned int    //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535


/*主函数--------------------------------------------------------------------*/
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(8,0,1,ZM_8x16[8]); //8
         Disp_8x16(9,0,1,ZM_8x16[9]); //9
         
         Disp_8x16(11,0,0,ZM_8x16[10]); //A
         Disp_8x16(12,0,0,ZM_8x16[11]); //B
         Disp_8x16(13,0,0,ZM_8x16[12]); //C
         Disp_8x16(14,0,0,ZM_8x16[13]); //D
         Disp_8x16(15,0,0,ZM_8x16[14]); //E
         Disp_8x16(16,0,0,ZM_8x16[15]); //F
   Disp_8x16(17,0,0,ZM_8x16[16]); //G
         Disp_8x16(18,0,0,ZM_8x16[17]); //H
         Disp_8x16(19,0,0,ZM_8x16[18]); //I
         Disp_8x16(20,0,0,ZM_8x16[19]); //J
         Disp_8x16(21,0,0,ZM_8x16[20]); //K
         Disp_8x16(22,0,0,ZM_8x16[21]); //L
         Disp_8x16(23,0,0,ZM_8x16[22]); //M
         
         Disp_16x32(0,8,0,ZM_16x32[2]); //2
         Disp_16x32(1,8,0,ZM_16x32[0]); //0
         Disp_16x32(2,8,0,ZM_16x32[2]); //2
         Disp_16x32(3,8,0,ZM_16x32[1]); //1
         
         Disp_32x32(2,2,0,ZM_32x32[0]); //心
         Disp_32x32(3,2,0,ZM_32x32[1]); //想
         Disp_32x32(4,2,0,ZM_32x32[2]); //事
         Disp_32x32(5,2,0,ZM_32x32[3]); //成
         
         
         Disp_16x16(0,3,0,ZM_16x16[0]); //新
         Disp_16x16(1,3,0,ZM_16x16[1]); //年
         Disp_16x16(2,3,0,ZM_16x16[2]); //快
         Disp_16x16(3,3,0,ZM_16x16[3]); //乐
         Disp_16x16(4,3,0,ZM_16x16[4]); //!
         
         Disp_16x16(5,3,1,ZM_16x16[9]); //福
         
         Disp_16x16(7,3,0,ZM_16x16[5]); //身
         Disp_16x16(8,3,0,ZM_16x16[6]); //体
         Disp_16x16(9,3,0,ZM_16x16[7]); //健
         Disp_16x16(10,3,0,ZM_16x16[8]); //康
         Disp_16x16(11,3,0,ZM_16x16[4]); //!
         
}
}后面是我改的STC8H程序
/*系统头文件--------------------------------------------------------------------*/
//#include <stc8x.h>           //此文件中定义了单片机的一些特殊功能寄存器
#include "reg51.h"
#include "intrins.h"

#include "Delay.h"           //全局通用延时头文件
#include "19264ks0107ZK.h"   //19264屏字库
#include "19264ks0107.h"     //19264屏驱动

//#define uchar unsigned char  //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
//#define uint unsigned int    //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535
sfr     P0M0    =   0x94;
sfr     P0M1    =   0x93;
sfr     P1M0    =   0x92;
sfr     P1M1    =   0x91;
sfr     P2M0    =   0x96;
sfr     P2M1    =   0x95;
sfr     P3M0    =   0xb2;
sfr     P3M1    =   0xb1;
sfr     P4M0    =   0xb4;
sfr     P4M1    =   0xb3;
sfr     P5M0    =   0xca;
sfr     P5M1    =   0xc9;
sfr     P6M0    =   0xcc;
sfr     P6M1    =   0xcb;
sfr     P7M0    =   0xe2;
sfr     P7M1    =   0xe1;



/*主函数--------------------------------------------------------------------*/
void main()
{
       
    P0M0 = 0x00;                                //设置P0.0~P0.7为双向口模式
    P0M1 = 0x00;
    P1M0 = 0xff;                                //设置P1.0~P1.7为推挽输出模式
    P1M1 = 0x00;
    P2M0 = 0x00;                                //设置P2.0~P2.7双向模式
    P2M1 = 0x00;
    P3M0 = 0xff;                                //设置P3.0~P3.7为开漏模式
    P3M1 = 0xff;

        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(8,0,1,ZM_8x16[8]); //8
         //Disp_8x16(9,0,1,ZM_8x16[9]); //9
         
         //Disp_8x16(11,0,0,ZM_8x16[10]); //A
         //Disp_8x16(12,0,0,ZM_8x16[11]); //B
         //Disp_8x16(13,0,0,ZM_8x16[12]); //C
         //Disp_8x16(14,0,0,ZM_8x16[13]); //D
         //Disp_8x16(15,0,0,ZM_8x16[14]); //E
         //Disp_8x16(16,0,0,ZM_8x16[15]); //F
   //Disp_8x16(17,0,0,ZM_8x16[16]); //G
         //Disp_8x16(18,0,0,ZM_8x16[17]); //H
         //Disp_8x16(19,0,0,ZM_8x16[18]); //I
         //Disp_8x16(20,0,0,ZM_8x16[19]); //J
         //Disp_8x16(21,0,0,ZM_8x16[20]); //K
         //Disp_8x16(22,0,0,ZM_8x16[21]); //L
         //Disp_8x16(23,0,0,ZM_8x16[22]); //M
         
        // Disp_16x32(0,8,0,ZM_16x32[2]); //2
         //Disp_16x32(1,8,0,ZM_16x32[0]); //0
         //Disp_16x32(2,8,0,ZM_16x32[2]); //2
         //Disp_16x32(3,8,0,ZM_16x32[1]); //1
         
         //Disp_32x32(2,2,0,ZM_32x32[0]); //心
         //Disp_32x32(3,2,0,ZM_32x32[1]); //想
         //Disp_32x32(4,2,0,ZM_32x32[2]); //事
         //Disp_32x32(5,2,0,ZM_32x32[3]); //成
         
         
         //Disp_16x16(0,3,0,ZM_16x16[0]); //新
         //Disp_16x16(1,3,0,ZM_16x16[1]); //年
         //Disp_16x16(2,3,0,ZM_16x16[2]); //快
         //Disp_16x16(3,3,0,ZM_16x16[3]); //乐
         //Disp_16x16(4,3,0,ZM_16x16[4]); //!
         
         //Disp_16x16(5,3,1,ZM_16x16[9]); //福
         
         //Disp_16x16(7,3,0,ZM_16x16[5]); //身
         //Disp_16x16(8,3,0,ZM_16x16[6]); //体
         //Disp_16x16(9,3,0,ZM_16x16[7]); //健
         //Disp_16x16(10,3,0,ZM_16x16[8]); //康
         //Disp_16x16(11,3,0,ZM_16x16[4]); //!
         
}
}延时库也按照STC8的延时计算
#ifndef __DELAY_H_
#define __DELAY_H_

#define uchar unsigned char  //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
#define uint unsigned int    //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535

/*延时函数 Delay_ms(1)时大约1ms——————————————————————————————————————————————————————*/
void Delay_ms(uint ms)
//{
  //uchar t;
// while(ms--)
    //{
           // for(t = 110; t > 0; t --);
    //}
//}
//void Delay1ms(void)        //@11.0592MHz
{
        unsigned char data i, j;

        _nop_();
        i = 2;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
}


/*延时函数 Delay_us(1)时大约1us——————————————————————————————————————————————————————*/
/*void Delay_us(uint us)
{
   while(--us);
}*/

#endif
请教高手如何能在STC8上正确显示,谢谢指教!


STC8H51hei.zip

23.42 KB, 下载次数: 0

回复

使用道具 举报

ID:303735 发表于 2025-10-7 22:22 | 显示全部楼层
LCD19264驱动库没有作修改
#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 P2    // 数据D0~D7
sbit LCD_RS  = P0^5;          // 数据=高,指令=低
sbit LCD_RW  = P0^4;          // 读=高,写=低
sbit LCD_EN  = P0^3;          // 读\写使能
sbit LCD_CS1 = P0^2;          // 片选1
sbit LCD_RST = P0^6;         // 液晶复位,低电平复位
sbit LCD_CS2 = P0^1;          // 片选2
sbit LCD_CS3 = P0^0;          // 片选3

/*写数据——————————————————————————————————————————————————————————————————————————————————————*/
void Write19264_data(uchar dat)
{
        LCD_RS=1;
        LCD_RW=0;
        Bus_Port=dat;
        LCD_EN=1;
        _nop_();
        LCD_EN=0;
}

/*写指令——————————————————————————————————————————————————————————————————————————————————————*/
void Write19264_com(uchar com)
{                
        LCD_RS=0;
        LCD_RW=0;  
        Bus_Port=com;
        LCD_EN=1;
        _nop_();
        _nop_();
        LCD_EN=0;
  _nop_();
        _nop_();
}

/*选择屏幕,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]);
                                                        }
                                        }       
                        }                       
         }
         
/***********************************************************************
函数功能:指定位置显示16*16的字符                       
col列0~11,page页0~3   fb带表反白显示,fb=非0是反白显示,fb=0正常显示
************************************************************************/
void Disp_16x16(uchar col,uchar page,uchar fb,uchar code *cn)
        {                                
                uchar i,j,xpcol,page1;      
                xpcol=LCD19264_PX(col*16);    // 求出在哪片小屏上的列开始写       
                page1=page*2;
                for(i=0;i<2;i++)
                                {
                                        Write19264_com(0xb8+page1+i);               
                                        Write19264_com(0x40+xpcol);
                                        for(j=0;j<16;j++)
                                                {
                                                        if(fb)  //如果f非0,则反白显示。
                                                        {
                                                                Write19264_data(~(cn[i*16+j]));
                                                        }
                                                        else   //否则正常显示
                                                        {
                                                                Write19264_data(cn[i*16+j]);
                                                        }
                                                }                                       
                                }
                       
         }         

/***********************************************************************
函数功能:指定位置显示16*32的字符                       
col列0~11,page页0~16   fb带表反白显示,fb=非0是反白显示,fb=0正常显示
************************************************************************/
void Disp_16x32(uchar col,uchar page,bit fb,uchar code *cn)  
         {
            uchar i,n,xpcol;         
            n = page/4;                 
                  xpcol=LCD19264_PX(col*16);  // 求出在哪片小屏上的列开始写       
                  Write19264_com(0xb8+n);   
            Write19264_com(0x40+xpcol);      
                        for(i=0;i<64;i++)
                        {
                                        if(i==16)
                                        {
                                                n+=1;
                                                Write19264_com(0xb8+n);       
                                                Write19264_com(0x40+xpcol);       
                                        }
                                        else
                                        {
                                                if(i==32)
                                                {
                                                        n+=1;       
                                                        Write19264_com(0xb8+n);
                                                        Write19264_com(0x40+xpcol);
                                                }
                                                else
                                                if(i==48)
                                                {
                                                        n+=1;
                                                        Write19264_com(0xb8+n);
                                                        Write19264_com(0x40+xpcol);
                                                }
                                                else
                                                if(i==64)
                                                {
                                                        n+=1;
                                                        Write19264_com(0xb8+n);
                                                        Write19264_com(0x40+xpcol);
                                                }       
                                        }
                                        if(fb==1)
                                        {
                                                Write19264_data(~(cn[i]));
                                        }
                                        else
                                                Write19264_data(cn[i]);
                        }
         }         
         
/***********************************************************************
函数功能:指定位置显示32*32的字符                       
col列0~4,page页0~5   fb带表反白显示,fb=非0是反白显示,fb=0正常显示
************************************************************************/
void Disp_32x32(uchar col,uchar page,bit fb,uchar code *cn)
{                                 
          uchar i,xpcol;               
    xpcol=LCD19264_PX(col*32);    //求出在哪片小屏上的列开始写       
                Write19264_com(0xb8+page);
          Write19264_com(0x40+xpcol);
                        for(i=0;i<128;i++)
                        {
                                        if(i==32)
                                        {
                                                page+=1;
                                                Write19264_com(0xb8+page);       
                                                Write19264_com(0x40+xpcol);       
                                        }
                                        else
                                        {
                                                if(i==64)
                                                {
                                                        page+=1;       
                                                        Write19264_com(0xb8+page);
                                                        Write19264_com(0x40+xpcol);
                                                }
                                                else
                                                if(i==96)
                                                {
                                                        page+=1;
                                                        Write19264_com(0xb8+page);
                                                        Write19264_com(0x40+xpcol);
                                                }
                                                else
                                                if(i==128)
                                                {
                                                        page+=1;
                                                        Write19264_com(0xb8+page);
                                                        Write19264_com(0x40+xpcol);
                                                }       
                                        }
                                       
                                        if(fb==1)
                                        {
                                                Write19264_data(~(cn[i]));
                                        }
                                        else
                                                Write19264_data(cn[i]);
                        }
}         

#endif
回复

使用道具 举报

ID:584814 发表于 2025-10-9 08:20 | 显示全部楼层
在确保除单片机以外的硬件相同接法没问题且都是51单片机的情况下查延时。
回复

使用道具 举报

ID:59202 发表于 2025-10-18 20:33 | 显示全部楼层
楼主给的void Delay_ms(uint ms)延时函数根本编译不过,先把这个函数弄好再说,然后在控制 LCD_RS ,LCD_RW,LCD_EN,  LCD_CS1,  LCD_RST, LCD_CS2,  LCD_CS3每个引脚后再加上延时几ms。
回复

使用道具 举报

ID:1064915 发表于 2025-10-19 08:31 | 显示全部楼层
先用51试验,成功再换stc8
回复

使用道具 举报

ID:303735 发表于 2025-11-7 11:15 | 显示全部楼层
xxxevery 发表于 2025-10-18 20:33
楼主给的void Delay_ms(uint ms)延时函数根本编译不过,先把这个函数弄好再说,然后在控制 LCD_RS ,LCD_RW ...

确实是延时的问题,STC8比51快
回复

使用道具 举报

ID:303735 发表于 2025-11-7 11:16 | 显示全部楼层
man1234567 发表于 2025-10-9 08:20
在确保除单片机以外的硬件相同接法没问题且都是51单片机的情况下查延时。

是的硬件没毛病,就是STC8要延时才行
回复

使用道具 举报

ID:303735 发表于 2025-11-7 11:17 | 显示全部楼层
joyb 发表于 2025-10-19 08:31
先用51试验,成功再换stc8

51完全OK
回复

使用道具 举报

ID:1162659 发表于 2025-11-7 12:41 | 显示全部楼层
用51调试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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