登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 51单片机

[复制链接]
发表于 2021-2-25 22:05:03 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 计算器程序学习
学习安排: 计算器程序学习
开始时间: 2021-02-21
结束时间: 2021-02-25
#include<reg52.h>

unsigned char step = 0;
unsigned char oprt = 0;
signed long result = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
signed long num1 = 0;
signed long num2 = 0;
void ConfigTimer0(unsigned int ms);
extern void KeyDriver();
extern void keyscan();
extern void        InitLCD1602();
extern void LCDShowstr(unsigned char x,unsigned char y,unsigned char*str);
extern void        LCDareaclear(unsigned char x,unsigned char y,unsigned char len);
extern void        LCDfullclear();

void main()
{
        EA = 1;
        InitLCD1602();
        ConfigTimer0(1);
        LCDShowstr(15,1,"0");
        while(1)
        {
                KeyDriver();
        }
}
void Reset()
{
        num1 = 0;
        num2 = 0;
        step = 0;
        LCDfullclear();
}
unsigned char LongTostr(unsigned char *str,signed long dat)
{
        unsigned char len = 0;
        unsigned char buf[12];
        signed char i = 0;
       
        if(dat<0)
        {
                dat = -dat;
                *str++ = '-';
                len++;
        }
        do
        {
                buf[i++] = dat%10;
                dat/=10;
        }while(dat>0);
        len+=i;
        while(i-->0)
        {
                *str++ = buf[i] + '0';
        }
        *str = '\0';
        return len;
}
void ShowOprt(unsigned char y,unsigned char type)
{
        switch(type)
        {
                case 0CDShowstr(0,y,"+");break;
                case 1CDShowstr(0,y,"-");break;
                case 2CDShowstr(0,y,"*");break;
                case 3CDShowstr(0,y,"/");break;
                default:break;
        }
}
void NumKeyAction(unsigned char n)
{
        unsigned char str[12];
        unsigned char len;
        if(step>1)
        {
                Reset();
        }
        if(step==0)
        {
                num1 = num1*10+n;
                len = LongTostr(str,num1);
                LCDShowstr(16-len,1,str);
        }
        else
        {
                num2 = num2*10+n;
                len = LongTostr(str,num2);
                LCDShowstr(16-len,1,str);
    }
}
void OprtKeyAction(unsigned char type)
{
        unsigned char str[12];
        unsigned char len;
        if(step==0)
        {
                len = LongTostr(str,num1);
                LCDareaclear(0,0,16-len);
                LCDShowstr(16-len,0,str);
                ShowOprt(1,type);
                LCDareaclear(1,1,14);
                LCDShowstr(15,1,"0");
                oprt = type;
                step = 1;
    }
}
void Getresult()
{
        unsigned char len;
        unsigned char str[12];

        if(step==1)
        {
                step = 2;
                switch(oprt)
                {
                        case 0:result = num1+num2;break;
                        case 1:result = num1-num2;break;
                        case 2:result = num1*num2;break;
                        case 3:result = num1/num2;break;
                        default:break;
                }
        len = LongTostr(str,num2);
        ShowOprt(0,oprt);
        LCDareaclear(1,0,16-1-len);
        LCDShowstr(16-len,0,str);
        len = LongTostr(str,result);
        LCDShowstr(0,1,"=");
        LCDareaclear(1,1,16-1-len);
        LCDShowstr(16-len,1,str);
   }
}               
void KeyAction(unsigned char keycode)
{
        if((keycode>='0')&(keycode<='9'))
        {
                NumKeyAction(keycode - '0');
        }                                                          
        else if(keycode == 0x26)
        {
                OprtKeyAction(0);
        }
        else if(keycode == 0x28)
        {
                OprtKeyAction(1);
        }
        else if(keycode == 0x25)
        {
                OprtKeyAction(2);
        }
        else if(keycode == 0x27)
        {
                OprtKeyAction(3);
        }
        else if(keycode == 0x0D)
        {
                Getresult();
        }
        else if(keycode == 0x1B)
        {
                Reset();
                LCDShowstr(15,1,"0");
        }
}
void ConfigTimer0(unsigned int ms)
{
        unsigned long tmp;

        tmp = 11059200/12;
        tmp = (tmp*ms)/1000;
        tmp = 65536 - tmp;
        tmp+=28;
        T0RH=(unsigned char)(tmp>>8);
        T0RL=(unsigned char)tmp;
        TMOD&=0XF0;
        TMOD|=0X01;
        TH0 = T0RH;
        TL0 = T0RL;
        ET0 = 1;
        TR0 = 1;
}
void InterruptTimer0() interrupt 1
{
        TH0 = T0RH;
        TL0 = T0RL;
        keyscan();
}

