日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数

發布時間:2024/9/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#include

#include "DS1302.H"

sbit K_S = P1^0;????//顯示模式sbit K_M = P1^1;????//修改sbit K_I = P1^2;????//加sbit K_D = P1^3;????//減

sbit Spk = P1^7;????//蜂鳴器

//共陽碼表unsigned char code TABLE[]={

0xC0,/*0*/

0xF9,/*1*/

0xA4,/*2*/

0xB0,/*3*/

0x99,/*4*/

0x92,/*5*/

0x82,/*6*/

0xF8,/*7*/

0x80,/*8*/

0x90,/*9*/

0xBF,/*-*/

};

unsigned char SEG[6];?????????????????? //6位數碼管對應緩沖區unsigned char state = 0;????????????????//顯示模式位unsigned char modify = 0;?????????????? //修改模式位

#define MC_H????25??????????????????????//修改狀態下閃爍頻率,越大閃爍越慢unsigned char mc = 0;?????????????????? //閃爍計時

//延時函數,每單位1msvoid Delay(unsigned int t)

{

unsigned int a,b;

for (a=0; a

for (b=0; b<122; b++)

;

}

//6位數碼管顯示函數void Display(void)

{

unsigned char i;

SYSTEMTIME T;

DS1302_GetTime_ALL(&T);???????????????????? //讀時間數據

if (modify == 0 && T.Minute == 0 && T.Second < 2)

{?????????????????????????????????????????? //整點報時,修改模式下不報,只響2秒????????Spk = 0;

} else {

Spk = 1;

}

if (state == 0)???????????????????????????? //顯示時分秒????{

SEG[0] = TABLE[T.Hour / 10];????????????//時十位????????SEG[1] = TABLE[T.Hour % 10] & 0x7F;???? //時個位,小數點點亮做分隔????????SEG[2] = TABLE[T.Minute / 10];??????????//分十位????????SEG[3] = TABLE[T.Minute % 10] & 0x7F;?? //分個位,小數點點亮做分隔????????SEG[4] = TABLE[T.Second / 10];??????????//秒十位????????SEG[5] = TABLE[T.Second % 10] & 0x7F;?? //秒個位,小數點點亮做分隔????} else if (state == 1)??????????????????????//顯示年份????{

SEG[0] = 0xFF;??????????????????????????//不顯示????????SEG[1] = TABLE[T.tYear / 10];?????????? //年千位????????SEG[2] = TABLE[T.tYear % 10];?????????? //年百位????????SEG[3] = TABLE[T.Year / 10];????????????//年十位????????SEG[4] = TABLE[T.Year % 10];????????????//年個位????????SEG[5] = 0xFF;??????????????????????????//不顯示????} else if (state == 2)??????????????????????//顯示月日星期????{

SEG[0] = TABLE[T.Month / 10];?????????? //月十位????????SEG[1] = TABLE[T.Month % 10] & 0x7F;????//月個位,小數點點亮做分隔????????SEG[2] = TABLE[T.Day / 10];???????????? //日十位????????SEG[3] = TABLE[T.Day % 10];???????????? //日個位????????SEG[4] = TABLE[10];???????????????????? //符號‘-’做分隔????????SEG[5] = TABLE[T.Week - 1];???????????????? //星期????}

if (modify && (mc > MC_H)) {????????//修改狀態下,對應位閃爍,????????switch (modify)???????????????? //通過查詢當前修改狀態確定閃爍位。????????{

case 1:???????????????????????? //時閃爍????????????SEG[0] = SEG[1] = 0xFF;???? //對于共陽管,段碼寫0xFF即關閉不顯示,得到閃爍效果????????????break;

case 2:???????????????????????? //分閃爍????????????SEG[2] = SEG[3] = 0xFF;

break;

case 3:???????????????????????? //秒閃爍????????????SEG[4] = SEG[5] = 0xFF;

break;

case 4:???????????????????????? //年高兩位閃爍????????????SEG[1] = SEG[2] = 0xFF;

break;

case 5:???????????????????????? //年低兩位閃爍????????????SEG[3] = SEG[4] = 0xFF;

break;

case 7:???????????????????????? //月閃爍????????????SEG[0] = SEG[1] = 0xFF;

break;

case 8:???????????????????????? //日閃爍????????????SEG[2] = SEG[3] = 0xFF;

break;

case 9:???????????????????????? //星期閃爍????????????SEG[5] = 0xFF;

break;

}

}

for (i=0; i<6; i++)???????????????? //數碼管動態掃描????{

P0 = SEG[ i ];????????????????????//送段碼????????P2 = ~(0x20 >> i);??????????????//送位碼????????Delay(1);

P2 = 0xFF;??????????????????????//消影????}

if (++mc > 2 * MC_H)

mc = 0;

}

