登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 浅尝多.c文件(简易计算器)

[复制链接]
发表于 2022-2-9 23:15:41 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 进一步学习使用多.c文件
开始时间: 2022-02-08
结束时间: 2022-02-09
小计算器,看了好久,对指针还是有点生疏,好多地方反应不过来,不过还好多看几遍差不多能理解,感觉有必要再去看看c语言的课程。写程序的时候有好多错误,很消磨耐心,查了好多东西,加上问大佬才好不容易把它写出来。

程序:

LCD.c
#include<reg52.h>

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

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

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);
LCD1602_RS = 1;
LCD1602_RW = 1;
}

void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdSetCursor(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)
{
LcdSetCursor(x,y);
while(*str != '\0')
{
LcdWriteDat(*str++);
}
}

void LcdAreaClear(unsigned char x,unsigned char y,unsigned char len)
{
LcdSetCursor(x,y);
while(len--)
{
LcdWriteDat(' ');
}
}

void LcdFullClear()
{
LcdWriteCmd(0x01);
}

void InitLcd1602()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}


keyboard.c

#include<reg52.h>

sbit KEY_OUT_4 = P2^7;
sbit KEY_OUT_3 = P2^6;
sbit KEY_OUT_2 = P2^5;
sbit KEY_OUT_1 = P2^4;
sbit KEY_IN_1 = P2^0;
sbit KEY_IN_2 = P2^1;
sbit KEY_IN_3 = P2^2;
sbit KEY_IN_4 = P2^3;

unsigned char KeySta[4][4] = {
                {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}
                };
unsigned char code KeyCodeMap[4][4] = {
{'1','2','3',0x26},{'4','5','6',0x25},{'7','8','9',0x28},{'0',0x1B,0x0D,0x27}
};

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(backup[i][j] != KeySta[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}
};
    KEY_IN_2 = 1;
                KEY_IN_3 = 1;
    KEY_IN_4 = 1;
                keybuf[keyout][0] = (keybuf[keyout][0] <<1) | KEY_IN_1;
                keybuf[keyout][1] = (keybuf[keyout][1] <<1) | KEY_IN_2;
                keybuf[keyout][2] = (keybuf[keyout][2] <<1) | KEY_IN_3;
                keybuf[keyout][3] = (keybuf[keyout][3] <<1) | KEY_IN_4;
               
                for(i = 0;i<4;i++)
                {
                if((keybuf[keyout][i] & 0x0F) == 0x00)
                {
                KeySta[keyout][i] = 0;

                }
                else if((keybuf[keyout][i] & 0x0F) == 0x0F)
                {
                KeySta[keyout][i] = 1;

                }
                }
               
                keyout++;
                keyout = keyout & 0x03;
                switch(keyout)
                {
                case 0:KEY_OUT_4 = 0;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
                case 1:KEY_OUT_4 = 1;KEY_OUT_3 = 0;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
                case 2:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 0;KEY_OUT_1 = 1;break;
                case 3:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 0;break;
                default:break;
                }
                }


nn.c

#include <reg52.h>

unsigned char step = 0;
unsigned char oprt = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
signed long num1 = 0;
signed long num2 = 0;
signed long result = 0;

void ConfigTimer0(unsigned int ms);
extern void KeyScan();
extern void KeyDriver();
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;
ConfigTimer0(1);
InitLcd1602();
LcdShowStr(15,1,"0");

while(1)
{
KeyDriver();
}
}

unsigned char LongToString(unsigned char *str,signed long dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[12];

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 Reset()
{
num1 = 0;
num2 = 0;
step = 0;
LcdFullClear();
}

void NumKeyAction(unsigned char n)
{
unsigned char len;
unsigned char str[12];

if(step>1)
{
Reset();
}
if(step == 0)
{
num1 = num1*10+n;
len = LongToString(str,num1);
LcdShowStr(16-len,1,str);
}
else
{
num2 = num2*10+n;
len = LongToString(str,num2);
LcdShowStr(16-len,1,str);
}
}

void OprtKeyAction(unsigned char type)
{
unsigned char len;
unsigned char str[12];
if(step == 0)
{
len = LongToString(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 = LongToString(str,num2);
ShowOprt(0,oprt);
LcdAreaClear(1,0,16-1-len);
LcdShowStr(16-len,0,str);
len = LongToString(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 = 32768000/12;
                tmp = (tmp*ms)/1000;
    tmp = 65536 - tmp;
    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();
}

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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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