久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
單片機(jī)時(shí)間片輪詢法(數(shù)碼管顯示—中斷消抖)源程序
[打印本頁(yè)]
作者:
白州小李
時(shí)間:
2019-12-3 13:23
標(biāo)題:
單片機(jī)時(shí)間片輪詢法(數(shù)碼管顯示—中斷消抖)源程序
時(shí)間片輪詢法(數(shù)碼管顯示——中斷消抖)
本文章是關(guān)于運(yùn)用時(shí)間片輪詢法(前后臺(tái)系統(tǒng)),完成對(duì)時(shí)鐘的簡(jiǎn)單控制,同時(shí)通過(guò)中斷完成對(duì)按鍵的消失抖,顯示程序中靜態(tài)變量變量的定義是關(guān)鍵,
對(duì)按鍵消抖應(yīng)該是未按下(抬起——1)——按下(0)——抬起(1),之間需要20ms左右的延時(shí)消抖。假如按鍵按下(k1 = 0),同時(shí)由于(keydelay<<1)|k1,16ms之后keydelay = 0x00;如果按鍵未按下(k1 = 1),(keydelay<<1)|k1,16ms之后keydelay = oxff,及k1一直都未按下。
電路原理圖如下:
捕獲2.PNG
(58.98 KB, 下載次數(shù): 49)
下載附件
2019-12-3 13:22 上傳
主函數(shù)
#include "reg52.h"
//#include "Delay.h"
#include "Display.h"
#include "Timer.h"
void main()
{
Timer0Init(); //中斷初始化
while(1)
{
Datapros();
TaskProcess();
KeyProcess();
}
}
Displsy.c模塊函數(shù)
#include "Display.h"
//#include "Delay.h"
#include "Timer.h"
unsigned char Bit_Selection[8]={0xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0x7f}; //位選
unsigned char smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段選0123456789
unsigned char hour = 20,min = 51,sec = 58; //定義變量
unsigned char DisplayData[8];
bit keyback = 1;//按鍵之前的狀態(tài)
bit keystay = 1; //按鍵現(xiàn)在的狀態(tài)
void DigDisplay()
{
static unsigned char i; //定義靜態(tài)變量
P0 = 0x00; //消影
P2 = Bit_Selection[i]; //位選
P0 = DisplayData[i]; //段選
i++;
if(i==8)
{
i = 0;
}
}
void Datapros()
{
DisplayData[0]=smgduan[hour/10];
DisplayData[1]=smgduan[hour%10];
DisplayData[2]=0x40;
DisplayData[3]=smgduan[min/10];
DisplayData[4]=smgduan[min%10];
DisplayData[5]=0x40;
DisplayData[6]=smgduan[sec/10];
DisplayData[7]=smgduan[sec%10];
}
void Clock_Chang()//時(shí)間自加函數(shù)
{
sec++; //每一秒鐘執(zhí)行一次
if(sec==60)
{
sec = 0;
min++;
if(min==60)
{
min = 0;
hour++;
if(hour==24)
hour = 0;
}
}
}
void KeyProcess()
{
static unsigned char keymin;
keymin=min;
if(keystay!=keyback)//判斷按鍵現(xiàn)在狀態(tài)與之前狀態(tài)是否有變化
{
if(keyback==0) //如果之前狀態(tài)是零,則說(shuō)明按鍵有觸發(fā)
{
keymin++;
if(keymin==60)
keymin=0;
}
}
min=keymin;
keyback = keystay; //按鍵狀態(tài)賦值
}
void Keyscan()//按鍵掃描,在中斷中處理
{
static unsigned char keydelay=0xff;
keydelay=(keydelay<<1)|k1; //通過(guò)Keydelay移位延時(shí),每2ms移動(dòng)一位
//keydelay=(keydelay<<1)|k2;
//keydelay=(keydelay<<1)|k3;
if(keydelay==0x00) //如果16ms后keydelay=0x00,則按鍵狀態(tài)置為0(按下)
{
keystay = 0;
}
if(keydelay==0xff)
{
keystay = 1;
}
}
void ClockProcess()//鬧鐘判斷函數(shù)
{
unsigned char nhour = 20,nmin = 52,nsec = 1; //定義變量
if((nsec==sec)&&(nmin==min)&&(nhour==hour))
{
beep=~beep;
D1 = 0;
}
if(sec==nsec+2)//兩秒鐘之后在發(fā)生變化
{
beep=~beep;
D1 = 1;
}
}
Timer.c模塊函數(shù)
#include "Timer.h"
#include "Display.h"
//#include "Delay.h"
typedef struct SUSPEND_VARIABLE
{
unsigned char Flag; // 程序運(yùn)行標(biāo)記:0-不運(yùn)行,1運(yùn)行
unsigned long Time; // 計(jì)時(shí)器
unsigned long ItvTime; // 任務(wù)運(yùn)行間隔時(shí)間
void (*Function)(void); // 要運(yùn)行的任務(wù)函
}VARIABLE;
VARIABLE TaskCount[] =
{
{0,5,5,DigDisplay},//顯示
{0,1000,1000,Clock_Chang},//時(shí)鐘秒自加
{0,1000,1000,ClockProcess},//鬧鐘
{0,2,2,Keyscan},//按鍵掃描
};//聲明
void Timer0Init()
{
TMOD = 0X01; //選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。
TH0 = 0Xfc; //給定時(shí)器賦初值,定時(shí)100us
TL0 = 0X18; //給定時(shí)器賦初值如何是FF,定時(shí)1us
ET0 = 1; //打開(kāi)定時(shí)器0中斷允許
EA = 1; //打開(kāi)總中斷
TR0 = 1; //打開(kāi)定時(shí)器
}
void Timer0() interrupt 1
{
unsigned char i;[align=left][color=#007000][backcolor=transparent][font=Tahoma,&][size=14px] [/size][/font][/backcolor][/color][/align][align=left][color=#007000][backcolor=transparent][font=Tahoma,&][size=14px]//#define COUNT 4 //中斷函數(shù)運(yùn)行函數(shù)數(shù)量 [/size][/font][/backcolor][/color][/align]
TH0 = 0Xfc; //給定時(shí)器賦初值,定時(shí)100us
TL0 = 0x18;
for(i = 0;i<COUNT;i++) //循環(huán)掃描,判斷哪一個(gè)任務(wù)定時(shí)時(shí)間已到
{
if(TaskCount[i].Time)
{
TaskCount[i].Time--; //如果定時(shí)時(shí)間已到則清零,標(biāo)記置一
if(TaskCount[i].Time==0)
{
TaskCount[i].Flag = 1;
TaskCount[i].Time = TaskCount[i].ItvTime; // 恢復(fù)計(jì)時(shí)器值,從新下一次
}
}
}
}
void TaskProcess() //處理函數(shù)
{
unsigned char i;
for (i=0; i<COUNT; i++) // 循環(huán)判斷那一個(gè)任務(wù)需要運(yùn)行,逐個(gè)任務(wù)時(shí)間處理
{
if (TaskCount[i].Flag) // 時(shí)間不為0
{
TaskCount[i].Function(); // 運(yùn)行任務(wù)
TaskCount[i].Flag = 0; // 標(biāo)志清0
}
}
}
復(fù)制代碼
作者:
lanxichang
時(shí)間:
2021-4-9 23:29
沒(méi)有貼出來(lái)原程序啊
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美日韩a
|
成人特区
|
台湾佬伊人
|
欧美精品免费观看二区
|
国产人成精品一区二区三
|
午夜在线影院
|
四虎影院免费在线播放
|
色婷综合网
|
一级中国毛片
|
久久久久久av
|
国产精品免费一区二区三区
|
久久精品成人一区
|
国产色片在线
|
国产一区二区在线看
|
成人午夜精品
|
精品欧美乱码久久久久久
|
日本三级电影在线观看视频
|
午夜精品在线观看
|
欧美三级在线
|
亚洲一区二区三区免费在线观看
|
日韩网站在线
|
日韩精品一区二区三区在线观看
|
97视频在线观看免费
|
国产999精品久久久 日本视频一区二区三区
|
精品国产亚洲一区二区三区大结局
|
亚洲国产二区
|
日韩欧美精品一区
|
国产伦精品一区二区三毛
|
国产成人精品一区二区
|
久久精品久久综合
|
国产精品视频偷伦精品视频
|
久久精品在线免费视频
|
午夜在线视频一区二区三区
|
91在线网
|
久草网视频
|
久久久久国产一区二区三区四区
|
一级片av
|
狠狠干美女
|
免费高潮视频95在线观看网站
|
国产免费黄网
|
亚洲高清视频一区二区
|