欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
max7219數碼管掉電時鐘顯示程序
[打印本頁]
作者:
hyunim55612
時間:
2019-7-10 11:57
標題:
max7219數碼管掉電時鐘顯示程序
#include<STC15W4K32S4.h> // 引用標準庫的頭文件
#define uchar unsigned char // 定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
char code dx516[3] _at_ 0x003b;// 這是為了仿真設置的
#define WriteDeviceAddress 0xa0 // 定義器件在 IIC 總線中的地址,且方式為寫
#define ReadDeviceAddress 0xa1 // 定義器件在 IIC 總線中的地址,且方式為讀
sbit SCL=P1^6; // 串行IIC時鐘
sbit SDA=P1^7; // 串行IIC數據、地址
sbit DIN = P0^0; // 串行數據輸入
sbit CLK = P0^1; // 串行時鐘
sbit LOAD = P4^6; // 顯示數據鎖存控制
sbit led=P2^6;
/****************************
MAX7219特殊功能寄存器定義
************************/
#define DECODE_MODE 0x09 // 譯碼模式寄存器
#define INTENSITY 0x0a // 亮度寄存器
#define SCAN_LIMIT 0x0b // 掃描位數寄存器
#define SHUT_DOWN 0x0c // 低功耗模式寄存器
#define DISPLAY_TEST 0x0f // 顯示測試寄存器
unsigned int cntb=0 ,n=0,m=0,k=0;
void Write_Max7219_byte(unsigned char temp);
void Write_Max7219(unsigned char address,unsigned char dat);
void Init_Max7219(void);
void delay_ms(unsigned int time);
void Init_interrupt();
void show();
uchar Read24c02(uchar address);
void Write24c02(uchar ch,uchar address);
void DelayMsK(unsigned int number);
/* 主函數 */
void main(void)
{
Init_Max7219(); //7219初始化
Init_interrupt(); //定時器初始化
P1M0=0X00;
P1M1=0X00;
P2M0=0X00;
P2M1=0X00;
n=Read24c02(0x03);
k=Read24c02(0x04);
if(n>59||k>59)
{ //防止首次上電讀出的數據出錯
n=0;
k=0;
}
while(1)
{
show(); //調用數碼管顯示
}
}
/*******************************
MAX7219顯示子程序
*******************************/
void show()
{
Write24c02(n,0x03); // 寫入一個字節到 24c02 中的0x03地址
DelayMsK(8000);
Write_Max7219(4,n%10); //數碼管分鐘個位數值分離
delay_ms(1);
Write_Max7219(3,n%100/10); //數碼管分鐘十位數值分離
delay_ms(1);
Write24c02(k,0x04); // 寫入一個字節到 24c02 中的0x04地址
DelayMsK(8000);
Write_Max7219(2,k%10); //數碼管小時個位數值分離
delay_ms(1);
Write_Max7219(1,k%100/10); //數碼管小時十位數值分離
delay_ms(1);
}
/**************************
定時器0初始化子程序
*****************************/
void Init_interrupt()
{
TMOD=0X01;
TH0=(65536-46080)/256; //定時器賦初值11.0592MHZ晶振,賦初值TH0=(65536- 1000*50*(11.0592/12)/256) 50ms
TL0=(65536-46080)/256;
TR0=1;
ET0=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
}
/********************************
ms級延時子程序
******************************/
void delay_ms(unsigned int time)
{
unsigned int i,j;
for(i=time;i>0;i--)
for(j=125;j>0;j--);
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-46080)/256;
TL0=(65536-46080)/256;
cntb ++;
m++;
if(m==30) ////m執行30次,led燈1s交替閃爍
{
led=~led;
m=0;
}
if(cntb==1200) //cntb執行1200次,一分鐘時間到
{
n=n+1; //分鐘變量加1操作
cntb=0; //定時器計數變量清零
}
if(n>59) //分鐘 顯示大于59秒
{
k=k+1; //小時變量加1操作
n=0; //分鐘變量清零
}
if(k>99) //時間顯示大于99小時
{
k=99;
}
}
/******************
MAX7219讀數據子程序
*********************/
void Write_Max7219_byte(unsigned char temp)
{
unsigned char i;
for(i=0;i<8;i++) //移位循環8次
{
CLK=0; //清零時鐘總線
DIN=(bit)(temp&0x80); //每次取高字節亮
temp=temp<<1; //左移移位
CLK=1; //時鐘上升沿,發送高字節位
}
}
/*****************************
MAX7219寫數據子程序
*************************/
void Write_Max7219(unsigned char address,unsigned char dat)
{
LOAD=0; //拉低片選線,選中器件
Write_Max7219_byte(address); //讀取高字節地址位
Write_Max7219_byte(dat); //讀取高字節數據位
LOAD=1; //讀取結束,上升沿鎖存數據
}
/*****************************
MAX7219初始化子程序
*************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN,0x01); //開啟正常工作模式
Write_Max7219(DISPLAY_TEST,0x00); //選中工作模式
Write_Max7219(DECODE_MODE,0xff); //選用全譯碼模式
Write_Max7219(SCAN_LIMIT,0x07); //8只LED全用
Write_Max7219(INTENSITY,0x0a); //設置初始亮度
}
// 定時函數
void DelayMsK(unsigned int number)
{
unsigned char temp;
for(;number!=0;number--)
{
for(temp=112;temp!=0;temp--) ;
}
}
// 開始總線
void Start()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
// 結束總線
void Stop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
// 發 ACK0
void NoAck()
{
SDA=1;
SCL=1;
SCL=0;
}
// 測試 ACK
bit TestAck()
{
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
// 寫入 8 個 bit 到 24c02
void Write8Bit(unsigned char input)
{
unsigned char temp;
for(temp=8;temp!=0;temp--)
{
SDA=(bit)(input&0x80); //input&0x80 結果非零,轉換成 bit 即為 1。
SCL=1;
SCL=0;
input=input<<1;
}
}
void Write24c02(uchar ch,uchar address)
{
Start();// 發送起始脈沖
Write8Bit(WriteDeviceAddress); // 發送從器件地址,且方式為寫。
while(TestAck()); // 等待應答
Write8Bit(address); // 發送要寫入數據的字節地址
while(TestAck()); // 等待應答
Write8Bit(ch); // 發送要寫的數據到被尋址的存儲單元。
while(TestAck()); // 等待應答
Stop();// 發送停止信號, 24C02開始內部數據的擦寫。 在內部擦寫過程中 24C02 不再應答主器件的任何請求。
DelayMsK(10);
}
// 從 24c02 中讀出 8 個 bit
uchar Read8Bit()
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--)
{
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
}
return(rbyte);
}
// 選擇性讀操作,從 address 地址中讀出 1 個字節
uchar Read24c02(uchar address)
{
uchar ch;
// 偽寫操作
Start();
Write8Bit(WriteDeviceAddress); // 發送從器件地址,且方式為寫。
while(TestAck()); // 等待應答
Write8Bit(address); // 發送要讀的數據地址
while(TestAck()); // 等待應答
// 主器件重新發送起始信號和從器件地址此時 R/W 位置1
Start();
Write8Bit(ReadDeviceAddress); // 發送從器件地址,且方式為讀。
while(TestAck()); // 等待應答
ch=Read8Bit(); // 讀出 8bit
NoAck();
// 主機不應答
Stop();
// 主機產生停止信號
return(ch);
}
復制代碼
作者:
admin
時間:
2019-7-11 15:53
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1