找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2046|回复: 0
收起左侧

单片机+Proteus仿真矩阵键盘喷泉灯程序

[复制链接]
ID:399416 发表于 2020-6-12 13:00 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
3e1922752dfad9b0cdffee27395e506.png

单片机源程序如下:
/********************************************************************

*********************************************************************/
#include<reg52.h>                 //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型
/********************************************************************
                            初始定义
*********************************************************************/
unsigned char code seg7code[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e };
unsigned char k;
uchar jiange=2;  //间隔时间
uchar chixu=1;   //持续时间
/********************************************************************
                            延时函数
*********************************************************************/
void delay10ms(void) //延时程序
{
        unsigned char i,j;
        for(i=20;i>0;i--)
        for(j=248;j>0;j--);
}

/********************************************************************
                            键盘函数
*********************************************************************/        
void Getch ( )        //取键值函数
{
unsigned char X,Y,Z;
P1=0x0f; //先对P3 置数 行扫描
if(P1!=0x0f) //判断是否有键按下
        {
        delay10ms(); //延时,软件去干扰
        if(P1!=0x0f) //确认按键按下
                {
                X=P1; //保存行扫描时有键按下时状态
                P1=0xf0; //列扫描
                Y=P1;    //保存列扫描时有键按下时状态
                Z=X|Y; //取出键值
/*********************************************************************/
switch ( Z ) //判断键值(那一个键按下)
                        {
                                case 0xee: k=0; break; //对键值赋值
                                case 0xed: k=1; break;
                                case 0xeb: k=2; break;
                                case 0xe7: k=3; break;
                                case 0xde: k=4; break;
                                case 0xdd: k=5; break;
                                case 0xdb: k=6; break;
                                case 0xd7: k=7; break;
                                case 0xbe: k=8; break;
                                case 0xbd: k=9; break;
                                case 0xbb: k=10;break;
                                case 0xb7: k=11;break;
                                case 0x7e: k=12;break;
                                case 0x7d: k=13;break;
                                case 0x7b: k=14;break;
                                case 0x77: k=15;break;
                        }
                 }
        }
}



/**********************T0中断服务程序*******************/
        void timer0(void)interrupt 1 using 1
{
        static uint count=0;
        static uint state=0;
        static uchar i=0;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
        if(count <200)  //10s
        {
                P2=0x00;
                P3=0x00;
        }
        else if(count==200)
        {
                P2=0xFF;
                P3=0xFF;
        }
        else if(count<200+180*jiange)
        {
                if(count %(20*jiange) ==0)
                {        
                        state=count;
                        P2=(0xFF)^(1<<i);
                        i++;
                        if(i==8) i=0;
                }
                else if(state+20*chixu==count)
                {
                        P2=(0xFF);
                        state=0;
                }
        }
                else if(count<200+180*jiange+100)
        {
                        P2=0xFF;
                        P3=0xF0;
        }
        else
        {
    count=0;
        }
}
/********************************************************************
                            主函数
*********************************************************************/
void main(void)
{
  uchar key=0;
        TMOD=0x01;//定时器工作方式1
        TH0=(65536-50000)/256;//定时器附初值
        TL0=(65536-50000)%256;
        EA=1; //开全局中断
        ET0=1;//开定时器中断
  TR0=1;//启动定时
while(1)
        {
                Getch();                //调用取键值函数
   if((k<8)&&(k>0))  //矩阵键盘前两行修改持续时间
         {
                 chixu=k;
         }
         else if(k>=8)   //矩阵键盘后两行修改间隔时间
         {
                jiange=k-7;
         }
        }
}

        
/********************************************************************
                              结束
*********************************************************************/

全部资料51hei下载地址:
喷泉灯.rar (67.92 KB, 下载次数: 22)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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