久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8154|回復(fù): 9
收起左側(cè)

51單片機(jī)按鍵點(diǎn)燈 求各位大神該怎么編程

[復(fù)制鏈接]
ID:227569 發(fā)表于 2017-8-22 15:28 | 顯示全部樓層 |閱讀模式
用一個(gè)按鈕,按一下點(diǎn)亮一個(gè)燈,依次點(diǎn)亮八個(gè),按鍵快速切換的狀態(tài)下不閃爍,切換后閃爍三次后常亮,最后要斷電保持,各位大神該怎么編程
回復(fù)

使用道具 舉報(bào)

ID:228806 發(fā)表于 2017-8-22 15:57 | 顯示全部樓層
寫(xiě)一個(gè)按鍵的函數(shù),把點(diǎn)燈的代碼塊放在函數(shù)里面,按鍵就用掃描按鍵方式,這樣就可以實(shí)現(xiàn)了
回復(fù)

使用道具 舉報(bào)

ID:190832 發(fā)表于 2017-8-22 16:24 | 顯示全部樓層
設(shè)置兩個(gè)8位無(wú)符號(hào)變量temp和count,初始值都為0。每次檢測(cè)到按鍵按下count++,如果count==24,結(jié)束所有判斷;否則判斷temp是否等于0,如果temp==0,temp=1,否則temp=<<1;單片機(jī)P口=temp。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-8-22 17:12 | 顯示全部樓層
你描述的不明晰,按字面理解:初次上電燈都不亮,每按一次鍵點(diǎn)亮一個(gè)燈,連續(xù)按鍵燈不閃爍,中途停頓燈閃爍三次后常亮。這里指所有燈閃還是最后一個(gè)燈閃?按滿8次繼續(xù)按鍵是什么狀態(tài)?最后要斷電保持是指斷電后再次得電要保持?jǐn)嚯娗盃顟B(tài)?
回復(fù)

使用道具 舉報(bào)

ID:227569 發(fā)表于 2017-8-22 19:27 | 顯示全部樓層
wulin 發(fā)表于 2017-8-22 17:12
你描述的不明晰,按字面理解:初次上電燈都不亮,每按一次鍵點(diǎn)亮一個(gè)燈,連續(xù)按鍵燈不閃爍,中途停頓燈閃爍 ...

每按一次點(diǎn)一個(gè)燈,不連續(xù)的話就那個(gè)燈閃爍三次后常亮,安滿八次之后回到第一個(gè)燈,斷電保持是保持?jǐn)嚯娗暗臓顟B(tài)
回復(fù)

使用道具 舉報(bào)

ID:227569 發(fā)表于 2017-8-22 19:28 | 顯示全部樓層
master9527 發(fā)表于 2017-8-22 15:57
寫(xiě)一個(gè)按鍵的函數(shù),把點(diǎn)燈的代碼塊放在函數(shù)里面,按鍵就用掃描按鍵方式,這樣就可以實(shí)現(xiàn)了

我知道用數(shù)組,但是閃爍怎么辦
回復(fù)

使用道具 舉報(bào)

ID:190832 發(fā)表于 2017-8-23 08:47 | 顯示全部樓層
hange_v 發(fā)表于 2017-8-22 16:24
設(shè)置兩個(gè)8位無(wú)符號(hào)變量temp和count,初始值都為0。每次檢測(cè)到按鍵按下count++,如果count==24,結(jié)束所有判 ...

鎖存器
回復(fù)

使用道具 舉報(bào)

ID:228922 發(fā)表于 2017-8-23 11:21 | 顯示全部樓層
可以用輪詢或者中斷,輪詢的話就是一直讀開(kāi)關(guān)的IO口,中斷的話要稍微配置一下
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-8-25 13:16 | 顯示全部樓層
wangboyue 發(fā)表于 2017-8-22 19:27
每按一次點(diǎn)一個(gè)燈,不連續(xù)的話就那個(gè)燈閃爍三次后常亮,安滿八次之后回到第一個(gè)燈,斷電保持是保持?jǐn)嚯娗?...

