欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機中斷掃描數碼管顯示程序
[打印本頁]
作者:
506282027
時間:
2017-8-5 15:55
標題:
單片機中斷掃描數碼管顯示程序
/*
按下S2數碼管數值加1,按下S3數碼管數值減1
且長按數字會累加或累減
與軟件延時方式去做數碼管動態掃描的區別:
軟件延時掃描,當按下按鍵時數碼管只會顯示1位數
中斷方式掃描,當按下按鍵時不影響數碼管應顯示的位數
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7; //位定義數碼管位選鎖存器接口
sbit du = P2^6; //位定義數碼管位選鎖存器接口
sbit key_s2 = P3^0;//S2按鍵位定義
sbit key_s3 = P3^1;//S3按鍵位定義
uchar i;//數碼管顯示位選變量
uchar num[] = {0, 0, 0, 0}; //百十個位,總數暫存數組
//數碼管0~9段選表
uchar code leddata[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
//數碼管1~3位選表
uchar code DPY[]={0xfe, 0xfd, 0xfb};
//毫秒級延時函數
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
//中斷服務特殊功能寄存器配置
void init()
{
TMOD = 0x01; //定時器16為計數工作模式
TH0 =0xED;
TL0 =0xFF; //5ms
ET0 = 1; //開定時器0中斷
TR0 = 1;//啟動定時器0
EA = 1; //開總中斷
}
void main()
{
init();//初始化定時器0
while(1)
{
if(key_s2 == 0)//判斷S2是否按鍵
{
delay(5);//軟件延時
if(key_s2 == 0)
{
if(num[3] == 999)num[3]=0;//當等于255時不再加1
delay(300);//軟件延時
num[3]++; //加1
}
// while(!key_s2); //松手檢測
}
if(key_s3 == 0)//判斷S3是否按鍵
{
delay(5);//軟件延時
if(key_s3 == 0)
{
if(num[3] != 0) //當等于0時,不再減1
delay(300);//軟件延時
num[3]--; //減1
}
//while(!key_s3); //松手檢測
}
}
}
//定時器0中斷服務程序 做數碼管動態掃描,不用軟件延時
void timer0() interrupt 1
{
TH0 =0xED;
TL0 =0xFF; //5ms 模式1非自動重裝需要手動重裝
if(i < 3)
{
num[0] = num[3] / 100; //計算百位
num[1] = num[3] % 100 / 10; //計算十位
num[2] = num[3] % 10;//計算個位
P0 = 0xff; //清除斷碼
we = 1;//打開位選
P0 = DPY[ i]; we = 0; //關閉位選 P0 = 0xff; //清除斷碼 du = 1; //打開段選 P0 = leddata[num[ i]]; du = 0; //關閉段選 i++;//顯示下一位 } else { i = 0; }
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1