运筹帷幄
模塊驅動
基礎模塊:
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_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聲明
總結
- 上一篇: 运筹帷幄之中,决胜千里之外——运筹学1-
- 下一篇: python 使用SVM进行简单的图像分