登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习笔记] 简易加法器

[复制链接]
发表于 2018-2-21 21:00:27 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 练到能够独立编写
开始时间: 2018-02-21
结束时间:
#include "ctype.h"

uint8 ledchar[]={        //数码管真值标
        0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
        0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
uint8 keysta[4][4]={//按键状态值
        {1,1,1,1,},{1,1,1,1,},{1,1,1,1,},{1,1,1,1,},
};
unsigned ledbuf[]={
        0xff,0xff,0xff,0xff,0xff,0xff,
};
unsigned char code keycodemap[4][4]={//矩阵按键标号到标准键盘码的映射表
        {0x31,0x32,0x33,0x26},//数字键1,数字键2,数字键3,向上键
        {0x34,0x35,0x36,0x25},//数字键4,数字键5,数字键6,向左键
        {0x37,0x38,0x39,0x28},//数字键7,数字键8,数字键9,向下键
        {0x30,0x1B,0x0D,0x27},//数字键0,ESC键,  回车键, 向右键
};

void Timer0Init(void);
void keydriver(void);

void main()
{
        P11 = 0;
        Timer0Init();
        ledbuf[0] = ledchar[0];//上电显示0
        P2 = 0xff;

        while(1){
                keydriver();
        }
}

void shownumber(uint64 num)
{
        int8 i;
        uint8 buf[6];
        for(i=0;i<6;i++){
                buf[i] = num %10;
                num/=10;
        }
        for(i=5;i>=1;i--){
                if(buf[i] == 0){
                        ledbuf[i]=0xff;
                }else
                        break;
        }
        for(;i>=0;i--){
                ledbuf[i]=ledchar[buf[i]];
        }
}

void keyaction(uint8 keycode){
        static uint64 result = 0;
        static uint64 addend = 0;

        if( (keycode>=0x30)&&(keycode<=0x39) ){
                addend = (addend*10)+keycode-0x30;
                shownumber(addend);
        }else if(keycode == 0x26){
                result += addend;
                addend = 0;
                shownumber(result);
        }else if(keycode == 0x0D){
                result += addend;
                addend = 0;
                shownumber(result);
        }else if(keycode == 0x1B){
                addend = 0;
                result = 0;
                shownumber(addend);
        }

}

void keydriver(void)
{
        uint8 i,j;
        static uint8 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(void)
{
        static uint8 keyout = 0;
        uint8 i =0;
        static uint8 keybuf[4][4]={//按键状态值(16进制,用于消抖)
                {0xff,0xff,0xff,0xff,},
                {0xff,0xff,0xff,0xff,},
                {0xff,0xff,0xff,0xff,},
                {0xff,0xff,0xff,0xff,},
        } ;
        keyin1 = 1;
        keyin2 = 1;
        keyin3 = 1;
        keyin3 = 1;       

        keybuf[keyout][0]=(keybuf[keyout][0]<<1) | P20;
        keybuf[keyout][1]=(keybuf[keyout][1]<<1) | P21;
        keybuf[keyout][2]=(keybuf[keyout][2]<<1) | P22;
        keybuf[keyout][3]=(keybuf[keyout][3]<<1) | P23;
       
        for(i=0;i<4;i++){
                if((keybuf[keyout][i]&0x0f)==0x0f){
                        keysta[keyout][i]=1;
                }else if((keybuf[keyout][i]&0x0f)==0x00){
                        keysta[keyout][i]=0;
                }
        }
        keyout++;
        keyout&=0x03;
        switch(keyout){
                case 02=0x7f;break;
                case 12=0xbf;break;
                case 22=0xdf;break;
                case 32=0xef;break;

                default: break;
        }

}

void ledscan(void)
{
        static int8 n ;
        P0 = 0xff;
        switch(n){
                case 020=121=022=10=ledbuf[n];n++;break;
                case 120=021=022=10=ledbuf[n];n++;break;
                case 220=121=122=00=ledbuf[n];n++;break;
                case 320=021=1;P22=0;P0=ledbuf[n];n++;break;
                case 420=1;P21=0;P22=0;P0=ledbuf[n];n++;break;
                case 520=0;P21=0;P22=0;P0=ledbuf[n];n=0;break;
                default: break;
        }
}

void Timer0Init(void)                //1毫秒@32MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0x83;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA=1;
        ET0=1;
}
void T0() interrupt 1
{
        TL0 = 0x00;                //设置定时初值
        TH0 = 0x83;                //设置定时初值
        keyscan();
        ledscan();       
}

#ifndef __ctype_h_
#define __ctype_h_

#include <stc12c5a60s2.h>

typedef unsigned char uint8;
typedef unsigned int  uint32;
typedef unsigned long uint64;

typedef signed char int8;
typedef signed int  int32;
typedef signed long int64;

sbit keyin1=P2^0;
sbit keyin2=P2^1;
sbit keyin3=P2^2;
sbit keyin4=P2^3;
sbit kout1=P2^4;
sbit kout2=P2^5;
sbit kout3=P2^6;
sbit kout4=P2^7;

#endif

好懒~~不想说~~~
 楼主| 发表于 2018-2-21 21:02:00 | 显示全部楼层
好奇怪分号为什么变成这个奇怪的表情:
好懒~~不想说~~~
发表于 2018-2-21 21:48:53 | 显示全部楼层
这是个大工程
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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