durongze 发表于 2024-6-8 03:39:14

请教个问题,89c52 的例子里有个 DDRB, 这个DDRB是寄存器还是管脚呢?





//ST7920 LCD 驱动,使用AVR GCC编译
//Author: cdhigh <2021-09-22>
//ST7920的绘图结构:左上角为坐标原点,写入的字节表示从某个坐标开始的8个横向像素,
//每行 128/8=16 个字节,每个字节左边为最低位,右边为最高位,纵向64行。
//DDRAM地址
//0x800x810x820x830x840x850x860x87    //第一行汉字位置
//0x900x910x920x930x940x950x960x97    //第二行汉字位置
//0x880x890x8a0x8b0x8c0x8d0x8e0x8f   //第三行汉字位置
//0x980x990x9a0x9b0x9c0x9d0x9e0x9f   //第四行汉字位置
#ifndef __ST7290_H_
#define __ST7290_H_

#include <reg52.h>

#define MODE_8BIT       8//8bit并行模式
#define MODE_4BIT       4//4bit并行模式
#define MODE_SERIAL   1//串行-PSB接地

//定义使用的接口模式,MODE_8BIT, MODE_4BIT, MODE_SERIAL
#define LCD_INTERFACE   MODE_SERIAL

//串口模式下的管脚对应:RS-CS(一般直接接电源),RW-SID,E-SCLK
#define LCD_SID_PORT   P0//SID=RW
#define LCD_SID_PIN      1
#define LCD_SCLK_PORT    P0//SCLK=E
#define LCD_SCLK_PIN   2

//8位模式
#define LCD_DATA_DDR   DDRB
#define LCD_DATA_PIN   P2
#define LCD_DATA_PORT    P2

//8/4bit公用
#define LCD_RS_PORT      P0
#define LCD_RS_PIN       0
#define LCD_RW_PORT      P0
#define LCD_RW_PIN       1
#define LCD_EN_PORT      P0
#define LCD_EN_PIN       2

//四位模式,RS/EN/RW使用上面的宏定义
#define LCD_DATA_PORT_D7 LCD_DATA_PORT
#define LCD_DATA_PORT_D6 LCD_DATA_PORT
#define LCD_DATA_PORT_D5 LCD_DATA_PORT
#define LCD_DATA_PORT_D4 LCD_DATA_PORT
#define LCD_DATA_PIN_D77
#define LCD_DATA_PIN_D66
#define LCD_DATA_PIN_D55
#define LCD_DATA_PIN_D44

#define LCD_EN_HIGH()      LCD_EN_PORT |= (1<<LCD_EN_PIN)
#define LCD_EN_LOW()       LCD_EN_PORT &=~(1<<LCD_EN_PIN)

#define LCD_CMD_MODE()   LCD_RS_PORT &=~(1<<LCD_RS_PIN)
#define LCD_DATA_MODE()    LCD_RS_PORT |= (1<<LCD_RS_PIN)

#define LCD_RW_HIGH()      LCD_RW_PORT |= (1<<LCD_RW_PIN)
#define LCD_RW_LOW()       LCD_RW_PORT &=~(1<<LCD_RW_PIN)

#define LCD_DATA_DDR_OUTPUT()LCD_DATA_DDR = 0xff
#define LCD_DATA_DDR_INPUT()   LCD_DATA_DDR = 0x00

void LCD_clear(void);
void LCD_init(void);
void LCD_write_command(unsigned char command);
void LCD_write_data(unsigned char data_);
void LCD_write_byte(unsigned char byte);
void LCD_write_half_byte(unsigned char half_byte);
void LCD2_spi_write_byte(unsigned char data_);
void LCD2_spi_write_byte_standard(unsigned char data_);
unsigned char LCD_read_data(void);
unsigned char LCD_read_status(void);
unsigned char LCD_read_byte(void);
void LCD_startGraphic(void);
void LCD_endGraphic(void);
void LCD_Inverse_16X16(unsigned int rowCol, unsigned char charNum, unsigned char reverse);
unsigned int LCD_rowCol_to_inter_Xy(unsigned int rowCol);
void LCD_set_text_address(unsigned int rowCol);
void LCD_set_graphic_address(unsigned char x, unsigned char y);
void LCD_write_char(unsigned int rowCol, unsigned int code_);
void LCD_write_string(unsigned int rowCol, const char * p);

#if LCD_INTERFACE != MODE_SERIAL
void LCD_write_dot(unsigned char x, unsigned char y);
#endif
void _delay_ms(unsigned int x);
void _delay_us(unsigned int x);
#define pgm_read_byte(a)    (*(a))

#define BYTE_BIT(bitno) (1 << (bitno))
#define TEST_BIT(value, bitno) ((1 << (bitno)) & (value))
#define SET_BIT(value, bitno)((value) |= (1 << (bitno)))
#define CLR_BIT(value, bitno)((value) &= ~(1 << (bitno)))

//两个字节凑成行列整型
//为了更好的区分使用X/Y和ROW/COL,使用ROW/COL的都是一个整型参数,X/Y为两个字节参数
#define ROW_COL(r, c) (((r) << 8) | (c & 0xff))

#endif


soma 发表于 2024-6-8 06:28:26

那个是avr的,估计抄错了

xiangzichen 发表于 2024-6-8 10:47:32

这个是avr的代码,直接把它修改成 P2

xxxevery 发表于 2024-6-8 12:30:14

这是硬抄啊

durongze 发表于 2024-6-8 19:54:29

xiangzichen 发表于 2024-6-8 10:47
这个是avr的代码,直接把它修改成 P2

听说这个是端口模式寄存器?不是引脚吧?

autopccopy 发表于 2024-6-8 21:35:56

看第一行注释,这是A VR专用的寄存器,51不需要。

xiangzichen 发表于 2024-6-8 23:05:13

durongze 发表于 2024-6-8 19:54
听说这个是端口模式寄存器?不是引脚吧?
嗯,AVR和51关于GPIO还是有很多不一样的,AVR的引脚需要设定方向,51不需要,DDRx是方向设定,PORTx的状态和上拉设置,PINx是读取状态.51直接操作端口就好了,STC的要根据情况设定上拉或者开漏,推挽等等,如果不知道怎么用,或者一般场合,设定为准双向,这样最简单.

durongze 发表于 2024-6-9 03:20:37

xiangzichen 发表于 2024-6-8 23:05
嗯,AVR和51关于GPIO还是有很多不一样的,AVR的引脚需要设定方向,51不需要,DDRx是方向设定,PORTx的状态和上 ...

感谢大佬。{:lol:}

durongze 发表于 2024-6-9 03:38:11

xiangzichen 发表于 2024-6-8 23:05
嗯,AVR和51关于GPIO还是有很多不一样的,AVR的引脚需要设定方向,51不需要,DDRx是方向设定,PORTx的状态和上 ...

就在刚刚我好像有点感觉了,等我改天整理整理avr 改51的例子,发个教程。{:titter:}
页: [1]
查看完整版本: 请教个问题,89c52 的例子里有个 DDRB, 这个DDRB是寄存器还是管脚呢?