給你寫(xiě)了個(gè)程序,你想要的功能都有。已經(jīng)過(guò)TX-1C實(shí)驗(yàn)板驗(yàn)證通過(guò)。不合意處你自己更改。
/*************************************************************
程序功能:加電待機(jī),按鍵啟動(dòng),LED1~LED8依次點(diǎn)亮,按鍵間隔大于
0.5秒LED閃爍,最多閃爍三次后常亮,第9次按鍵進(jìn)入待機(jī)。每次操作
狀態(tài)數(shù)據(jù)保存在EEPROM,失電或關(guān)機(jī)后再次得電保持之前工作狀態(tài)。
*************************************************************/
#include <AT89X52.H>                                //單片機(jī)頭文件
#include <intrins.h>                                //庫(kù)頭文件
#define uint unsigned int                 //宏定義無(wú)符號(hào)整型數(shù)據(jù)(0-65535)
#define uchar unsigned char         //宏定義無(wú)符號(hào)字符型數(shù)據(jù)(0-255)
/****定義ISP的操作命令*****/
#define RdCommand 0x01                                //讀命令
#define PrgCommand 0x02                                //寫(xiě)命令
#define EraseCommand 0x03                        //擦除命令
#define WaitTime 0x01                                 //定義CPU的等待時(shí)間,寫(xiě)入硬件延時(shí)
/*STC89系列EEPROM寄存器聲明*/
sfr ISP_DATA=0xe2;                                        //0000,0000 EEPROM數(shù)據(jù)寄存器
sfr ISP_ADDRH=0xe3;                                        //0000,0000 EEPROM地址高字節(jié)
sfr ISP_ADDRL=0xe4;                                        //0000,0000 EEPROM地址第字節(jié)
sfr ISP_CMD=0xe5;                                        //xxxx,xx00 EEPROM命令寄存器
sfr ISP_TRIG=0xe6;                                        //0000,0000 EEPRPM命令觸發(fā)寄存器
sfr ISP_CONTR=0xe7;                                        //0000,x000 EEPROM控制寄存器
/********端口定義************/
sbit LED1=P1^0;                                        //發(fā)光管端口定義
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
sbit key=P3^6;                                        //按鍵端口定義       
/********變量及函數(shù)聲明************/
uchar num=0;                                        //鍵值
uchar count1=0,count2=0;        //中斷計(jì)數(shù)
bit Twinkle=0;                                        //閃爍標(biāo)志

void keyscan();                                        //按鍵掃描程序
void display();                                        //顯示程序
void Timer0Init();                                //初始化定時(shí)器
void ISP_IAP_enable();                                //打開(kāi) ISP,IAP 功能
void ISP_IAP_disable();                                //關(guān)閉 ISP,IAP 功能
void ISPgoon();                                                //公用的觸發(fā)代碼
uchar byte_read(uint byte_addr);        //字節(jié)讀
void SectorErase(uint sector_addr);        //扇區(qū)擦除
void byte_write(uint byte_addr, uchar original_data);        //字節(jié)寫(xiě)

/********主函數(shù)************/
void main()       
{
        Timer0Init();                                        //定時(shí)器初始化
        num=byte_read(0x2000);                //程序開(kāi)始時(shí)讀取EEPROM中數(shù)據(jù)
        if(num>=9)                                                //如果num>=9
        {
                num=0;                                                //num=0
        }
        while(1)       
        {
                keyscan();                                //按鍵識(shí)別子程序
                display();                                //顯示子程序
        }
}
/**********按鍵掃描程序*********/
void keyscan()
{
        static bit key_sign=0;                //按鍵有效標(biāo)志
        static uchar count=0;                //計(jì)數(shù)變量                       
        if(key==0)                                        //檢測(cè)按鍵如果為0
        {
                count++;                                //消抖計(jì)數(shù)
                if(count>=100)                        //100次檢測(cè)按鍵如果為0
                {                       
                        count=100;                        //最大數(shù)限制
                        if(key_sign==0)                //按鍵有效標(biāo)志為0
                        {
                                key_sign=1;                //按鍵有效標(biāo)志置1
                                num++;                        //
                                if(num>=9)
                                        num=0;
                                SectorErase(0x2000);//擦除EEPROM扇區(qū)中的數(shù)據(jù)
                                byte_write(0x2000,num); //重新寫(xiě)入數(shù)據(jù)
                                count1=0;                                        //中斷計(jì)數(shù)1清0
                                count2=0;                                        //中斷計(jì)數(shù)2清0
                                Twinkle=0;                                        //閃爍標(biāo)志清0
                        }
                }
        }
        else
        {
                if(key_sign==1)
                {
                        if(num>0)
                                TR0 = 1;                                        //開(kāi)定時(shí)器
                        else
                                TR0 = 0;                                        //關(guān)定時(shí)器
                        key_sign=0;                                //按鍵有效標(biāo)志清0
                }
                count=0;                                                //消抖計(jì)數(shù)清0
        }
}
/**********顯示程序*********/
void display()       
{
        switch(num)                                        //多重分支
        {
                case 0: P1=0XFF;
                break;

                case 1:
                        P1=0XFF;
                        if(Twinkle==1) LED1=1;
                        else LED1=0;
                break;

                case 2:
                        P1=0XFE;
                        if(Twinkle==1) LED2=1;
                        else LED2=0;
                break;

                case 3:
                        P1=0XFC;
                        if(Twinkle==1) LED3=1;
                        else LED3=0;
                break;

                case 4:
                        P1=0XF8;
                        if(Twinkle==1) LED4=1;
                        else LED4=0;
                break;

                case 5:
                        P1=0XF0;
                        if(Twinkle==1) LED5=1;
                        else LED5=0;
                break;

                case 6:
                        P1=0XE0;
                        if(Twinkle==1) LED6=1;
                        else LED6=0;
                break;

                case 7:  
                        P1=0XC0;
                        if(Twinkle==1) LED7=1;
                        else LED7=0;
                break;

                case 8:
                        P1=0X80;
                        if(Twinkle==1) LED8=1;
                        else LED8=0;
                break;
        }
}
/*********定時(shí)器0初始化**************/
void Timer0Init(void)                //50毫秒@12.000MHz
{
        TMOD= 0x01;                                //設(shè)置定時(shí)器模式
        TL0 = 0xB0;                                //設(shè)置定時(shí)初值
        TH0 = 0x3C;                                //設(shè)置定時(shí)初值
//        TR0 = 1;                                //定時(shí)器0開(kāi)始計(jì)時(shí)
        EA=1;                                        //開(kāi)總中斷
        ET0=1;                                        //開(kāi)定時(shí)器0中斷       
}
/*********中斷服務(wù)程序**************/
void timer0() interrupt        1
{
        TL0 = 0xB0;                                //設(shè)置定時(shí)初值
        TH0 = 0x3C;                                //設(shè)置定時(shí)初值
        count1++;
        if(count1>=10)                        //0.5秒
        {
                count1=0;
                Twinkle=~Twinkle;        //閃爍標(biāo)志取反
                count2++;
                if(count2>=6)                //閃爍三次
                {
                        count2=0;
                        TR0 = 0;                //關(guān)定時(shí)器
                }
        }
}
/* ================ 打開(kāi) ISP,IAP 功能 ================= */
void ISP_IAP_enable()
{
        EA = 0;       /* 關(guān)中斷   */
        ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
        ISP_CONTR = ISP_CONTR | WaitTime; /* 寫(xiě)入硬件延時(shí) */
        ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
}
/* =============== 關(guān)閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable()
{
        ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
        ISP_TRIG = 0x00;
        EA   =   1;   /* 開(kāi)中斷 */
}
/* ================ 公用的觸發(fā)代碼 ==================== */
void ISPgoon()
{
        ISP_IAP_enable();   /* 打開(kāi) ISP,IAP 功能 */
        ISP_TRIG = 0x46;  /* 觸發(fā)ISP_IAP命令字節(jié)1 */
        ISP_TRIG = 0xb9;  /* 觸發(fā)ISP_IAP命令字節(jié)2 */
        _nop_();
}
/* ==================== 字節(jié)讀 ======================== */
uchar byte_read(uint byte_addr)
{
        ISP_ADDRH = (uchar)(byte_addr >> 8);/* 地址賦值 */
        ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
        ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
        ISP_CMD   = ISP_CMD | RdCommand; /* 寫(xiě)入讀命令 */
        ISPgoon();       /* 觸發(fā)執(zhí)行  */
        ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
        return (ISP_DATA);    /* 返回讀到的數(shù)據(jù) */
}
/* ================== 扇區(qū)擦除 ======================== */
void SectorErase(uint sector_addr)
{
        uint iSectorAddr;
        iSectorAddr = (sector_addr & 0xfe00); /* 取扇區(qū)地址 */
        ISP_ADDRH = (uchar)(iSectorAddr >> 8);
        ISP_ADDRL = 0x00;
        ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
        ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
        ISPgoon();       /* 觸發(fā)執(zhí)行  */
        ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
}
/* ==================== 字節(jié)寫(xiě) ======================== */
void byte_write(uint byte_addr, uchar original_data)
{
        ISP_ADDRH = (uchar)(byte_addr >> 8);  /* 取地址  */
        ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
        ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
        ISP_CMD  = ISP_CMD | PrgCommand;  /* 寫(xiě)命令2 */
        ISP_DATA = original_data;   /* 寫(xiě)入數(shù)據(jù)準(zhǔn)備 */
        ISPgoon();       /* 觸發(fā)執(zhí)行  */
        ISP_IAP_disable();     /* 關(guān)閉IAP功能 */
}

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
wangboyue + 5 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 极品久久| 特黄特黄a级毛片免费专区 av网站免费在线观看 | 拍真实国产伦偷精品 | 国产区在线观看 | 日韩小视频在线 | 91色在线视频 | 欧美一a | 精品视频一区二区三区 | av免费在线播放 | 日韩欧美亚洲 | 日本在线一区二区三区 | 国产成人在线视频播放 | 亚洲黄色视屏 | 精品一区二区三区入口 | 美女操网站 | 亚洲视频在线看 | 午夜影院中文字幕 | 爱操影视 | 国产精品女人久久久 | 亚洲国产成人精品久久 | 免费在线国产视频 | 四虎影院在线免费观看 | 中文字幕免费视频 | 亚洲理论在线观看电影 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 欧美日韩一区二区在线观看 | 国产精品一区二区在线 | 精品成人免费一区二区在线播放 | 国产精品久久久久久久久久久久久 | 日韩精品免费视频 | 91精品国产欧美一区二区成人 | 国产一区二区三区在线 | 一区二区在线看 | 影音先锋成人资源 | 国产福利视频网站 | 在线视频 中文字幕 | 美女三区 | 日本亚洲欧美 | 欧美视频二区 | 欧美一区二区在线免费观看 | 一级毛片免费看 |