找回密码
 立即注册
查看: 494|回复: 9

教你如何将stc32的例子搬到89c51上,这里以lcd12864为例

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-6-9 03:33:23 | 显示全部楼层 |阅读模式
1.第一步:当然是修改要包含的文件。
   89c51:
      #include <reg52.h>
      #include <string.h>
   stc32:
      #include "./comm/STC32G.H"  
2.第二步:修改影响延时的地方(工程属性,烧写设置)。


   89c51:
       #define     MAIN_Fosc       12000000L
   stc32:
       #define     MAIN_Fosc       24000000L

3. 删掉stc32的端口模式设置,89c51不需要。

备注:第二步非常重要。

以下是搬到89c51上的lcd12864例子:

#include <reg52.h>
#include <string.h>

#define     MAIN_Fosc       12000000L   //?????

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

/*
* RS: H->Data; L->Cmd
* RW: H->Read; L->Write
*
* Chip Select     : L->Valid         
* LCD_SI_CS       PIN_RS
*
* Data            : H->       ; L->   
* LCD_SI_SID      PIN_RW
*
* Clock           : H->       ; L->     
* LCD_SI_SCLK     PIN_EN
*/

#define LCD_Data P2

sbit    LCD_RS = P0^0;  //????
sbit    LCD_RW = P0^1;
sbit    LCD_E  = P0^2;
sbit    PSB    = P3^0;      //
sbit    LCD_RESET   =   P3^1;   //  17---RESET  L-->Enable

#define LCD12864_SID   LCD_RW
#define LCD12864_SCLK  LCD_E

#define Busy    0x80 //????LCD?????Busy??

#define         Write_Command                                     0xf8
#define         Write_Data                                        0xfa
#define         Read_Command                                      0xfc
#define         Read_Data                                         0xfe
#define         Setting_Basic_Instruction_Set                     0x30
#define         Setting_Extended_Instruction_Set_Drawing_Off      0x34
#define         Setting_Extended_Instruction_Set_Drawing_On       0x36
#define         Clear_Display                                     0x01
#define         Entry_Mode_Cursor_Left                            0x04
#define         Entry_Mode_Entire_Right                           0x05
#define         Entry_Mode_Cursor_Right                           0x06
#define         Entry_Mode_Entire_Left                            0x07
#define         Display_Off                                       0x08
#define         Display_On_Cursor_Off_Inverse_Off                 0x0c
#define         Display_On_Cursor_Off_Inverse_On                  0x0d
#define         Display_On_Cursor_On_Inverse_Off                  0x0e
#define         Display_On_Cursor_On_Inverse_On                   0x0f
#define         Cursor_Move_Left                                  0x10
#define         Cursor_Move_Right                                 0x14
#define         Display_Move_Left                                 0x18
#define         Display_Move_Right                                0x1c




#if 1
void    delayms(unsigned int n)            //n*10ms
{
    unsigned int i,j;
    for(i=0; i<n; i++)
        for(j=0; j<2000; j++);
}


void    delay(unsigned int m)              //m*50us
{
    unsigned int i,j;
    for(i=0; i<m; i++)
        for(j=0; j<10; j++);
}


void Delay_10us()
{
    unsigned int i,j;
    for(i=0; i<1; i++)
        for(j=0; j<2; j++);       
}
void Delay_x10us(u16 tm)
{
        u16 i = tm;
        do {
                Delay_10us();   //14T per loop
        } while(--i);
}


void Delay_10ms()
{
        delayms(1);
}
void Delay_x10ms(unsigned int n)
{
        delayms(n);
}

#else
void Delay_10us()
{
        u32 i;
        u16 us = 10;
        do {
                i = MAIN_Fosc / 13;
                while(--i)    ;   //14T per loop
        } while(--us);
}

void Delay_x10us(u16 tm)
{
        u16 i = tm;
        do {
                Delay_10us();   //14T per loop
        } while(--i);
}

void Delay_10ms()
{
        u16 i;
        u16 ms = 10;
        do {
                i = MAIN_Fosc / 1300;
                while(--i)    ;   //14T per loop
        } while(--i);
}

void Delay_x10ms(u16 tm)
{
        u16 i = tm;
        do {
                Delay_10ms();   //14T per loop
        } while(--i);
}
#endif

/*----------------------------?1???????----------------------------*/
void LCD12864_Write_Byte(unsigned char temp)
{
        unsigned char i;
        for(i=0; i<8; i++) {
                if((temp<<i)&0x80)
                        LCD12864_SID=1;
                else
                        LCD12864_SID=0;
                LCD12864_SCLK=0;
                LCD12864_SCLK=1;
        }
}

/*----------------------------????????----------------------------*/
void LCD12864_Write(unsigned char Command,unsigned char temp)
{
        LCD12864_Write_Byte(Command);
        LCD12864_Write_Byte(temp&0xf0);
        LCD12864_Write_Byte((temp<<4)&0xf0);
}

/*----------------------------??GDRAM----------------------------*/
void Clear_GDRAM(void)
{
        unsigned char i,j,k;
        LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_Off);
        k=0x80;
        for(i=0; i<32; i++) {
                LCD12864_Write(Write_Command,k++);
                LCD12864_Write(Write_Command,0x80);
                for(j=0; j<16; j++) {
                        LCD12864_Write(Write_Data,0x00);
                }
        }
        k=0x80;
        for(i=0; i<32; i++) {
                LCD12864_Write(Write_Command,k++);
                LCD12864_Write(Write_Command,0x88);
                for(j=0; j<16; j++) {
                        LCD12864_Write(Write_Data,0x00);
                }
        }
        LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_On);
}