//按鍵處理函數void Key(void)

{

unsigned char t;

P1 |= 0x0F;

if (!K_S)?????????????????????????????????????? //按鍵按下????{

Delay(10);??????????????????????????????????//延時消抖????????if (!K_S)?????????????????????????????????? //按鍵確實按下????????{

if (!modify)????????????????????????????//非修改模式下用于切換顯示模式????????????{

if (++state > 2)

state = 0;

}

if (modify)???????????????????????????? //如果在修改模式下,????????????{

modify = 0;???????????????????????? //就退出修改模式,????????????????DS1302_WriteData(0x8e,0x80);????????//并打開寫保護????????????}

}

while (!K_S)????????????????????????????????//等待按鍵釋放????????????Display();

}

if (!K_M)

{

Delay(10);

if (!K_M)

{

if (modify == 0)????????????????????????//進入修改模式,????????????{

modify = 3 * state + 1;???????????? //根據顯示模式確定modify初值,時分秒123,年45,月日星期789????????????????DS1302_WriteData(0x8e,0x00);????????//關閉寫保護????????????} else {

modify++;

switch (state)??????????????????????//根據顯示模式確定modify初值????????????????{

case 0:

case 2:

if (modify > (3 * state + 3))?? //時分秒,日星期模式下每個是3位????????????????????{

modify = 0;

DS1302_WriteData(0x8e,0x80);//打開寫保護????????????????????}

break;

case 1:

if (modify > (3 * state + 2))?? //年模式下是2位????????????????????{

modify = 0;

DS1302_WriteData(0x8e,0x80);//打開寫保護????????????????????}

break;

}

}

}

while (!K_M)

Display();

}

if (!K_I)

{

Delay(10);

if (!K_I)

{

switch (modify)???????????????????????? //根據當前修改狀態確定修改什么值????????????{

case 0:

break;

case 1:???????????????????????????????? //小時????????????????t = BCD2DEC(DS1302_ReadData(DS1302_HOUR + 1));

if (++t > 23)?????????????????????? //不能超過23????????????????????t = 0;

DS1302_WriteData(DS1302_HOUR, DEC2BCD(t));

break;

case 2:???????????????????????????????? //分????????????????t = BCD2DEC(DS1302_ReadData(DS1302_MINUTE + 1));

if (++t > 59)?????????????????????? //不能超過59????????????????????t = 0;

DS1302_WriteData(DS1302_MINUTE, DEC2BCD(t));

break;

case 3:???????????????????????????????? //秒????????????????t = BCD2DEC(DS1302_ReadData(DS1302_SECOND + 1));

if (++t > 59)

t = 0;

DS1302_WriteData(DS1302_SECOND, DEC2BCD(t));

break;

case 4:???????????????????????????????? //年高兩位????????????????t = BCD2DEC(DS1302_ReadData(DS1302_TYEAR + 1));

if (++t > 29)?????????????????????? //不能超過29,最小19????????????????????t = 19;

DS1302_WriteData(DS1302_TYEAR, DEC2BCD(t));

break;

case 5:???????????????????????????????? //年低兩位????????????????t = BCD2DEC(DS1302_ReadData(DS1302_YEAR + 1));

if (++t > 99)?????????????????????? //不能超過99????????????????????t = 0;

DS1302_WriteData(DS1302_YEAR, DEC2BCD(t));

break;

case 7:???????????????????????????????? //不能超過12????????????????t = BCD2DEC(DS1302_ReadData(DS1302_MONTH + 1));

if (++t > 12)

t = 1;

DS1302_WriteData(DS1302_MONTH, DEC2BCD(t));

break;

case 8:???????????????????????????????? //日????????????????t = BCD2DEC(DS1302_ReadData(DS1302_DAY + 1));

if (++t > DS1302_GetTheDay())?????? //最大日期不能超過當月最大值????????????????????t = 1;

DS1302_WriteData(DS1302_DAY, DEC2BCD(t));

break;

case 9:???????????????????????????????? //星期????????????????t = BCD2DEC(DS1302_ReadData(DS1302_WEEK + 1));

if (++t > 7)????????????????????????//不能超過7????????????????????t = 1;

DS1302_WriteData(DS1302_WEEK, DEC2BCD(t));

break;

}

}

