运筹帷幄

模块驱动


基础模块:
74HC573 + Beeper(有源)
LED
SEG
KBD
Timer/Counter
UART

DS18B20
DS1302

AT24C02
PCF 8591


进阶模块:

UltraSonic
1838 Infrared
NE555
LCD1602


外传:

MM&&IO编程
PWM


方法论


- 转接板

运筹帷幄


- SEG

  • 板子是共阴极数码管,码表比赛会给出,无需背诵。
  • 消隐 —— 位选 —— 段选 简称:ECE
  • 0x80是MSB,以static index 做引导,记得index++index &= 0x07

- KBD

  • 接口为:OUT:0、1、2、3;IN:4、2、4、5
  • KBD_Buff[4][4]用于判断按键状态4*4的0xFF
  • switch控制扫描,KBD_Buff1| KEY_IN
  • & 0x0F == 0x0F :没有按下 & 0x0F == 0x00 :按下了
  • 按下时有效的的按键:在判断的时候加Flag,和KBD_Sta[4][4]一起变化
  • KBD_Sta[4][4]KBD_Before[4][4]对比:先是不一样,后是KBD_Before != 0

- Timer/Counter + UART + INTR

中断复习:(IT IT U)
interrupt0:INTR 0
interrupt1:Timer 0
interrupt2:INTR 1
interrupt3:Timer 1
interrupt4:UART

EA:总中断允许
ETx:定时器x中断溢出允许
EXx:外部中断INTx溢出允许
ES:UART中断允许

Timer/Counter

  • 记得开ETEA
  • T0用于全局计时,T1用于UARTPWM
  • 记得重装初值

UART

  • 发送寄存器SBUF、接收溢出位RI、发送溢出位TI

INTR

  • 在板其实没啥用,一般为低电平下降沿触发

- OneWire (先低后高) @ (OneWire_Port = P14)

  • 强时序,每次操作关EA
  • 在线判断:480μs的电平 + 15μs的电平,读18B20返回的电平
  • 写:2μs + 10μs信号 + 拉高总线
  • 读:1μs1μs(上升沿)+ 10μs信号
  • 0xCC跳ROM,0x44更新,0xBE读16位数据
  • 读出温度是16位补码

- DS1302 (先低后高) @ (CE = P13、IO = P23、SCLK = P17)

  • 升沿写,降沿

  • 复位是 CE = 0SCLK = 0

  • 写:(addr<<1) | 0x80、读:(addr<<1) | 0x81

  • 所有读操作,最后一定要将DS1302_IO = 0

  • 0xBE可快0xBF可快,记得指针++后用

  • 初始化先向7号寄存器中写0x00,消除写保护

  • 寄存器1-7:年、周、月、日、时、分、秒


- IIC(先高后低) @ (SCL = P20、SDA = P21)

  • IIC_StartIIC_Stop都是SDA - SCL - SDA
  • Transmit_Ack是SDA - SCL - SCL
  • IIC_Writebit,返回取反的SDA,SCL先0后1。接收Ack时,断SCL,释放SDA,开SCL;再读SDA,断SCL。&mask发1位。
  • IIC_Read先将释放SDA,SCL先1后0|= mask发1位。

- AT24C02 @ IIC

  • 地址:0xA0,奇读偶写
  • 连续读:do-while呼叫0xA0,写Word地址,接起始信号,接0xA1,读1个Byte,发1个Ack,最后一个发Stop
  • 连续写:do-while呼叫0xA0,写Word地址。若地址&0x07后为0,便要重新进行这一过程,防止盖页

- PCF8591 @ IIC

  • 地址:0x90,奇读偶写
  • 两次读才是实时值
  • VCC扩大10倍为50

- 写法

  • 抽象硬件,把相同硬件的不同操作(如不同流水灯模式)抽象成同一入口,通过程序多次调用进入,每次只做一件事,速度快了就像一个连贯的过程了。

BUG

  • 外部调用 的变量一定要在.h文件中用extern声明

运筹帷幄