第四届蓝桥杯比赛题目——自动售水机

#include <stc15f2k60s2.h>
#include <iic.h>
typedef unsigned char u8;
typedef unsigned int u16;


#define key_state_0 0
#define key_state_1 1
#define key_state_2 2

sbit relay=P0^4;
sbit buzzer = P0^6;

/*************  本地常量声明    **************/
u8 code t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
u8 key_scan();
bit key_flag;
bit water_state;
u8 smg_on[8];
u8 smg_off[8];
u16 liuliang=0;
u16 price = 0;
u8 light;

/*************  定时器初始化    **************/
void Timer0Init(void)        //1毫秒@11.0592MHz
{
    AUXR |= 0x80;        //定时器时钟1T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0xCD;        //设置定时初值
    TH0 = 0xD4;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0 = 1;
    EA  = 1;
}

/*************  中断服务程序    **************/

void timer0() interrupt 1 using 1
{
   static char smg_count=0,key_count =0,i=0,water_count=0;//产生中断计时数
   smg_count++;key_count++;     //每进入一次中断计时数加1
   if(smg_count==3)
   {
           smg_count =0;
        if(water_state==1){P2=0XE0;P0=smg_on[i];P2=0;}
        if(water_state==0){P2=0XE0;P0=smg_off[i];P2=0;}
        P2=0XC0;P0=T_COM[i];P2=0;
        i++;
        if(i==8)i=0;
   }
   
   if(key_count==10)
   {
           key_count=0;
        key_flag =1;
   }
   if(water_state==1)
   {
           water_count++;
        if(water_count==100)
        {
            water_count=0;
            liuliang++;
        }
   }
}
void main(void)
{
    u8 key_val;
    Timer0Init();
    P2=0XA0;P0=0X00;P2=0;//初始化关闭定时器
    //初始化显示程序
    smg_on[0] = ~t_display[16];smg_on[1] = ~(t_display[0]|0x80);smg_on[2] = ~t_display[5];smg_on[3] = ~t_display[0];
    smg_on[4] = ~t_display[0];smg_on[5] = ~(t_display[0]|0x80);smg_on[6] = ~t_display[0];smg_on[7] = ~t_display[0];

       smg_off[0] = ~t_display[16];smg_off[1] = ~(t_display[0]|0x80);smg_off[2] = ~t_display[5];smg_off[3] = ~t_display[0];
    while(1)
    {
        //打开售水机数码管显示
        smg_on[4] = ~t_display[liuliang/1000];smg_on[5] = ~(t_display[liuliang/100%10]|0x80);
        smg_on[6] = ~t_display[liuliang/10%10];smg_on[7] = ~t_display[liuliang%10];

        //关闭售水机数码管显示
        smg_off[4]=~t_display[price/1000];smg_off[5]=~(t_display[price/100%10]|0x80);
        smg_off[6]=~t_display[price/10%10];smg_off[7]=~t_display[price%10];
        //计算价格
        price = liuliang/2;
        //价格上限
        if(liuliang>9999)
        {
            water_state=0;
            P2=0XA0;relay=1;buzzer=0;P2=0X00;
            price = 4999;    
        }
        EA =0;
        light = read_adc(0x01);
        EA =1;
        //
        if(light<64)
        {
            P2=0X80;P0=~0X01;P2=0X00;
        }
        else
        {
             P2=0X80;P0=0xff;P2=0X00;
        }
        //按键检测程序
        if(key_flag)
        {
            key_flag=0;
            key_val = key_scan();
            switch(key_val)
            {

                case 6:        //s6
                    water_state =0;
                    P2=0XA0;relay=0;buzzer=0;P2=0X00;//关闭继电器
                break;
                case 7:        //s7
                      
                    if(water_state==0)
                    {
                        liuliang = 0;
                    }
                    water_state = 1;
                    P2=0XA0;relay=1;buzzer=0;P2=0X00;//打开继电器
                break;
            }
        }
    }    
}

u8 key_scan()
{
    static char key_state = key_state_0;
    u8 key1,key2,key_temp,key_value=0;

    P30=0;P31=0;P32=0;P33=0;P34=1;P35=1;P42=1;P44=1;
    if(P44==0)key1=0x70;
    if(P42==0)key1=0xb0;
    if(P35==0)key1=0xd0;
    if(P34==0)key1=0xe0;
    if((P44==1)&&(P42==1)&&(P35==1)&&(P34==1))key1=0xf0;

     P30=1;P31=1;P32=1;P33=1;P34=0;P35=0;P42=0;P44=0;
    if(P33==0)key2=0x07;
    if(P32==0)key2=0x0b;
    if(P31==0)key2=0x0d;
    if(P30==0)key2=0x0e;
    if((P33==1)&&(P32==1)&&(P31==1)&&(P30==1))key2=0x0f;
    key_temp = key1|key2;

    switch(key_state)
    {
        case key_state_0:
            if(key_temp!=0xff)key_state = key_state_1;
        break;
        case key_state_1:
            if(key_temp==0xff)key_state = key_state_0;
            else
            {
                switch(key_temp)
                {
                    case 0x77:key_value=4;break;
                    case 0x7b:key_value=5;break;
                    case 0x7d:key_value=6;break;
                    case 0x7e:key_value=7;break;

                    case 0xb7:key_value=8;break;
                    case 0xbb:key_value=9;break;
                    case 0xbd:key_value=10;break;
                    case 0xbe:key_value=11;break;

                    case 0xd7:key_value=12;break;
                    case 0xdb:key_value=13;break;
                    case 0xdd:key_value=14;break;
                    case 0xde:key_value=15;break;

                    case 0xe7:key_value=16;break;
                    case 0xeb:key_value=17;break;
                    case 0xed:key_value=18;break;
                    case 0xee:key_value=19;break;
                }    
                key_state=key_state_2;    
            }
        break;
        case key_state_2:
            if(key_temp==0xff)key_state = key_state_0;
        break;
    }
    return key_value;
}

猜你喜欢

转载自www.cnblogs.com/scr971023/p/9069785.html
今日推荐