?? 2.c
字號:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//寄存器地址宏定義
#define DECODE_MODE 0x09 //譯碼控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN_LIMIT 0x0B //掃描界限寄存器
#define SHUT_DOWN 0x0C //關斷模式寄存器
#define DISPLAY_TEST 0x0F //測試控制寄存器
//數碼管位定義
#define D0 0x01 //Digit0
#define D1 0x02 //Digit1
#define D2 0x03 //Digit2
#define D3 0x04 //Digit3
#define D4 0x05 //Digit4
#define D5 0x06 //Digit5
#define D6 0x07 //Digit6
#define D7 0x08 //Digit7
//數組定義
uint Ad_Value[5];
//數碼管不譯碼按段顯示定義 七段+點格式 D7-D0 DP-A-B-C-D-E-F-G
//不帶點 0 0x7e 1 0x30 2 0x6d 3 0x79 4 0x33
// 5 0x5b 6 0x5f 7 0x70 8 0xff 9 0x7c
// - 0x01 E 0x4f H 0x37 L 0x0e P 0x67 blank 0x00
//MAX7219管腳定義
sbit CLK=P1^0; //MAX7219串行時鐘 13腳
sbit LOAD=P1^1; //MAX7219片選 ( CS ) 12腳
sbit DIN=P1^2; //MAX7219串行數據 1腳
//TLC2543定義四線制接口
sbit clk = P3^4; //時鐘 18
sbit din = P3^5; //數據入口 17
sbit dout = P3^6; //數據出口 16
sbit cs = P3^7; //片選 15
//函數聲明
void Initial(void); //MAX7219初始化函數
void Write7219(uchar address,uchar dat); //數碼管
void delay(); //延時函數
uint AD_Conver(uchar channel); //AD轉換
//主函數
void main()
{
uint j;
uchar d0,d1,d2,d3;
Initial(); //MAX7219初始化
delay();
while(1)
{
Ad_Value[0] = AD_Conver(1); //0通道,轉換數據12位,高位在前,低位在后
d3=Ad_Value[0]/1000;
d2=(Ad_Value[0]%1000)/100;
d1=Ad_Value[0]%100/10;
d0=Ad_Value[0]%10;
Write7219(D3,d3);
Write7219(D2,d2);
Write7219(D1,d1);
Write7219 (D0,d0);
for(j=0;j<45000;j++);
}
}
//--------------------------------------------------
// 函數名稱: delay
// 函數功能: 延時55us
// 入口參數: 無
// 出口參數: 無
//--------------------------------------------------
void delay()
{
uchar i = 5;
while(i--);
}
//--------------------------------------------------
// 函數名稱: AD_Conver
// 函數功能: AD轉換
// 入口參數: 地址命令字
// 出口參數: AD值
//--------------------------------------------------
uint AD_Conver(uchar channel)
{
uchar i;
uint ad_value = 0;
clk = 0;
cs = 1;
delay();
cs = 0;
channel <<=4;
for (i = 0; i < 12; i++) //注意:在12個時鐘周期的下降沿產生了數據輸出
{ //在前4個時鐘周期內,TLC2543已經知道下一次將
if (dout) ad_value |= 1; //哪個通道做轉換,在后8個時鐘內就一直對此通道
din = (bit)(channel & 0x80); //進行采樣,并保持到第12個時鐘周期結束,此后才
clk = 1; //開始進行A/D轉換,轉換時間需要10us.
delay(); //在第4-8個時鐘周期內輸入的是命令控制字
clk = 0; //可根據需要輸入
channel<<=1;
ad_value<<=1;
}
clk =1;
ad_value>>=1;
return ad_value;
}
//地址、數據發送子程序
void Write7219(uchar address,uchar dat)
{
uchar i;
LOAD=0; //拉低片選線,選中器件
//發送地址
for (i=0;i<8;i++) //移位循環8次
{
CLK=0; //清零時鐘總線
DIN=(bit)(address&0x80); //每次取高字節
address<<=1; //左移一位
CLK=1; //時鐘上升沿,發送地址
}
//發送數據
for (i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(dat&0x80);
dat<<=1;
CLK=1; //時鐘上升沿,發送數據
}
LOAD=1; //發送結束,上升沿鎖存數據
}
//MAX7219初始化,設置MAX7219內部的控制寄存器
void Initial(void)
{
Write7219(SHUT_DOWN,0x01); //開啟正常工作模式(0xX1) 關斷狀態(0xX0)
Write7219(DISPLAY_TEST,0x00); //選擇工作模式(0xX0) 測試狀態(0xX1)
Write7219(DECODE_MODE,0xff); //選用全譯碼模式 (0xff) 不譯碼(0x00)
//只Digit0譯碼 (0x01) 只Digit0-3(0x0f)
Write7219(SCAN_LIMIT,0x03); //8只LED全用 (0xX7) 0xXN 用Digit0--DigitN
Write7219(INTENSITY,0x04); //設置初始亮度(0xX0--0xXF )
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -