找回密码
 立即注册
查看: 280|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:224
  • 最近打卡:2025-05-07 08:02:46

79

主题

631

回帖

1148

积分

金牌会员

积分
1148
发表于 2024-6-8 03:39:14 | 显示全部楼层 |阅读模式




//ST7920 LCD 驱动,使用AVR GCC编译
//Author: cdhigh <2021-09-22>
//ST7920的绘图结构:左上角为坐标原点,写入的字节表示从某个坐标开始的8个横向像素,
//每行 128/8=16 个字节,每个字节左边为最低位,右边为最高位,纵向64行。
//DDRAM地址
//0x80  0x81  0x82  0x83  0x84  0x85  0x86  0x87    //第一行汉字位置
//0x90  0x91  0x92  0x93  0x94  0x95  0x96  0x97    //第二行汉字位置
//0x88  0x89  0x8a  0x8b  0x8c  0x8d  0x8e  0x8f     //第三行汉字位置
//0x98  0x99  0x9a  0x9b  0x9c  0x9d  0x9e  0x9f     //第四行汉字位置
#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_D7  7
#define LCD_DATA_PIN_D6  6
#define LCD_DATA_PIN_D5  5
#define LCD_DATA_PIN_D4  4

#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


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:428
  • 最近打卡:2025-05-07 00:13:45
已绑定手机

19

主题

3194

回帖

4948

积分

论坛元老

积分
4948
发表于 2024-6-8 06:28:26 来自手机 | 显示全部楼层
那个是avr的,估计抄错了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-06 19:09:22
已绑定手机

14

主题

600

回帖

2215

积分

荣誉版主

积分
2215
发表于 2024-6-8 10:47:32 | 显示全部楼层
这个是avr的代码,直接把它修改成 P2
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-06 17:50:26

0

主题

336

回帖

1506

积分

金牌会员

积分
1506
发表于 2024-6-8 12:30:14 | 显示全部楼层
这是硬抄啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:224
  • 最近打卡:2025-05-07 08:02:46

79

主题

631

回帖

1148

积分

金牌会员

积分
1148
发表于 2024-6-8 19:54:29 来自手机 | 显示全部楼层
xiangzichen 发表于 2024-6-8 10:47
这个是avr的代码,直接把它修改成 P2

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

点评

嗯,AVR和51GPIO还是有很多不一样的,AVR的引脚需要设定方向,51不需要,DDRx是方向设定,PORTx的状态和上拉设置,PINx是读取状态.51直接操作端口就好了,STC的要根据情况设定上拉或者开漏,推挽等等,如果不知道怎么用,或者  详情 回复 发表于 2024-6-8 23:05
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:491
  • 最近打卡:2025-05-07 00:32:21
已绑定手机

6

主题

285

回帖

881

积分

荣誉版主

积分
881
发表于 2024-6-8 21:35:56 | 显示全部楼层
看第一行注释,这是A VR专用的寄存器,51不需要。
(仅供参考,欢迎探讨)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-06 19:09:22
已绑定手机

14

主题

600

回帖

2215

积分

荣誉版主

积分
2215
发表于 2024-6-8 23:05:13 | 显示全部楼层
duro*** 发表于 2024-6-8 19:54
听说这个是端口模式寄存器?不是引脚吧?

嗯,AVR和51关于GPIO还是有很多不一样的,AVR的引脚需要设定方向,51不需要,DDRx是方向设定,PORTx的状态和上拉设置,PINx是读取状态.51直接操作端口就好了,STC的要根据情况设定上拉或者开漏,推挽等等,如果不知道怎么用,或者一般场合,设定为准双向,这样最简单.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:224
  • 最近打卡:2025-05-07 08:02:46

79

主题

631

回帖

1148

积分

金牌会员

积分
1148
发表于 2024-6-9 03:20:37 | 显示全部楼层
xiangz*** 发表于 2024-6-8 23:05
嗯,AVR和51关于GPIO还是有很多不一样的,AVR的引脚需要设定方向,51不需要,DDRx是方向设定,PORTx的状态和上 ...

感谢大佬。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:224
  • 最近打卡:2025-05-07 08:02:46

79

主题

631

回帖

1148

积分

金牌会员

积分
1148
发表于 2024-6-9 03:38:11 | 显示全部楼层
xiangz*** 发表于 2024-6-8 23:05
嗯,AVR和51关于GPIO还是有很多不一样的,AVR的引脚需要设定方向,51不需要,DDRx是方向设定,PORTx的状态和上 ...

就在刚刚我好像有点感觉了,等我改天整理整理avr 改51的例子,发个教程。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-7 11:56 , Processed in 0.153861 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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