模块驱动
基础模块:
74HC573 + Beeper(有源)
LED
SEG
KBD
Timer/Counter
UART
进阶模块:
UltraSonic
1838 Infrared
NE555
LCD1602
外传:
方法论
- 转接板
- 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_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 - SDATransmit_Ack
是SDA - SCL - SCLIIC_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
声明