AVR单片机期末自选2 4x4薄膜开关控制led灯

具体内容

:AVR单片机 ATmega16
PD接跑马灯 PB接软膜
功能
按1第一个亮 再按就灭
按2第二个亮 再按就灭
……
按8第八个亮 再按就灭
1-8就是对应8个灯 一按亮一按灭
按A全亮 按B全灭 按c奇数亮 按d偶数亮
按9跑马灯依次闪烁

工具/准备工作

所用软件ICCAvr,Proteus8,progisp1.72,win10系统电脑
元器件
YL-34系统板,ATmega16,8路跑马灯LED,杜邦线,4x4矩阵键盘,avr编程器,usbisp烧录器。

设计方法与原理

  1. 电路说明
    具体内容。电路板采用YL-34

.2. 工作原理
初始化设置按键定义,通过8MHz晶振下,通过软件仿真反复实验得到的延时数值。得到1141ms,5/4us。通过这两个值设定延时部分,下一步完成按键扫描函数,低四位输出,连接行线;高四位输入,连接列线。行线输出低电平,列线为带上拉的输入。第一次读B口,进行列扫描。按键消抖后高四位输出,连接列线;低四位输入,连接行线。列线输出低电平,行线为带上拉的输入。第二次读B口,进行行扫描。两次扫描结果组成键盘扫描编码,查表得键盘值。最后led灯部分,首先定义led全部不亮,然后通过case分支使得每个按键对应led灯完成效果
.3. 设计步骤
1. 先设计流水灯与薄膜开关的接法,我将流水灯接到pb,薄膜开关接到pd,设计程序将两者结合在一起变换特效确定设计主题与思路,准备相关器件,查阅资料。
2. 组装器件,编写程序。
3. 将程序烧写至单片机,并多次调试,修改。
4. 进一步完善优化程序。最终完成设计。

  1. 程序设计
    #include<iom16v.h>
    #include<macros.h>
    #define uchar unsigned char
    #define uint unsigned int

//按键=======================
#define Key_DDR DDRB
#define Key_PORT PORTB
#define Key_PIN PINB

uchar key, x;
uchar const key_code[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77,};//键盘编码数组
uchar S0=0,S1=0,S2=0, S4=0,S5=0,S6=0, S8=0,S9=0;

//=延时部分=================

void _delay_us(unsigned int us)

{

unsigned int i;

us=us*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值

for( i=0;i<us;i++);

}

void _delay_ms(unsigned int ms)

{

unsigned int i,j;

for( i=0;i<ms;i++)

for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值

}

