LCD1602動態顯示按鍵設置數據99倒數


一、程序源碼:

#include "reg52.h"    //此文件中定義了單片機的一些特殊功能寄存器


#define uint unsigned int    //定義常用數據類型替代碼
#define uchar unsigned char
#define dat P0                        //定義LCD1602的數據口為P0

sbit k0=P2^0;                        //定義K0按鍵為P20
sbit k1=P2^1;                        //定義K0按鍵為P21
sbit k2=P2^2;                        //定義K0按鍵為P22
sbit k3=P2^3;                        //定義K0按鍵為P23
sbit rs=P1^4;                        //定義RS口為P14
sbit rw=P1^5;                        //定義RW口為P15
sbit e=P1^6;                        //定義E口為P16

uchar busy;                         //1602判忙標志
uchar table0[16]={"0123456789"};
uchar table1[16]={"Begin:"};

uint i=0;
uint j=0;
uint temp;
uchar key_mode=0;

int k=99;

void delay(unsigned int i)            
{
    while(i--);
}

void delay_1ms(void)                //延時程序
{
    uchar i,j;
    for(i=0;i<10;i++)
    for(j=0;j<20;j++); 
}

void busy_1602(void)                //查詢忙碌標志信號程序
{
    do
    {
        e=0;
        rw=1;
        rs=0;
        e=1;
        busy=dat;
        e=0;    
        delay_1ms();
    } while(busy&&0x10==1);
}

void com_1602(uchar a)                //寫指令到LCM程序
{
       busy_1602();
       e=0;
       rw=0;
       rs=0;
       e=1;
       dat=a;
       e=0;
}

void dat_1602(uchar a)                //寫數據到LCM程序
{
       busy_1602();
       e=0;
       rw=0;
       rs=1;
       e=1;
       dat=a;
       e=0;
}

void int_1602(void)                    //啟動LCM程序
{
       com_1602(0x38); 
       com_1602(0x0c);
       com_1602(0x06);
       com_1602(0x01);
}

void displaySet(int d)            
{
    uchar rev_data[16]={"-Count Reform!- "};
    com_1602(0x80);//第一行
    for(i=0;i<16;i++)                
    {
        dat_1602(rev_data[i]);
    } 
    com_1602(0xc0);    //發送數據第二行
    for(i=0;i<6;i++)                
    {
        dat_1602(table1[i]);
    }
    com_1602(0xc6);
    dat_1602(table0[d/10]);
    dat_1602(table0[d%10]);
}

void displayStatic99(int d)            
{
    uchar rev_data[16]={"-99 Countdown!- "};
    com_1602(0x80);//第一行
    for(i=0;i<16;i++)                
    {
        dat_1602(rev_data[i]);
    } 
    com_1602(0xc0);    //發送數據第二行
    for(i=0;i<6;i++)                
    {
        dat_1602(table1[i]);
    }
    com_1602(0xc6);
    dat_1602(table0[d/10]);
    dat_1602(table0[d%10]);
}

void displayStatic00()            
{
    uchar rev_data[16]={"-99 Countdown!- "};
    com_1602(0x80);//第一行
    for(i=0;i<16;i++)                
    {
        dat_1602(rev_data[i]);
    } 
    com_1602(0xc0);    //發送數據第二行
    for(i=0;i<6;i++)                
    {
        dat_1602(table1[i]);
    }
    com_1602(0xc6);
    dat_1602('0');
    dat_1602('0');
}

void displayDynamic(int d)            
{
    uchar rev_data[16]={"-99 Countdown!- "};
    com_1602(0x80);//第一行
    for(i=0;i<16;i++)                
    {
        dat_1602(rev_data[i]);
    } 
    com_1602(0xc0);    //發送數據第二行
    for(i=0;i<6;i++)                
    {
        dat_1602(table1[i]);
    }
    com_1602(0xc6);
    while(d>=0)
    {
        dat_1602(table0[d/10]);
        dat_1602(table0[d%10]);
        delay(50000);
        d--;
        com_1602(0xc6);
    }
}

void keypros()
{
    if(k0==0)          //檢測按鍵K1是否按下
    {    
        delay(1000);   //消除抖動 一般大約10ms
        if(k0==0)     //再次判斷按鍵是否按下
        {
            key_mode=1;              
        }
        while(!k0);     //檢測按鍵是否松開        
    }
    if(k3==0)          //檢測按鍵K1是否按下
    {    
        delay(1000);   //消除抖動 一般大約10ms
        if(k3==0)     //再次判斷按鍵是否按下
        {
            key_mode=0;                          
        }
        while(!k3);     //檢測按鍵是否松開        
    }
    if(k1==0)          //檢測按鍵K1是否按下
    {    
        delay(1000);   //消除抖動 一般大約10ms
        if(k1==0)     //再次判斷按鍵是否按下
        {
            key_mode=2;
            if(k<99)
            {
                k+=1;
            }      
        }
        while(!k1);     //檢測按鍵是否松
    }
    if(k2==0)          //檢測按鍵K1是否按下
    {
        delay(1000);   //消除抖動 一般大約10ms
        if(k2==0)     //再次判斷按鍵是否按下
        {
            key_mode=2;
            k-=1;     
        }
        while(!k2);     //檢測按鍵是否松
    }    
}

/*******************************************************************************
* 函 數 名       : main
* 函數功能         : 主函數
* 輸    入       : 無
* 輸    出         : 無
*******************************************************************************/
void main()
{
    int_1602();    
    while(1)
    {
        keypros();
        if(key_mode==0)
        {
            displayStatic99(k);
        }
        if(key_mode==1)
        {
            displayDynamic(k);
            key_mode=3;    
        }
        if(key_mode==2)
        {
            displaySet(k);    
        }
        if(key_mode==3)
        {
            displayStatic00();    
        }
    }        
}

二、視頻展示:https://www.bilibili.com/video/BV1c5411W744/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM