四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数
#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();??????????????????????//按鍵處理
}
}
總結
以上是生活随笔為你收集整理的四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql root 访问被拒绝_用户'
- 下一篇: xshell执行结果到文本_xshell