//键盘扫描函数*//
uchar keyscan(void)
{
uchar scan1,scan2,keycode,j;
Key_DDR=0X0F; //低四位输出,连接行线;高四位输入,连接列线。
Key_PORT=0XF0; //行线输出低电平,列线为带上拉的输入。
_delay_us(2);
scan1=Key_PIN; //第一次读B口,进行列扫描。

 if(scan1!=0xf0)          {                           _delay_ms(10);            scan1=Key_PIN;                      //按键消抖if(scan1!=0xf0){Key_DDR=0XF0;            //高四位输出,连接列线;低四位输入,连接行线。Key_PORT=0X0F;           //列线输出低电平,行线为带上拉的输入。_delay_us(2);scan2=Key_PIN;           //第二次读B口,进行行扫描。keycode=scan1 | scan2;  //两次扫描结果组成键盘扫描编码。for(j=0;j<16;j++){if(keycode== key_code[j])   //查表得键盘值{key=j;        return(key);} }}}else Key_PORT=0xff;return(key=16);    //返回无效值

}

//以上按键部分==============================
//LED灯部分

#define LED_DDR DDRD
#define LED_PORT PORTD
void Led_Init(void)
{
LED_DDR=0xFF;//定义LED全部不亮
LED_PORT=0xFF;
}
//LED灯部分

void main(void)
{
Led_Init();
while(1)
{
keyscan();//扫描按键返回KEY
switch(key)
{
case 15://第1个灯
if(S00)
{
LED_PORT&=~BIT(0);//亮灯
_delay_ms(20);
S0=1;
}
else if(S01)
{
LED_PORT|=BIT(0);//灭灯
_delay_ms(20);
S0=0;
}
break;
case 11://2
if(S10)
{
LED_PORT&=~BIT(1);//亮灯
_delay_ms(20);
S1=1;
}
else if(S11)
{
LED_PORT|=BIT(1);//灭灯
_delay_ms(20);
S1=0;
}
break;
case 7://3
if(S20)
{
LED_PORT&=~BIT(2);//亮灯
_delay_ms(20);
S2=1;
}
else if(S21)
{
LED_PORT|=BIT(2);//灭灯
_delay_ms(20);
S2=0;
}
break;
case 14://4
if(S40)
{
LED_PORT&=~BIT(3);//亮灯
_delay_ms(20);
S4=1;
}
else if(S41)
{
LED_PORT|=BIT(3);//灭灯
_delay_ms(20);
S4=0;
}
break;
case 10://5
if(S50)
{
LED_PORT&=~BIT(4);//亮灯
_delay_ms(20);
S5=1;
}
else if(S51)
{
LED_PORT|=BIT(4);//灭灯
_delay_ms(20);
S5=0;
}
break;
case 6://6
if(S60)
{
LED_PORT&=~BIT(5);//亮灯
_delay_ms(20);
S6=1;
}
else if(S61)
{
LED_PORT|=BIT(5);//灭灯
_delay_ms(20);
S6=0;
}
break;

case 13://第7个灯
if(S80)
{
LED_PORT&=~BIT(6);//亮灯
_delay_ms(20);
S8=1;
}
else if(S81)
{
LED_PORT|=BIT(6);//灭灯
_delay_ms(20);
S8=0;
}
break;
case 9://第8个灯
if(S90)
{
LED_PORT&=~BIT(7);//亮灯
_delay_ms(20);
S9=1;
}
else if(S91)
{
LED_PORT|=BIT(7);//灭灯
_delay_ms(20);
S9=0;
}
break;

case 3://A键全亮
LED_PORT=0x00;//亮灯
_delay_ms(20);
break;
case 2://B键全灭
LED_PORT=0xFF;//灭灯
_delay_ms(20);
break;

case 5://9跑马灯
for( x=0;x<8;x++)
{
LED_PORT=~BIT(x);
_delay_ms(100);
}
break;
case 8://0
LED_PORT=0x00;
break;

default: break;
}

     }

AVR单片机期末自选2 4x4薄膜开关控制led灯相关推荐

  1. 单片机音频节奏灯_如何用单片机做出用音乐节奏来控制LED灯?

    我新安装了系统.驱动怎么办 如果你安装了操作系统,需要安装随机带的主板驱动,如果没有请安装下面的驱动.如果需要安装驱动,建议安装驱动精灵2008 ,安装之后,使用其自动更新驱动功能,它会自动下载并安装 ...

  2. 用51单片机中断控制LED灯亮灭

    用51单片机中断控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void dela ...

  3. Android Studio设计APP实现与51单片机通过WIFI模块(ESP8266-01S)通讯控制LED灯亮灭的设计源码【详解】

    目录 一.前言 二.效果展示 1.APP界面展示 2.C51硬件展示 三.Android Studio APP源代码 1.AndroidManifest.xml 1.请求联网: 2.开放明文传输: 2 ...

  4. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  5. 【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务

    学习目标: 学习普中51单片机的按键控制led灯. 电路图:                      学习内容:         LED灯的十六进制怎么算???         在这给大家算一下:首 ...

  6. c语言程序小灯从右向左闪烁,单片机控制LED灯点亮(C语言).PPT

    <单片机控制LED灯点亮(C语言).PPT>由会员分享,可在线阅读,更多相关<单片机控制LED灯点亮(C语言).PPT(45页珍藏版)>请在人人文库网上搜索. 1.1,单片机控 ...

  7. 用51单片机实现按键控制LED灯亮灭

    用51单片机实现按键控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void de ...

  8. 用c语言完成流水灯控制的程序设计,单片机C语言程序设计之TIMER0控制流水灯

    描述 基于单片机的LED流水灯的应用十分广泛,由单片机作为的核心控制器,通过按键实现控制功能和数据输入是非常普遍的.通常在所需按键数量不多时,系统常采用独立式按键.这种按键的电路配置灵活,软件结构简单 ...

  9. 51单片机控制LED灯

    个人网站:Geek交流圈 控制单个LED灯 基础知识 C-51的数据类型扩充定义sfr:特殊功能寄存器声明sbit:特殊功能位声明bit:位变量声明 例:sfr SCON = 0X98;sbit OV ...

最新文章

  1. linux系统编程_Linux系统编程:进程间通信
  2. 数据拟合matlab算法
  3. python官网怎么改中文-pycharm如何设置成中文
  4. VTK修炼之道73:交互部件_Widget应用综述
  5. 获取/设置IFRAME内对象元素的几种JS方法
  6. 龙芯3A4000 VNC配置
  7. 手机网页设计注意事项和解决方法
  8. 太难了!用Python数据造假后,我被公司升职加薪了~
  9. mysql的安装与卸载
  10. python支持中文注释
  11. python调用java接口或者类_python如何调用java类
  12. 2020美赛F奖论文(一):摘要、绪论和模型准备
  13. 【脑电信号】基于matlab SVM分期睡眠监测【含Matlab源码 611期】
  14. eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP
  15. 【信道编码/Channel Coding】纠错编码与差错控制
  16. 什么是HTTP代理?
  17. mysql emoy表情_emo表情包 - emo微信表情包 - emoQQ表情包 - 发表情 fabiaoqing.com
  18. 微信小程序开发学习4(视图与逻辑)
  19. jvm.option是什么,它是如何加载的
  20. c++ bitset类用法

热门文章

  1. c#基础---控制台应用程序飞行棋
  2. 一文读懂开创性文章——贝叶斯个性化排序(BPR)
  3. 信息安全文件上传漏洞upload-labs第21关详解
  4. 如何修复MacBook上的粘滞键
  5. 面试突击25:sleep和wait有什么区别
  6. 基于深度学习的数据增广技术一览
  7. 计算机一级通过选择题有要求,计算机一级考试选择题技巧
  8. 技术人生感悟之陈果:如果你累了,就换一种方式去生活
  9. 瑞熙贝通|实验室信息化管理系统|LIMS实验室管理系统功能详解
  10. HTML网页代码编辑格式