教你如何将stc32的例子搬到89c51上,这里以lcd12864为例
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---RESETL-->Enable
#define LCD12864_SID LCD_RW
#define LCD12864_SCLKLCD_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);
}
}
折腾了好久,刚刚终于成功了。 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 复位端,低电平有效
就只要改头文件和延时就可以了? 可以考虑将 STC89/STC12C5A60S2/STC15W 系列的程序往 STC8H/STC32G上移植,
反过来的就没必要了
STC8H/STC32G 价格更低
后续的 STC8051U 管脚兼容 STC89/STC12C5A, 但程序是兼容 STC8H/STC32G的
soma 发表于 2024-6-9 07:13
就只要改头文件和延时就可以了?
嗯 神农鼎 发表于 2024-6-9 09:56
可以考虑将 STC89/STC12C5A60S2/STC15W 系列的程序往 STC8H/STC32G上移植,
反过来的就没必要了
这个过程肯定是可逆的哇(⊙o⊙)。{:lol:}。感谢大佬提醒。 后面可以忙 STC89C52RC上的程序移植到 STC8051U 上
端午快乐 !追风剑-II@STC8051USB实验箱讨论稿,从8051到32位51,三角函数/浮点 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
神农鼎 发表于 2024-6-9 13:28
后面可以忙 STC89C52RC上的程序移植到 STC8051U 上
端午快乐 !追风剑-II@STC8051USB实验箱讨论稿,从8051 ...
这个也有赠送实验箱的活动吗?🥲。 durongze 发表于 2024-6-9 16:51
这个也有赠送实验箱的活动吗?🥲。
帮忙新人成长,帮忙论坛建设的,都可以,这个要 7/1后送芯片,7/15后才有实验箱
页:
[1]