#include<reg52.h>

#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E  = P1^5;

void LCDwaitReady()
{
        unsigned char sta;

        LCD1602_DB = 0XFF;
        LCD1602_RS = 0;
        LCD1602_RW = 1;
        do{
                LCD1602_E = 1;
            sta = LCD1602_DB;
                LCD1602_E = 0;
        }while(sta&0x80);
}

void LCDwriteCmd(unsigned char cmd)
{
        LCDwaitReady();
        LCD1602_RS = 0;
        LCD1602_RW = 0;
        LCD1602_DB = cmd;
        LCD1602_E = 1;
        LCD1602_E = 0;
}
void LCDwriteDat(unsigned char dat)
{
        LCDwaitReady();
        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_DB =dat;
        LCD1602_E = 1;
        LCD1602_E = 0;
}
void LCDwritezhi(unsigned char x,unsigned char y)
{
        unsigned char addr;
        if(y == 0)
                addr = 0x00+ x;
        else
                addr = 0x40+ x;
        LCDwriteCmd(addr|0x80);
}
void LCDShowstr(unsigned char x,unsigned char y,unsigned char *str)
{
        LCDwritezhi(x,y);
        while(*str!= '\0')
        {
                LCDwriteDat(*str++);
        }
}
void LCDareaclear(unsigned char x,unsigned char y,unsigned char len)
{
        LCDwritezhi(x,y);
        while(len--)
        {
                LCDwriteDat(' ');
        }
}
void LCDfullclear()
{
        LCDwriteCmd(0x01);
}       
void InitLCD1602()
{
        LCDwriteCmd(0x38);
        LCDwriteCmd(0x0C);
        LCDwriteCmd(0x06);
        LCDwriteCmd(0x01);
}


#include<reg52.h>

sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
sbit KEY_OUT1 = P2^3;
sbit KEY_OUT2 = P2^2;
sbit KEY_OUT3 = P2^1;
sbit KEY_OUT4 = P2^0;

unsigned char code KeyCodeMap[4][4] ={
        {'1','2','3',0x26},
        {'4','5','6',0x25},
        {'7','8','9',0x28},
        {'0',0X1B,0x0D,0X27}
};
unsigned char pdata keysta[4][4] ={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
        };
extern void KeyAction(unsigned char keycode);
void KeyDriver()
{
        unsigned char i,j;
        static unsigned char pdata backup[4][4] = {
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
        };

        for(i=0;i<4;i++)
        {
                for(j=0;j<4;j++)
                {
                        if(keysta[i][j]!=backup[i][j])
                        {
                                if(backup[i][j]!=0)
                                {
                                        KeyAction(KeyCodeMap[i][j]);
                                }
                                backup[i][j] = keysta[i][j];
                        }
                }
        }
}

void keyscan()
{
        unsigned char i;
        static unsigned char keyout = 0;
        static unsigned char  keybuf[4][4] ={
        {0xFF,0XFF,0XFF,0XFF},{0XFF,0XFF,0XFF,0XFF},
        {0XFF,0XFF,0XFF,0XFF},{0XFF,0XFF,0XFF,0XFF}
};

        keybuf[keyout][0] = (keybuf[keyout][0]<<1)|KEY1;
        keybuf[keyout][1] = (keybuf[keyout][1]<<1)|KEY2;
        keybuf[keyout][2] = (keybuf[keyout][2]<<1)|KEY3;
        keybuf[keyout][3] = (keybuf[keyout][3]<<1)|KEY4;

        for(i=0;i<4;i++)
        {
                if((keybuf[keyout][i]&0xFF)==0XF0)
                {
                        keysta[keyout][i] = 0;
                }
                else if((keybuf[keyout][i]&0xFF)==0XFF)
                {
                        keysta[keyout][i] = 1;
                }
        }
        keyout++;
        keyout&=0x03;
        switch(keyout)
        {
                case 0:KEY_OUT4 = 1;KEY_OUT1 = 0;break;
                case 1:KEY_OUT1 = 1;KEY_OUT2 = 0;break;
                case 2:KEY_OUT2 = 1;KEY_OUT3 = 0;break;
                case 3:KEY_OUT3 = 1;KEY_OUT4 = 0;break;
                default:break;
        }
}
       



好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表