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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

此單片機程序如何改成有定時器和中斷函數(shù),比如把延時消抖改一下,用中斷掃描鍵盤矩陣

[復(fù)制鏈接]
ID:7094 發(fā)表于 2019-12-23 17:47 | 顯示全部樓層 |閱讀模式
/*
接盤按鍵說明:
--------------------------------------------------
            |  1  |  2  |  3  |  +  |  
            - - - - - - - - - - - - -
            |  4  |  5  |  6  |  -  |
            - - - - - - - - - - - - -
            |  7  |  8  |  9  |  *  |
            - - - - - - - - - - - - -
                        | C   |  0  |  =  |  /  |
--------------------------------------------------*/
//操作簡介
// 按第一個數(shù),再按'+-*/',再按'='顯示出結(jié)果,然后按C清屏
// 加最大9999+9999=19998
// 減最大9999-0   =9999
// 乘最大9999*9999=99980001
// 除 1/9=0.1111 保留小數(shù)點后4位
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
//--------LCD1602-------------------
//P00-07==== D0-7
sbit rs=P2^7;        //指令or數(shù)據(jù)
sbit wela=P2^6;      //讀or寫
sbit lcden=P2^5;         //使能信號
//--------LCD1602-------------------
//--------KEY-----------------------
//P1口
//--------KEY-----------------------
uchar code table[]= "                ";

long  int data_a,data_b;         //第一個數(shù)和第二個數(shù)
long  int data_c;                        //計算結(jié)果

uchar dispaly[10];         //顯示緩沖

//************************************************************************/
// 描述: 延時t us函數(shù)
//************************************************************************/
void LCD_Delay_us(uint t)
{
        while(t--);           //t=0,退出
}
//************************************************************************/
// 描述: 延時t ms函數(shù)
//************************************************************************/
void LCD_Delay_ms(uint t)
{
        unsigned int i,j;
        for(i=0;i<t;i++)                       //執(zhí)行t次循環(huán)
        for(j=0;j<113;j++)                     //執(zhí)行113次循環(huán)
        ;
}
//************************************************************************/
// 描述: 1602液晶寫指令
//************************************************************************/
void write_com(uchar com)            //1602液晶寫指令
{
        rs=0;                       //寫指令
        lcden=0;                    //使能1602
        P0=com;                     //寫入指令com
        LCD_Delay_ms(1);            //延時1ms
        lcden=1;                    //使能1602
        LCD_Delay_ms(2);            //延時2ms  
        lcden=0;                        //使能1602
}
//************************************************************************/
// 描述:1602液晶寫數(shù)據(jù)
//************************************************************************/
void write_date(uchar date) //1602液晶寫數(shù)據(jù)
{
        rs=1;                        //寫數(shù)據(jù)
        lcden=0;                     //使能1602
        P0=date;                     //寫入數(shù)據(jù)date
        LCD_Delay_ms(1);             //延時1ms
        lcden=1;                     //使能1602
        LCD_Delay_ms(2);             //延時2ms
        lcden=0;                         //使能1602
}
//************************************************************************/
// 描述:指定x,y寫入字符函數(shù)
//************************************************************************/
void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
{     
         if (y == 0){write_com(0x80 + x);}   //第一行  
         else{write_com(0xc0 + x);}          //第二行
         write_date( Data);                  //寫入數(shù)據(jù)
}
//指定x,y寫入字符串函數(shù)
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0){write_com(0x80 + x);}                 //第一行
else{write_com(0xC0 + x);}                        //第二行
while (*s)                                        //
         {write_date( *s); s++;}                      //寫入數(shù)據(jù)
}
//************************************************************************/
// 描述:初始化液晶,及畫面初始化
//************************************************************************/
void init_lcd(void)            //初始化液晶,及畫面初始化
{
        wela=0;                      //寫液晶
        lcden=0;                     //使能1602
        write_com(0x38);             //8 位總線,雙行顯示,5X7 的點陣字符
        LCD_Delay_us(100);           //延時100us
        write_com(0x0c);             //開顯示,無光標,光標不閃爍
        write_com(0x06);             //光標右移動
        write_com(0x01);             //清屏
        write_com(0x80);             //DDRAM 地址歸0
}
//************************************************************************/
// 描述: 反轉(zhuǎn)法鍵盤掃描
//************************************************************************/
short keycheckdown()                                /* 反轉(zhuǎn)法鍵盤掃描 */
{

        short temp1,temp2,temp,a=0xff;
        P1=0xf0;                                                /* 輸入行值(或列值) */
        LCD_Delay_ms(20);                                /* 延時 */
        temp1=P1;                                                /* 讀列值(或行值) */
        P1=0xff;
        LCD_Delay_ms(20);                                /* 延時 */
        P1=0x0f;                                                /* 輸入列值(或行值) */
        LCD_Delay_ms(20);                                /* 延時 */
        temp2=P1;                                                /* 讀行值(或列值) */
        P1=0xff;
        temp=(temp1&0xf0)|(temp2&0xf);        /* 將兩次讀入數(shù)據(jù)組合 */
        switch(temp)                                        /* 通過讀入數(shù)據(jù)組合判斷按鍵位置 */
        {


                case 0x77 :a=0x0d;break;//  按鍵/   
                case 0x7b :a=0x0e; break;// 按鍵=        
                case 0x7d :a=0;           break;// 按鍵0
                case 0x7e :a=0x0f; break;// 按鍵CE

                case 0xb7 :a=0x0c;break;//         按鍵*
                case 0xbb :a=0x9;break; //  按鍵9
                case 0xbd :a=0x8;break; //  按鍵8
                case 0xbe :a=0x7;break; //         按鍵7

                case 0xd7 :a=0x0b;break;//  按鍵-
                case 0xdb :a=0x6;break; //         按鍵6
                case 0xdd :a=0x5;break; //         按鍵5
                case 0xde :a=0x4;break; //         按鍵4

                case 0xe7 :a=0x0a; break;// 按鍵+
                case 0xeb :a=3;break;        //  按鍵3
                case 0xed :a=2;break;        //  按鍵2
                case 0xee :a=1;break;        //  按鍵1

                default :a=0xff;
        }
        return a;                                                /* 返回按鍵值 */
}
void display_a() //顯示數(shù)據(jù)a
{
        dispaly[3]=data_a%10000/1000;    //千
        dispaly[2]=data_a%1000/100;      //百
        dispaly[1]=data_a%100/10;        //十
        dispaly[0]=data_a%10;            //個

        write_com(0x80+0);               //顯示數(shù)據(jù)a
        if(data_a>999){        write_date('0'+dispaly[3]);}      //顯示千位
        if(data_a>99){        write_date('0'+dispaly[2]);}                 //顯示百位
        if(data_a>9){        write_date('0'+dispaly[1]);}     //顯示十位
                              write_date('0'+dispaly[0]);      //顯示個位
}

