durongze 发表于 2024-6-6 01:42:58

STC15W4K32S4 驱动st7920的例子谁有啊,最好是测试过可以用的。

STC15W4K32S4 驱动st7920的例子谁有啊?最好是测试过可以用的。
本人初学者,如果不是测过可以用的,我可能改不出来{:titter:}

soma 发表于 2024-6-6 06:32:21

你都有89c52的了,移植下很快的

angmall 发表于 2024-6-6 08:53:13

我给你来一个。

/*************        功能说明        **************

ST7920的基本驱动程序

******************************************/


#define         MAIN_Fosc                22118400UL        //定义主时钟

#include        "STC15Fxxxx.H"



sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
sbit        P_HC595_RCLK= P5^4;        //pin 12        RCLk        store (latch) clock
sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock

sbit        LCD_RS = P2^5;        //定义引脚
sbit        LCD_RW = P2^6;
sbit        LCD_E= P2^7;
sbit        PSB    = P2^4;                //PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
sbit        LCD_RESET        =        P2^3;        //        17---RESET        L-->Enable
#define        LCD_Data P0



#define Busy    0x80 //用于检测LCD状态字中的Busy标识
void        delay_ms(u16 ms);
void        DisableHC595(void);
void        WriteDataLCD(u8 WDLCD);
void        WriteCommandLCD(u8 WCLCD,BuysC);
u8                ReadDataLCD(void);
u8                ReadStatusLCD(void);
void        LCDInit(void);
void        LCDClear(void);
void        LCDFlash(void);
void        DisplayOneChar(u8 X, u8 Y, u8 DData);
void        DisplayListChar(u8 X, u8 Y, u8 code *DData);
void        DisplayImage (u8 code *DData);

u8code uctech[] = {"南通国芯微电子"};
u8code net[]    = {" www.gxwmcu.com "};
u8code mcu[]    = {"专业制造51单片机"};
u8code qq[]   = {" QQ: 800003751"};

        //128*64点阵图形数据
code u8 gImage_gxw = { /* 0X10,0X01,0X00,0X80,0X00,0X40, */
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X3F,0X03,0XF0,0X3F,0X03,0XF0,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0XC0,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X0C,0X00,0X18,0XFF,0XE0,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X08,0X1C,0X1C,0X1B,0X00,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X1F,0XFF,0XFE,0X0C,0X0E,0X00,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X0C,0X00,0X00,0X8C,0X60,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X04,0X0C,0X10,0X00,0XFF,0XF0,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X07,0XFF,0XF8,0X0C,0XCC,0X60,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X06,0X63,0X18,0X7E,0XCC,0X60,0X00,
0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X06,0X33,0X98,0X0C,0XFF,0XE0,0X00,
0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X06,0X32,0X18,0X0C,0XCC,0X60,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X05,0XD8,0X0C,0XCC,0X60,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0XFF,0X78,0X0C,0XFF,0XE0,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X08,0XD8,0X0C,0XCC,0X60,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XF8,0X0C,0XCC,0X60,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X0C,0XCF,0XE0,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X3E,0X80,0X40,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X73,0XC0,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0D,0XF0,0X20,0X7F,0XF8,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X30,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X18,0X01,0X84,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XFC,0X01,0XC6,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X58,0X01,0X86,0X30,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XD8,0X7F,0XFF,0XF8,0X00,
0X60,0X00,0XFD,0X1F,0XF0,0X7A,0X00,0X18,0X00,0X06,0X0C,0X18,0X01,0X86,0X00,0X00,
0X60,0X01,0X87,0X13,0X30,0XC6,0X00,0X18,0X00,0X06,0X0C,0X18,0X01,0X86,0X00,0X00,
0X60,0X03,0X03,0X33,0X11,0X83,0X00,0X18,0X00,0X06,0X0C,0X18,0X00,0X40,0X00,0X00,
0X60,0X03,0X03,0X03,0X01,0X83,0X00,0X18,0X00,0X06,0X0C,0XD8,0X00,0X30,0X00,0X00,
0X60,0X03,0X80,0X03,0X03,0X80,0X00,0X18,0X00,0X06,0XFF,0XF8,0X03,0X38,0X00,0X00,
0X60,0X01,0XC0,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0F,0X18,0X0B,0X98,0X80,0X00,
0X60,0X00,0X78,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0D,0X98,0X0B,0X18,0XC0,0X00,
0X60,0X00,0X1E,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0C,0XD8,0X1B,0X00,0X70,0X00,
0X60,0X00,0X07,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X1B,0X01,0X30,0X00,
0X60,0X00,0X03,0X03,0X03,0X80,0X00,0X18,0X00,0X06,0X0C,0XD8,0X3B,0X01,0X30,0X00,
0X60,0X03,0X03,0X03,0X03,0X83,0X00,0X18,0X00,0X07,0XF7,0XB8,0X33,0X01,0X80,0X00,
0X60,0X03,0X03,0X03,0X01,0X82,0X00,0X18,0X00,0X06,0X00,0X18,0X03,0X01,0X80,0X00,
0X60,0X01,0XC6,0X03,0X01,0XC6,0X00,0X18,0X00,0X07,0XFF,0XF8,0X01,0XFF,0X80,0X00,
0X60,0X01,0X7C,0X07,0XC0,0X7C,0X00,0X18,0X00,0X06,0X00,0X18,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X04,0X00,0X00,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X21,0X86,0X00,0X07,0X00,0X00,0X00,0X10,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X31,0X86,0X00,0X07,0X00,0X03,0XFF,0XF8,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X65,0X66,0X00,0X02,0X00,0X00,0X00,0X68,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0XC7,0X7C,0X00,0X02,0X08,0X00,0X00,0XC0,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X95,0X6C,0X41,0XFF,0XFC,0X00,0X03,0X80,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X19,0X3D,0X6F,0XE1,0X82,0X0C,0X00,0X0E,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X3E,0XE9,0XA1,0X82,0X0C,0X00,0X0E,0X00,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X60,0X59,0X81,0X82,0X0C,0X00,0X0C,0X0C,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X6F,0XFD,0X81,0XFF,0XFC,0X1F,0XFF,0XFE,
0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0XE0,0X15,0X81,0X82,0X0C,0X00,0X0C,0X02,
0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XA6,0X45,0X81,0X82,0X0C,0X00,0X0C,0X00,
0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0X27,0XC7,0X01,0X82,0X0C,0X00,0X0C,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X47,0X01,0XFF,0XFC,0X00,0X0C,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X5F,0X01,0X82,0X0B,0X00,0X0C,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X77,0X01,0X02,0X03,0X00,0X0C,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0XEF,0X80,0X02,0X03,0X00,0X0C,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X24,0X59,0XC0,0X02,0X03,0X00,0X0C,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X38,0X30,0XE0,0X03,0XFF,0X80,0X7C,0X00,
0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X38,0XE0,0X00,0X00,0X00,0X00,0X18,0X00,
0X00,0X3F,0X03,0XF0,0X3F,0X03,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};


void main(void)
{
        P0M1 = 0;        P0M0 = 0;        //设置为准双向口
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口
        P2M1 = 0;        P2M0 = 0;        //设置为准双向口
        P3M1 = 0;        P3M0 = 0;        //设置为准双向口
        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
        P5M1 = 0;        P5M0 = 0;        //设置为准双向口
        P6M1 = 0;        P6M0 = 0;        //设置为准双向口
        P7M1 = 0;        P7M0 = 0;        //设置为准双向口

        DisableHC595();                //禁止掉学习板上的HC595显示,省电

        delay_ms(100); //启动等待,等LCD讲入工作状态
        LCDInit(); //LCM初始化
        delay_ms(5); //延时片刻(可不要)
        while(1)
        {
                LCDClear();
                DisplayImage(gImage_gxw);//显示图形
                delay_ms(5000);
                LCDClear();
                DisplayListChar(0,1,uctech);        //显示字库中的中文数字
                DisplayListChar(0,2,net);                //显示字库中的中文数字
                DisplayListChar(0,3,mcu);                //显示字库中的中文
                DisplayListChar(0,4,qq);                //显示字库中的中文数字
                delay_ms(5000);
        }
}



//========================================================================
// 函数: voiddelay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
voiddelay_ms(u16 ms)
{
   u16 i;
       do{
              i = MAIN_Fosc / 13000;
                  while(--i)        ;   //14T per loop
   }while(--ms);
}

void DisableHC595(void)
{               
        u8        i;
        P_HC595_SER   = 1;
        for(i=0; i<20; i++)
        {
                P_HC595_SRCLK = 1;
                P_HC595_SRCLK = 0;
        }
        P_HC595_RCLK = 1;
        P_HC595_RCLK = 0;                                                        //锁存输出数据
        P_HC595_RCLK = 1;
        P_HC595_RCLK = 0;                                                        //锁存输出数据
}


//******************************************
void        LCD_delay(void)
{
        NOP(10);
}


//写数据
void WriteDataLCD(u8 WDLCD)
{
        ReadStatusLCD(); //检测忙
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_Data = WDLCD;
                LCD_delay();
        LCD_E = 1;
        LCD_delay();
        LCD_E = 0;
}

//写指令
void WriteCommandLCD(u8 WCLCD,BuysC) //BuysC为0时忽略忙检测
{
        if (BuysC) ReadStatusLCD(); //根据需要检测忙
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_Data = WCLCD;
                LCD_delay();
        LCD_E = 1;
        LCD_delay();
        LCD_E = 0;
}

//读状态
u8 ReadStatusLCD(void)
{
        LCD_Data = 0xFF;
        LCD_RS = 0;
        LCD_RW = 1;
                LCD_delay();
        LCD_E = 1;
                LCD_delay();
        while (LCD_Data & Busy); //检测忙信号
        LCD_E = 0;
        return(LCD_Data);
}

void LCDInit(void) //LCM初始化
{
        PSB = 1;        //并口
//        PSB = 0;        //SPI口
        delay_ms(10);
        LCD_RESET = 0;
        delay_ms(10);
        LCD_RESET = 1;
        delay_ms(100);
       
        WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
        WriteCommandLCD(0x01,1); //显示清屏
        WriteCommandLCD(0x06,1); // 显示光标移动设置
        WriteCommandLCD(0x0C,1); // 显示开及光标设置
}

void LCDClear(void) //清屏
{
        WriteCommandLCD(0x01,1); //显示清屏
        WriteCommandLCD(0x34,1); // 显示光标移动设置
        WriteCommandLCD(0x30,1); // 显示开及光标设置
}


//按指定位置显示一串字符
void DisplayListChar(u8 X, u8 Y, u8 code *DData)
{
        u8 ListLength,X2;
        ListLength = 0;
        X2 = X;
        if(Y < 1)        Y=1;
        if(Y > 4)        Y=4;
        X &= 0x0F; //限制X不能大于16,Y在1-4之内
        switch(Y)
        {
                case 1: X2 |= 0X80;        break;        //根据行数来选择相应地址
                case 2: X2 |= 0X90;        break;
                case 3: X2 |= 0X88;        break;
                case 4: X2 |= 0X98;        break;
        }
        WriteCommandLCD(X2, 1); //发送地址码
        while (DData >= 0x20) //若到达字串尾则退出
        {
                if (X <= 0x0F) //X坐标应小于0xF
                {
                        WriteDataLCD(DData); //
                        ListLength++;
                        X++;
                }
        }
}

//图形显示122*32
void DisplayImage (u8 code *DData)
{
        u8 x,y,i;
        unsigned int tmp=0;
        for(i=0;i<9;)                //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
        {
                for(x=0;x<32;x++)        //32行
                {
                        WriteCommandLCD(0x34,1);
                        WriteCommandLCD((0x80+x),1);//列地址
                        WriteCommandLCD((0x80+i),1);        //行地址,下半屏,即第三行地址0X88
                        WriteCommandLCD(0x30,1);               
                        for(y=0;y<16;y++)       
                                WriteDataLCD(DData);//读取数据写入LCD
                        tmp+=16;               
                }
                i+=8;
        }
        WriteCommandLCD(0x36,1);        //扩充功能设定
        WriteCommandLCD(0x30,1);
}




Lkck8210 发表于 2024-6-6 09:18:29

/*
* ***********************************************************************
*?????????
* ***********************************************************************
*/
void LCD_write_com( unsigned char cmd )
{
      while ( Lcd_CheckBusy() ) {}


      RS_CLR;
      RW_CLR;
      EN_SET;
      DataPort = cmd;
      delay_us( 1 );
      EN_CLR;
}
/*
* ***********************************************************************
*?????????
* ***********************************************************************
*/
void LCD_write_data( unsigned char dat )
{
      while ( Lcd_CheckBusy() )
                ;
      RS_SET;
      RW_CLR;
      EN_SET;
      DataPort = dat;
      delay_us( 1 );
      EN_CLR;
}
/*

durongze 发表于 2024-6-6 11:04:47

angmall 发表于 2024-6-6 08:53
我给你来一个。

sbit      P_HC595_SER   = P5^0;      //pin 14      SER                data input
sbit      P_HC595_RCLK= P5^1;      //pin 12      RCLk      store (latch) clock
sbit      P_HC595_SRCLK = P5^2;      //pin 11      SRCLK      Shift data clock

sbit      LCD_RS = P0^0;      //定义引脚
sbit      LCD_RW = P0^1;
sbit      LCD_E= P0^2;
sbit      PSB    = P4^0;                //PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
sbit      LCD_RESET=P4^1;      //      17---RESET      L-->Enable

#define   LCD_Data P1


HC595不是给数码管用的吗?对吧?所以这个引脚应该没影响吧?
我试了一下,咋不行呢?上面连接屏幕的引脚我弄好了,这个没错。不知道为啥不行。

durongze 发表于 2024-6-6 11:06:13

Lkck8210 发表于 2024-6-6 09:18


这个是复制我的吧?连乱码都是一样的。{:titter:}

durongze 发表于 2024-6-6 11:07:48

soma 发表于 2024-6-6 06:32
你都有89c52的了,移植下很快的

你太看得起我了,我就是没弄出来,才跑来问的{:lol:}

angmall 发表于 2024-6-6 12:42:49

durongze 发表于 2024-6-6 11:04
sbit      P_HC595_SER   = P5^0;      //pin 14      SER                data input
sbit      ...

这个HC595是试验箱的,是给数码管用的。

durongze 发表于 2024-6-6 13:03:58

angmall 发表于 2024-6-6 12:42
这个HC595是试验箱的,是给数码管用的。

你试过官方这个代码可以用吗?

angmall 发表于 2024-6-6 13:13:26

durongze 发表于 2024-6-6 13:03
你试过官方这个代码可以用吗?

可以用的,在官方的STC实验箱4 用STC15W4K。
页: [1] 2
查看完整版本: STC15W4K32S4 驱动st7920的例子谁有啊,最好是测试过可以用的。