久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
自己寫的ds1302時鐘程序 數碼管調節時間一個暗一個亮的
[打印本頁]
作者:
lele4090039
時間:
2018-3-5 12:40
標題:
自己寫的ds1302時鐘程序 數碼管調節時間一個暗一個亮的
//有些地方沒刪除,是調試的時候用的。請專家幫看看,為什么我寫到開發板上,數碼管調節時間一個暗一個亮的,
功能:顯示時鐘
顯示日期
調節時鐘日期
四位數碼管顯示
#include<reg52.h>
#include<intrins.h>
sbit Ge=P0^0 ; //數碼管段
sbit Shi=P0^1 ;
sbit Bai=P0^2 ;
sbit Qian = P0^3;
sbit SCK = P1^0; //DS1302模塊
sbit DS = P1^1;
sbit CE = P1^2;
sbit KEY1=P1^3; //按鍵
sbit KEY2=P1^4;
void configTime0(unsigned int ms);//配置定時器0配置中斷
void configUART(unsigned int begin);//配置UART串口通信設置波特率
void Shownum(); //掃描函數
void display(); //數碼管刷新函數
void Write_ds1302(unsigned char dat); //寫1302函數1字節
void Write_ds1302_CE(unsigned char cmd,unsigned char dat); //讀取1302函數1字節 對命令處理
//void read_ds1302_burst(unsigned char *dat); //burst模式讀取8個字節 突發模式
void initds1302();//初始化ds1302
void keyset();
void keycan();
unsigned char Read_ds1302_CE(unsigned char cmd); //1302函數1字節 對命令處理
unsigned char Read_ds1302(); //讀取1302函數1字節
unsigned char Smg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//真值表 123456789abcdefg
unsigned char SmgI[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};//帶標點的真值表1.2.3.4.5.6.7.8.9.
unsigned char SmgTmp[8];//數碼管緩存
unsigned char Time[8]; //時間緩存
unsigned char Tmp[4]; //調節時間的數組//0~分鐘 1~小時 2~天 3~月
unsigned char flg = 1;//決定顯示日期還是時間
unsigned char T0RL,T0RH;//重裝定時器時間
unsigned char flg0,flg1,set0,set1;
bit backup0,backup1;
bit gb;
void main()
{
EA = 1;
configTime0(500);
configUART(9600);
initds1302();
while(1)
{
Shownum();
keyset();
}
}
void Shownum() //掃描函數
{
static unsigned char i;
if(flg0==0){
for(i=0;i<7;i++)
{
Time[i]=Read_ds1302_CE(i);
}
gb = (bit)(Read_ds1302_CE(0)&0x01);//將ds1302秒寄存器最低位取出用于數碼管中間的兩個點閃爍
SmgTmp[0]=(Time[1]&0x0F); //顯示分鐘,小時
SmgTmp[1]=(Time[1]>>4);
SmgTmp[2]=(Time[2]&0x0F);
SmgTmp[3]=(Time[2]>>4);
SmgTmp[4]=Time[3]&0x0F; //顯示日期,月份
SmgTmp[5]=Time[3]>>4;
SmgTmp[6]=Time[4]&0x0F;
SmgTmp[7]=Time[4]>>4;
}
}
void configTime0(unsigned int m) //配置定時器0配置中斷
{
T0RH =(65536-m)/256;
T0RL =(65536-m)%256;
TMOD &=0xF0;
TMOD |=0x01;
TH0=T0RH;
TL0=T0RL;
ET0 = 1;
TR0 = 1;
}
void configUART(unsigned int begin) //配置UART串口通信設置波特率
{
SCON = 0x50;
TMOD &=0x0F;
TMOD |=0x20;
TH1=256-(11059200/12/32)/begin;
TL1=TH1;
ET1 = 0;
ES = 1;
TR1 = 1;
}
void Write_ds1302(unsigned char dat) //寫1302函數1字節
{
unsigned char mask;
for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位移出
{
if ((mask&dat) != 0) //首先輸出該位數據
DS = 1;
else
DS = 0;
SCK = 1; //然后拉高時鐘
SCK = 0; //再拉低時鐘,完成一個位的操作
}
DS = 1;
} //最后確保釋放IO引腳
unsigned char Read_ds1302() //讀取1302函數1字節
{
unsigned char mask;
unsigned char dat = 0;
for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位讀取
{
if (DS!= 0) //首先讀取此時的IO引腳,并設置dat中的對應位
{
dat |= mask;
}
SCK = 1; //然后拉高時鐘
SCK = 0; //再拉低時鐘,完成一個位的操作
}
return dat; //最后返回讀到的字節數據
}
void Write_ds1302_CE(unsigned char cmd,unsigned char dat) //讀取1302函數1字節 對命令處理
{
CE = 1;
Write_ds1302((cmd<<1)|0x80);
Write_ds1302(dat);
CE = 0;
}
unsigned char Read_ds1302_CE(unsigned char cmd) //1302函數1字節 對命令處理
{
unsigned char dat;
CE = 1;
Write_ds1302((cmd<<1)|0x81);
dat=Read_ds1302();
CE = 0;
return dat;
}
/*void write_ds1302_burst(unsigned char *dat) //burst模式寫8個字節 突發模式
{
unsigned char i;
CE = 1;
Write_ds1302(0xBE);
for(i=0;i<8;i++)
{
Write_ds1302(dat[i]);
}
CE = 0;
}
void read_ds1302_burst(unsigned char *dat) //burst模式讀取8個字節 突發模式
{
unsigned char i;
CE = 1;
Write_ds1302(0xBF);
for(i=0;i<8;i++)
{
dat[i]=Read_ds1302;
}
CE = 0;
}*/
void initds1302()
{
unsigned char dat ;
unsigned char code init[]={0x00,0x56,0x20,0x28,0x02,0x05,0x18}; //2018 2 16 20 20 00
CE = 0;
SCK = 0;
dat=Read_ds1302_CE(0);
if((dat&0x80)!=0)
{
Write_ds1302_CE(7,0x00);
for(dat=0;dat<8;dat++)
{
Write_ds1302_CE(dat,init[dat]);
}
Write_ds1302_CE(7,0x80);
}
}
void display(unsigned char a,unsigned char b,unsigned char c,unsigned char d) //數碼管刷新函數
{
static unsigned char i = 0;
P2 = 0xFF;
switch(i)//調用不帶標點的數組
{
case 0:Qian = 1;Bai = 1;Shi = 1;Ge = 0;i++;P2 = Smg[a];break;
case 1:Qian = 1;Bai = 1;Shi = 0;Ge = 1;i++;P2 = Smg[b];break;
case 2:Qian = 1;Bai = 0;Shi = 1;Ge = 1;i++;P2 = Smg[c];break;
case 3:Qian = 0;Bai = 1;Shi = 1;Ge = 1;i=0;P2 = Smg[d];break;
default:break;
}
}
void displayI(unsigned char a,unsigned char b,unsigned char c,unsigned char d) //數碼管刷新函數代表點
{
static unsigned char i = 0;
P2 = 0xFF;
switch(i)//調用不帶標點的數組
{
case 0:Qian = 1;Bai = 1;Shi = 1;Ge = 0;i++;P2 = Smg[a];break;
case 1:Qian = 1;Bai = 1;Shi = 0;Ge = 1;i++;P2 = SmgI[b];break;
case 2:Qian = 1;Bai = 0;Shi = 1;Ge = 1;i++;P2 = SmgI[c];break;
case 3:Qian = 0;Bai = 1;Shi = 1;Ge = 1;i=0;P2 = Smg[d];break;
default:break;
}
}
void keycan()
{
static unsigned char keybuf[]={0xFF,0xFF};
keybuf[0]=(keybuf[0]<<1)|KEY1;
keybuf[1]=(keybuf[1]<<1)|KEY2;
if(keybuf[0]==0xFF)
{
set0 = 1;
}
else if(keybuf[0]==0x00)
{
set0 = 0;
}
else
{}
if(keybuf[1]==0xFF)
{
set1 = 1;
}
else if(keybuf[1]==0x00)
{
set1 = 0;
}
else
{}
}
void keyset()
{
if(set0!=backup0)
{
backup0 = set0;
if(set0==0)
{
flg0++;
if(flg0>5)
{
flg0=0;
}
}
}
switch(flg0)
{
case 1: P2 = 0xFF;Qian = 1;Bai = 1;Shi = 1;Ge = 0;P2 = Smg[SmgTmp[0]];//小時的個位
P2 = 0xFF;Qian = 1;Bai = 1;Shi = 0;Ge = 1;P2 = SmgI[SmgTmp[1]];break; //小時的十位
case 2: P2 = 0xFF;Qian = 1;Bai = 0;Shi = 1;Ge = 1;P2 = SmgI[SmgTmp[2]];//分鐘的個 位
P2 = 0xFF;Qian = 0;Bai = 1;Shi = 1;Ge = 1;P2 = Smg[SmgTmp[3]];break;//分鐘的十位
case 3: P2 = 0xFF;Qian = 1;Bai = 1;Shi = 1;Ge = 0;P2 = Smg[SmgTmp[4]];//月份的個位
P2 = 0xFF;Qian = 1;Bai = 1;Shi = 0;Ge = 1;P2 = Smg[SmgTmp[5]];break;//月份的十位
case 4: P2 = 0xFF;Qian = 1;Bai = 0;Shi = 1;Ge = 1;P2 = Smg[SmgTmp[6]];//日期的個位
P2 = 0xFF;Qian = 0;Bai = 1;Shi = 1;Ge = 1;P2 = Smg[SmgTmp[7]];break;//日期十位
case 5: Write_ds1302_CE(7,0x00);
Write_ds1302_CE(1,SmgTmp[1]<<4|SmgTmp[0]);
Write_ds1302_CE(2,SmgTmp[3]<<4|SmgTmp[2]);
Write_ds1302_CE(3,SmgTmp[5]<<4|SmgTmp[4]);
Write_ds1302_CE(4,SmgTmp[7]<<4|SmgTmp[6]);
Write_ds1302_CE(7,0x80);
flg0 = 0;
default:break;
}
if(flg0!=0)
{
if(set1!=backup1)
{
backup1 = set1;
if(set1==0)
{
switch(flg0)
{
case 1: Tmp[0]=(SmgTmp[1]*10)+SmgTmp[0];Tmp[0]++;if(Tmp[0]>=60)Tmp[0]=0;SmgTmp[0]=Tmp[0]%10;SmgTmp[1]=Tmp[0]/10;break;
case 2: Tmp[1]=(SmgTmp[3]*10)+SmgTmp[2];Tmp[1]++;if(Tmp[1]>=24)Tmp[1]=0;SmgTmp[2]=Tmp[1]%10;SmgTmp[3]=Tmp[1]/10;break;
case 3: Tmp[2]=(SmgTmp[5]*10)+SmgTmp[4];Tmp[2]++;if(Tmp[2]>=31)Tmp[2]=0;SmgTmp[4]=Tmp[2]%10;SmgTmp[5]=Tmp[2]/10;break;
case 4: Tmp[3]=(SmgTmp[7]*10)+SmgTmp[6];Tmp[3]++;if(Tmp[3]>=12)Tmp[3]=0;SmgTmp[6]=Tmp[3]%10;SmgTmp[7]=Tmp[3]/10;break;
default:break;
}
}
}
}
}
void interruptTime() interrupt 1 //定時器0
{
static unsigned int i;
TH0=T0RH;
TL0=T0RL;
i++;
if(i==6000)
{
i=0;
flg=~flg;
}
if(flg0==0)
{
if(flg == 1)
{
if(gb==0)
{
display(SmgTmp[0],SmgTmp[1],SmgTmp[2],SmgTmp[3]);
}
else
{
displayI(SmgTmp[0],SmgTmp[1],SmgTmp[2],SmgTmp[3]);
}
}
else
{
display(SmgTmp[4],SmgTmp[5],SmgTmp[6],SmgTmp[7]);
}
}
keycan();
}
void interruptUART() interrupt 4 //串口
{
static unsigned char i;
if(RI)
{
RI = 0;
i = SBUF;
SBUF = SmgTmp[i];
}
if(TI)
{
TI = 0;
}
}
復制代碼
作者:
heart請問
時間:
2018-3-5 16:24
按鍵掃描或者數碼管顯示時間,,,,找一找
作者:
創太#銘
時間:
2018-3-5 17:43
第一:數碼管調節時間一個暗一個亮的 這句話是什么意思? 是你調節的時候一個數碼管亮,一個數碼管暗。還是調節的時候閃爍。
第二 :是不是在調節的時候就會這樣,其他使用的時候會嗎?
硬件如果沒有問題, 就查找延時 可是我沒發現
格式我就不多說了
unsigned char flg = 1;//決定顯示日期還是時間
這個是什么意思 !
主程序最好設置輪詢機制不然, 萬一卡死怎么辦。
作者:
lele4090039
時間:
2018-3-6 13:11
創太#銘 發表于 2018-3-5 17:43
第一:數碼管調節時間一個暗一個亮的 這句話是什么意思? 是你調節的時候一個數碼管亮,一個數碼管暗。還 ...
初學者,抱歉。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
福利片在线看
|
国产精品色
|
精品三区
|
国产午夜精品一区二区三区
|
99久久免费观看
|
欧美一级片
|
成人免费在线视频
|
欧美性大战久久久久久久蜜臀
|
2018天天干天天操
|
99pao成人国产永久免费视频
|
成人欧美一区二区三区在线观看
|
欧美老妇交乱视频
|
男女羞羞视频在线观看
|
国产欧美在线
|
www.狠狠干
|
成人亚洲
|
久久久久久99
|
在线观看成人精品
|
啪啪免费网站
|
午夜精品久久久久久久久久久久
|
精品国产一区二区三区观看不卡
|
国产精品伦理一区
|
久久国产99
|
欧美日韩综合一区
|
成人久久一区
|
国产探花在线精品一区二区
|
在线观看免费福利
|
日韩国产中文字幕
|
91视频官网
|
亚洲一区 中文字幕
|
992tv人人草 久久精品超碰
|
亚洲一区二区三区四区五区午夜
|
日韩一区二区三区精品
|
色综合欧美
|
亚洲精品电影网在线观看
|
国产精品久久久久aaaa樱花
|
欧美日韩中文在线
|
一级aaaa毛片
|
免费一级片
|
激情久久久久
|
麻豆av电影网
|