模块驱动
基础模块:
74HC573 + Beeper(有源)
LED
SEG
KBD
Timer/Counter
UART
进阶模块:
UltraSonic
1838 Infrared
NE555
LCD1602
外传:
方法论
- 转接板
- SEG
- 板子是
共阴极数码管,码表比赛会给出,无需背诵。 - 消隐 —— 位选 —— 段选 简称:ECE
- 0x80是MSB,以
staticindex 做引导,记得index++和index &= 0x07
- KBD
- 接口为:OUT:
0、1、2、3;IN:4、2、4、5 -
KBD_Buff[4][4]用于判断按键状态4*4的0xFF -
switch控制扫描,KBD_Buff移1位|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
- 记得开
ET、EA - T0用于全局计时,T1用于
UART或PWM - 记得
重装初值
UART
- 发送寄存器
SBUF、接收溢出位RI、发送溢出位TI
INTR
- 在板其实没啥用,一般为
低电平或下降沿触发
- OneWire (先低后高) @ (OneWire_Port = P14)
- 强时序,每次操作
关EA - 在线判断:480μs的
低电平 + 15μs的高电平,读18B20返回的低电平 - 写:2μs
低+ 10μs信号 + 拉高总线 - 读:1μs
低1μs高(上升沿)+ 10μs信号 -
0xCC跳ROM,0x44更新,0xBE读16位数据 - 读出温度是16位
补码
- DS1302 (先低后高) @ (CE = P13、IO = P23、SCLK = P17)
-
上升沿前写,下降沿后读 -
复位是
CE = 0,SCLK = 0 -
写:
(addr<<1) | 0x80、读:(addr<<1) | 0x81 -
所有
读操作,最后一定要将DS1302_IO = 0 -
0xBE可快写,0xBF可快读,记得指针++后用 -
初始化先向
7号寄存器中写0x00,消除写保护 -
寄存器1-7:年、周、月、日、时、分、秒
- IIC(先高后低) @ (SCL = P20、SDA = P21)
-
IIC_Start和IIC_Stop都是SDA - SCL - SDA -
Transmit_Ack是SDA - SCL - SCL -
IIC_Write是bit,返回取反的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声明