# 介面lab03
## 工作日誌
* 8/10閱讀講義
* 8/11硬體配線~8/14 debug
* 8/14完成
## 程式碼
### 1. 開發ASA BUS 溫度感測介面卡
```c
#include "c4mlib.h"
#define F_CPU 11059200UL
int main(void)
{
C4M_DEVICE_set();
/*SPI串列通訊埠設定旗標群*/
REGFPT(&SPSR,0x01,0,1);//選擇雙倍工作時脈
REGFPT(&SPCR,0x03,0,0);//設定工作時脈除頻值4
REGFPT(&SPCR,0x04,2,0);//同步時脈讀寫 前收後送
REGFPT(&SPCR,0x08,3,0);//同步時脈前緣 前緣為上
REGFPT(&SPCR,0x10,4,1);//主僕選擇 主
REGFPT(&SPCR,0x20,5,0);//SPI資料傳輸順序 高位元先送
REGFPT(&DDRB,0x0F,0,7);//設定 MOSI、SCK、SS 輸出,MISO 接腳為輸入
REGFPT(&DDRF,0xE0,5,7);//設定 ASAID 接腳為輸出
REGFPT(&DDRF,0x0F,0,1);//設定SPI SS8 PF0接腳為CS
/*SPI串列通訊埠控制旗標群*/
REGFPT(&SPCR,0x80,7,0);//SPI中斷禁能
REGFPT(&SPCR,0x40,6,1);//SPI致能
REGFPT(&PORTF,1,0,1);//CS初始值1
float Temp=0;//存放最終浮點數溫度資料
uint16_t temp=0;//存放讀回之定點數資料
while(1)
{
_delay_ms(500);
REGFPT(&PORTF,1,0,0);
ASA_SPIM_rec(4, 8, 0, 2, &temp, 1);//讀值
_delay_ms(500);
REGFPT(&PORTF,1,0,1);
//temp = temp >> 3;
Temp = temp / 128;
printf("Temp = %f \n", Temp);
//printf("temp = %d \n", temp);
}
}
```
### 2. 開發ASA BUS LED矩陣顯示器介面卡
```c
#include "c4mlib.h"
#define F_CPU 11059200UL
void Display(float Temp){
uint8_t Values[4],prinum,zero=0;
int Quotient,remainder;
//uint8_t SevenSegTable[]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111,0b10000000,0b00111001,0b01110001};
uint8_t SevenSegTable[]={0,1,2,3,4,5,6,7,8,9};
float Value;
Value=Temp;
//printf("Value=%f\n",Value);
if (Value==0.0)
{
//printf("Value=0\n");
Values[0]=0b00111111;
Values[1]=0b00111111;
Values[2]=0b00111111;
Values[3]=0;
}
else
{
Quotient=Value*100;
remainder=0;
prinum=4;
for (int i=1;i<=prinum;i++)
{
remainder=Quotient-(Quotient/10)*10;
Quotient=(Quotient-remainder)/10;
Values[i-1]=SevenSegTable[remainder];
if (remainder!=0)zero=i;
//printf("remainder=%d\n",remainder);
}
for (int j=zero+1;j<=prinum;j++)
{
Values[j-1]=255;
}
}
Values[2]=Values[2]|0b10000000;//輸出小數點
for (int j=1;j<=4;j++)
{
//_delay_ms(600);
//printf("j=%d",j);
REGFPT(&PORTF,1,0,0);
ASA_SPIM_trm(6, 9, j, 1, &Values[j-1], 10);//輸出資料
//ASA_SPIM_ftm(6, 9, 0, j, 0, 0, &SevenSegTable[j], 10);
_delay_ms(10);
REGFPT(&PORTF,1,0,1);
}
}
float RaedTemperature(){
float Temp=0;//存放最終浮點數溫度資料
uint16_t temp=0;//存放讀回之定點數資料
_delay_ms(100);
REGFPT(&PORTF,1,0,0);
ASA_SPIM_rec(4, 8, 0, 2, &temp, 1);//讀值
_delay_ms(100);
REGFPT(&PORTF,1,0,1);
//temp = temp >> 3;
Temp = temp / 128;
printf("Temp = %f \n", Temp);
//printf("temp = %d \n", temp);
return Temp;
}
int main(void)
{
C4M_DEVICE_set();
/*SPI串列通訊埠設定旗標群*/
REGFPT(&SPSR,0x01,0,1);//選擇雙倍工作時脈
REGFPT(&SPCR,0x03,0,0);//設定工作時脈除頻值4
REGFPT(&SPCR,0x04,2,0);//同步時脈讀寫 前收後送
REGFPT(&SPCR,0x08,3,0);//同步時脈前緣 前緣為上
REGFPT(&SPCR,0x10,4,1);//主僕選擇 主
REGFPT(&SPCR,0x20,5,0);//SPI資料傳輸順序 高位元先送
REGFPT(&DDRB,0x0F,0,7);//設定 MOSI、SCK、SS 輸出,MISO 接腳為輸入
REGFPT(&DDRF,0xE0,5,7);//設定 ASAID 接腳為輸出
REGFPT(&DDRF,0x0F,0,1);//設定SPI SS8 PF0接腳為CS
REGFPT(&DDRF,0x0F,0,1);//設定SPI SS9 PF1接腳為CS
/*SPI串列通訊埠控制旗標群*/
REGFPT(&SPCR,0x80,7,0);//SPI中斷禁能
REGFPT(&SPCR,0x40,6,1);//SPI致能
REGFPT(&PORTF,1,0,1);//CS初始值1
REGFPT(&PORTF,2,0,2);//CS初始值1
/*MAX7219 設定參數*/
uint8_t decode=0x0F;
uint8_t shutdown=1;
uint8_t scanlimit=0x03;
uint8_t intensity=0x0F;
uint8_t test=0;
REGFPT(&PORTF,1,0,0);
ASA_SPIM_trm(6, 9, 9, 1, &decode, 10);//全不解碼
//ASA_SPIM_ftm(6, 9, 9, 1 , 0, 0 , &decode, 10);
_delay_ms(10);
REGFPT(&PORTF,1,0,1);
_delay_ms(10);
REGFPT(&PORTF,1,0,0);
ASA_SPIM_trm(6, 9, 10, 1, &intensity, 10);//15亮度
//ASA_SPIM_ftm(6, 9, 10, 1 , 0, 0 , &intensity, 10);
_delay_ms(10);
REGFPT(&PORTF,1,0,1);
_delay_ms(10);
REGFPT(&PORTF,1,0,0);
ASA_SPIM_trm(6, 9, 11, 1, &scanlimit, 10);//顯示位數3+1
//ASA_SPIM_ftm(6, 9, 11, 1 , 0, 0 , &scanlimit, 10);
_delay_ms(10);
REGFPT(&PORTF,1,0,1);
_delay_ms(10);
REGFPT(&PORTF,1,0,0);
ASA_SPIM_trm(6, 9, 12, 1, &shutdown, 10);//全開燈
//ASA_SPIM_ftm(6, 9, 12, 1 , 0, 0 , &shutdown, 10);
_delay_ms(10);
REGFPT(&PORTF,1,0,1);
_delay_ms(10);
REGFPT(&PORTF,1,0,0);
ASA_SPIM_trm(6, 9, 15, 1, &test, 10);//強制全亮
//ASA_SPIM_ftm(6, 9, 15, 1 , 0, 0 , &test, 10);
_delay_ms(10);
REGFPT(&PORTF,1,0,1);
float temp;
while(1)
{
temp=RaedTemperature();
Display(temp);
_delay_ms(500);
}
}
```
## 流程圖
### 1. 開發ASA BUS 溫度感測介面卡

### 2. 開發ASA BUS LED矩陣顯示器介面卡

## 實驗數據
### 1. 開發ASA BUS 溫度感測介面卡
* PORTF0,做為CS,其編號為8。

### 2. 開發ASA BUS LED矩陣顯示器介面卡
* PORTF0,做為TMP121的CS,其編號為8。
* PORTF0,做MAX7219的CS,其編號為9。因為PORTF1無法成功拉LOW,所以改與TMP121共用CS。


## 驗收
### 驗收題目
* 七節管改為顯示華氏溫度,並顯示小數後兩位的值
### 驗收成果