while (!K_I)

Display();

}

if (!K_D)?????? //減????{

Delay(10);

if (!K_D)

{

switch (modify)

{

case 0:

break;

case 1:???? //小時????????????????t = BCD2DEC(DS1302_ReadData(DS1302_HOUR + 1));

if (t > 0)

t--;

else

t = 23;

DS1302_WriteData(DS1302_HOUR, DEC2BCD(t));

break;

case 2:???? //分????????????????t = BCD2DEC(DS1302_ReadData(DS1302_MINUTE + 1));

if (t > 0)

t--;

else

t = 59;

DS1302_WriteData(DS1302_MINUTE, DEC2BCD(t));

break;

case 3:???? //秒????????????????t = BCD2DEC(DS1302_ReadData(DS1302_SECOND + 1));

if (t > 0)

t--;

else

t = 59;

DS1302_WriteData(DS1302_SECOND, DEC2BCD(t));

break;

case 4:???? //年高兩位????????????????t = BCD2DEC(DS1302_ReadData(DS1302_TYEAR + 1));

if (t > 19)

t--;

else

t = 29;

DS1302_WriteData(DS1302_TYEAR, DEC2BCD(t));

break;

case 5:???? //年低兩位????????????????t = BCD2DEC(DS1302_ReadData(DS1302_YEAR + 1));

if (t > 0)

t--;

else

t = 99;

DS1302_WriteData(DS1302_YEAR, DEC2BCD(t));

break;

case 7:???? //月????????????????t = BCD2DEC(DS1302_ReadData(DS1302_MONTH + 1));

if (t > 1)

t--;

else

t = 12;

DS1302_WriteData(DS1302_MONTH, DEC2BCD(t));

break;

case 8:???? //日????????????????t = BCD2DEC(DS1302_ReadData(DS1302_DAY + 1));

if (t > 1)

t--;

else

t = DS1302_GetTheDay();

DS1302_WriteData(DS1302_DAY, DEC2BCD(t));

break;

case 9:???? //星期????????????????t = BCD2DEC(DS1302_ReadData(DS1302_WEEK + 1));

if (t > 1)

t--;

else

t = 7;

DS1302_WriteData(DS1302_WEEK, DEC2BCD(t));

break;

}

}

while (!K_D)

Display();

}

}

//主函數void main(void)

{

Spk = 1;????????????????????????//關蜂鳴器

DS1302_Init();??????????????????//1302初始化

while (1)?????????????????????? //主循環????{

Display();??????????????????//顯示????????Key();??????????????????????//按鍵處理

}

}

總結

以上是生活随笔為你收集整理的四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。