void display_b() //顯示數(shù)據(jù)b
{
        write_com(0x80+7); //第一行
        dispaly[3]=data_b%10000/1000;    //千
        dispaly[2]=data_b%1000/100;      //百
        dispaly[1]=data_b%100/10;        //十
        dispaly[0]=data_b%10;            //個

if(data_b>999){        write_date('0'+dispaly[3]); }     //顯示千位   
if(data_b>99) {        write_date('0'+dispaly[2]); }    //顯示百位  
if(data_b>9)  {        write_date('0'+dispaly[1]); }     //顯示十位
                              write_date('0'+dispaly[0]);      //顯示個位
}

//計算結(jié)果
void display_c(x)
{

        if(data_c<100000000&&data_c>-1)//溢出時顯示錯誤
        {        

                dispaly[8]=data_c%1000000000/100000000;            //萬萬
                dispaly[7]=data_c%100000000/10000000;            //千萬
                dispaly[6]=data_c%10000000/1000000;                    //百萬
                dispaly[5]=data_c%1000000/100000;                    //十萬
                dispaly[4]=data_c%100000/10000;                            //萬
                dispaly[3]=data_c%10000/1000;                            //千
                dispaly[2]=data_c%1000/100;                              //百
                dispaly[1]=data_c%100/10;                                //十
                dispaly[0]=data_c%10;                                    //個
                write_com(0x80+6+0x40); //第一行
                if(x==4)
                {   
                if(data_c>99999999)        {        write_date('0'+dispaly[8]);}    //顯示萬萬
                if(data_c>9999999)        {        write_date('0'+dispaly[7]);}   //千萬
                if(data_c>999999)        {        write_date('0'+dispaly[6]);}    //百萬
                if(data_c>99999)        {        write_date('0'+dispaly[5]);}    //十萬
                                                                write_date('0'+dispaly[4]);    //萬
                                                                write_date('.');
                                                                write_date('0'+dispaly[3]);    //千
                                                                write_date('0'+dispaly[2]);    //百
                                                                write_date('0'+dispaly[1]);    //十
                                                                write_date('0'+dispaly[0]);    //個
                }
        else{
                if(data_c>99999999)        {        write_date('0'+dispaly[8]);}    //顯示萬萬
                if(data_c>9999999)        {        write_date('0'+dispaly[7]);}    //千萬
                if(data_c>999999)        {        write_date('0'+dispaly[6]);}    //百萬
                if(data_c>99999)        {        write_date('0'+dispaly[5]);}    //十萬
                if(data_c>9999)                {        write_date('0'+dispaly[4]);}    //萬
                if(data_c>999)                {        write_date('0'+dispaly[3]);}    //千
                if(data_c>99)                {        write_date('0'+dispaly[2]);}    //百
                if(data_c>9)                {        write_date('0'+dispaly[1]);}    //十
                                                                write_date('0'+dispaly[0]);    //個
                }
        }
        else  //溢出時顯示錯誤
        {
                write_com(0x80+11+0x40); //第一行
                write_date('E');         //顯示 E
                write_date('r');         //顯示R
                write_date('r');                 //顯示R
                write_date('o');                 //顯示O
                write_date('r');                 //顯示E
        }
}