/*----------------------------??????----------------------------*/
void Display_Text(unsigned char code *addr)
{
        unsigned char i;
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        LCD12864_Write(Write_Command,0x80);        //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
        LCD12864_Write(Write_Command,0x90);        //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
        LCD12864_Write(Write_Command,0x88);        //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
        LCD12864_Write(Write_Command,0x98);        //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
}

/*----------------------------????????----------------------------*/
void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2)
{
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        switch(y) {
        case 0:
                LCD12864_Write(Write_Command,0x80+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 1:
                LCD12864_Write(Write_Command,0x90+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 2:
                LCD12864_Write(Write_Command,0x88+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 3:
                LCD12864_Write(Write_Command,0x98+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        }
}

/*----------------------------???12864----------------------------*/
void LCD12864_Init(void)
{
        P2 = 0;
        LCD_RS = 1;
        PSB = 0;
        LCD_RESET = 1;

        Delay_x10ms(4);                        //40mS??
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        Delay_x10us(10);                //100uS??
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        Delay_x10us(4);                        //40uS??
        LCD12864_Write(Write_Command,Clear_Display);                                                //??????????
        Delay_x10us(10);                //100uS??
        LCD12864_Write(Write_Command,Clear_Display);                                                //????
        Delay_x10ms(1);                        //10mS??
        LCD12864_Write(Write_Command,Entry_Mode_Cursor_Right);                                //??????
        Delay_x10us(10);                //100uS??
        LCD12864_Write(Write_Command,Display_On_Cursor_Off_Inverse_Off);        //???,???,?????
        Delay_x10us(10);                //100uS??
        Clear_GDRAM();                        //??GDRAM
        Delay_x10us(10);                //100uS??
}


unsigned char code LCD_STR[]    = {"HELLO"};

void main(void)
{
        /*
        P0M1 = 0x00;
        P0M0 = 0x00;   //???????
        P1M1 = 0x00;
        P1M0 = 0x00;   //???????
        P2M1 = 0x00;
        P2M0 = 0x00;   //???????
        P3M1 = 0x00;
        P3M0 = 0x00;   //???????
        P4M1 = 0x00;
        P4M0 = 0x00;   //???????
        P5M1 = 0x00;
        P5M0 = 0x00;   //???????
        P6M1 = 0x00;
        P6M0 = 0x00;   //???????
        P7M1 = 0x00;
        P7M0 = 0x00;   //???????
*/
        LCD12864_Init(); //LCM???
        Delay_x10ms(5); //????(???)
        while(1) {
                Display_Text(LCD_STR);
        }
}





回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-6-9 03:34:32 | 显示全部楼层
折腾了好久,刚刚终于成功了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-6-9 03:47:19 | 显示全部楼层
CS                     H/L               模组片选端,高电平有效。
PSB                   L                   L:串口方式
--------------------------------------------------------------
RS(CS)             H/L                RS=“H”,表示DB7——DB0 为显示数据;    RS=“L”,表示DB7——DB0 为显示指令数据。
R/W(SID)           H/L                R/W=“H”,E=“H”,数据被读到DB7——DB0;R/W=“L”,E=“H→L”, DB7——DB0 的数据被写到IR 或DR
E(SCLK)             H/L                使能信号
PSB                   H/L                 H:8 位或4 位并口方式;                        L:串口方式
/RESET              H/L                 复位端,低电平有效
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-6-9 07:13:04 来自手机 | 显示全部楼层
就只要改头文件和延时就可以了?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-6-9 09:56:17 | 显示全部楼层
可以考虑将 STC89/STC12C5A60S2/STC15W 系列的程序往 STC8H/STC32G上移植,
反过来的就没必要了

STC8H/STC32G 价格更低



后续的 STC8051U 管脚兼容 STC89/STC12C5A, 但程序是兼容 STC8H/STC32G的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-6-9 12:03:33 来自手机 | 显示全部楼层
soma 发表于 2024-6-9 07:13
就只要改头文件和延时就可以了?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-6-9 12:07:05 来自手机 | 显示全部楼层
神农鼎 发表于 2024-6-9 09:56
可以考虑将 STC89/STC12C5A60S2/STC15W 系列的程序往 STC8H/STC32G上移植,
反过来的就没必要了


这个过程肯定是可逆的哇(⊙o⊙)。。感谢大佬提醒。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-6-9 13:28:36 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-6-9 16:51:01 | 显示全部楼层
神*** 发表于 2024-6-9 13:28
后面可以忙 STC89C52RC上的程序移植到 STC8051U 上

端午快乐 !追风剑-II@STC8051USB实验箱讨论稿,从8051 ...

这个也有赠送实验箱的活动吗?🥲。

点评

帮忙新人成长,帮忙论坛建设的,都可以,这个要 7/1后送芯片,7/15后才有实验箱  详情 回复 发表于 2024-6-9 16:54
回复 支持 0 反对 1

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-6-9 16:54:09 | 显示全部楼层
duro*** 发表于 2024-6-9 16:51
这个也有赠送实验箱的活动吗?🥲。

帮忙新人成长,帮忙论坛建设的,都可以,这个要 7/1后送芯片,7/15后才有实验箱
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:43 , Processed in 0.140405 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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