void eql(uchar x)//加減乘除運算
{
        switch(x)                /*功能鍵選擇*/
                        {   
                                case 1:data_c=data_a+data_b;break;                   //加  /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                        
                                case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///減
                       else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負數(shù)符號
                                           break;           
                                case 3:data_c=(data_a*data_b);break;                  /* * S=3 *///乘
                                case 4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break;                  /* / S=4 *///除//溢出時顯示錯誤
                                case 0:break;
                        }         

}

void main()
{
        uchar   key=0xff;               //鍵值初始化
        uchar   n=0;                                         //第1個數(shù)可以按1-4次
        uchar   m=5;                                         //第2個數(shù)可以按1-4次
        uchar   x=0;
        data_a=0;                       //前一個數(shù)
        data_b=0;                       //后一個數(shù)
        data_c=0;                       //結(jié)果
        init_lcd();                                          //1602液晶初始化
        display_a();
    while(1)
          {
                  key=keycheckdown();                        /*動態(tài)掃描鍵盤,返回按鍵對應(yīng)值,賦給j        key=0到f */
                if(0xff!=key)                                /*若返回值有效,進入內(nèi)部處理程序*/
                {
                  if(key<10)
                  {
                if(n<4){data_a=data_a*10+key;m=5;display_a();}n++;  //首先輸入第一個數(shù)
                    if(m<4){data_b=data_b*10+key;n=5;display_b();}m++;  //必須按了+-*/才能輸入第二個數(shù)               
                  }
          else
          {        switch(key)                /*功能鍵選擇*/
                                        {
                                                case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加  /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                        
                                                case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;                  /* - S=2 *///減
                                                case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;                  /* * S=3 *///乘
                                                case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;                  /* / S=4 *///除
                                                case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;           /* = */
                                                case 0xf:n=0;x=0;m=5; data_a=0;data_b=0;data_c=0;LCD_Write_String(0,0,table);LCD_Write_String(0,1,table);W_lcd(0,0,'0');break; /*     C*/
                                        }                           
                  }
                        do{P1=0xf0;}while(P1!=0xf0);                /*等待按鍵松開*/
                  }//(0xff!=key)         
          }//while
}//main



回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2019-12-24 11:15 | 顯示全部樓層
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产大学生情侣呻吟视频 | 欧美在线a | 亚州精品天堂中文字幕 | 亚洲国产精品一区二区第一页 | 欧美视频网 | 亚洲一二三区精品 | 日韩中文字幕一区 | 午夜精品久久久久久久久久久久久 | 久久国产精品免费一区二区三区 | 玖玖久久 | 国产一区二区av | 亚洲一区自拍 | 久久久成人网 | 欧美日韩国产一区 | www.黄色片视频| www.中文字幕.com | 欧美一区二区三区四区在线 | 琪琪午夜伦伦电影福利片 | 91国在线视频 | 浮生影院免费观看中文版 | 成人免费视频网站 | 97av视频在线 | 色姑娘综合网 | 免费观看黄色片视频 | 美国a级毛片免费视频 | 99视频在线看 | 国产在线观看一区二区三区 | 国产成人在线视频播放 | 天天爽天天干 | 欧美亚洲另类丝袜综合网动图 | 国产精品欧美一区二区 | 欧美激情久久久 | 亚洲欧美日韩在线不卡 | 国产a级毛毛片 | 成人国产精品久久 | 久久久久久久久久久久久9999 | 精品自拍视频 | 97综合在线| 精品中文字幕一区 | 欧美国产亚洲一区二区 | 日韩国产精品一区二区三区 |