AVRmega16 LED 例程
 
例程1:点亮一个灯
#include<mega16.h>
#include<delay.h>
void main(void)
{
DDRA=0xff;
while(1)
{
PORTA=0x01;
};
}
 
例程2:运用8个LED显示出流水灯的效果(运用for语句)
#include<mega16.h>
#include<delay.h>
void main(void)
{
unsignedchar i;
PORTA=0x00;
DDRA=0xFF;
while(1)
{
for(i=0;i<8;i++)
{
PORTA=1<<i ;
delay_ms(200);
}
}
}

或者(运用if语句,用位移 << 操作实现)

 
例程
#include<mega16.h>
#include<delay.h>
void main(void)
{
unsignedchar a;
PORTA=0x00;
DDRA=0xFF;
a=0b00000001;
while(1)
{
if(a==0b00000000)
a=0b00000001;
PORTA=a;
a=a<<1;
delay_ms(200);
}
}
 

或者用一维数组

 
#include<mega161.h>
#include<delay.h>
void main()
{
unsignedchar display1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsignedchar display2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsignedchar k,b;
DDRA=0xff;
while(1)
{
for(k=0;k<8;k++)
{
PORTA=display1[k];
delay_ms(150);
}
for(b=0;b<8;b++)
{
PORTA=display2[b];
delay_ms(150);
}
}
}

例程3:用独立按键控制一个灯(运用if与else语句)

#include<mega16.h>
#include<delay.h>
void main(void)
{
DDRA=0xff;
DDRB=0x00;
PORTB=0xff;
while(1)
{
if(PINB.0==0)
{
PORTA=0x01;
//delay_ms(1000);
}
else
{
PORTA=0x00;
// delay_ms(1000);
}
};
}
 
  
例程4:用独立按键控制8个灯(运用switch语句)
 
牛刀小试:自己用switch编写:
 
 
#include<mega16.h>
#include<delay.h>
void main(void)
{
DDRA=0xff;
DDRB=0x00;
while(1)
{
switch(PINB)
{
case(0xfe):
PORTA=0x01;break;
case(0xfd):
PORTA=0x02;break;
case(0xfb):
PORTA=0x04;break;
case(0xf7):
PORTA=0x08;break;
case(0xef):
PORTA=0x10;break;
case(0xdf):
PORTA=0x20;break;
case(0xbf):
PORTA=0x40;break;
case(0x7f):
PORTA=0x80;break;
}
};
}

1位8段数码管

例程1:使数码管从0-F跳动(运用一维数组)
 

#include<mega16.h>
#include<delay.h>
void main(void)
{
//unsigned char display[16]={0x3F, 0x06, 0x5B, 0x4F,0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F,0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; //共阴极
unsignedchar display[16]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极
unsignedchar i =0;
PORTA=0x00;
DDRA=0xff;
while(1)
{
PORTA= display[i];
i++;
if(i ==16)
i =0;
delay_ms(1000);
//PORTA= ~display[i] ; //共阴极 (取反)
PORTA= display[i];//共阳极
};
}
 
                                       8位8段数码管
 
例程1:利用8位8段数码管显示自己的学号(1理解数码管工作原理)
 
#include<mega16.h>
#include<delay.h>
void main(void)
{
// unsigned char i;
PORTA=0x00;//段选初始化
PORTB=0x00;
DDRA=0xff;//段
DDRB=0xff;//位
while(1)
{
PORTB=0x00;
PORTA=0x06;//1
PORTB=0xfe;
delay_ms(1);
PORTB=0x00;
PORTA=0x66;//4
PORTB=0xfd;
delay_ms(1);
PORTB=0x00;
PORTA=0x3f;//0
PORTB=0xfb;
delay_ms(1);
PORTB=0x00;
PORTA=0x06;//1
PORTB=0xf7;
delay_ms(1);
PORTB=0x00;
PORTA=0x3f;//0
PORTB=0xef;
delay_ms(1);
PORTB=0x00;
PORTA=0x7d;//6
PORTB=0xdf;
delay_ms(1);
PORTB=0x00;
PORTA=0x66;//4
PORTB=0xbf;
delay_ms(1);
PORTB=0x00;
PORTA=0x07;//7
PORTB=0x7f;
delay_ms(1);
};
}
 
例程:数码管显示时钟(设置定时器)
 
#include<mega16.h>
#include<delay.h>
#defineuintunsignedint
#define uchar unsignedchar
uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shi,fen,miao;
uint time;//注意char 与int的取值?
void display(uchar shi,uchar fen,uchar miao)
{
PORTB=0Xfe;//位码
PORTA=(duan[shi/10]);//段码
delay_ms(2);
PORTB=0xfd;
PORTA=(duan[shi%10]);
delay_ms(2);
PORTB=0xfb;//位码
PORTA=0x40;//段码
delay_ms(2);
PORTB=0xf7;//位码
PORTA=(duan[fen/10]);//段码
delay_ms(2);
PORTB=0xef;
PORTA=(duan[fen%10]);
delay_ms(2);
PORTB=0xdf;//位码
PORTA=0x40;//段码
delay_ms(2);
PORTB=0xbf;//位码
PORTA=(duan[miao/10]);//段码
delay_ms(2);
PORTB=0x7f;
PORTA=(duan[miao%10]);
delay_ms(2);
}
void init()//程序初始化
{
TCCR0=0x02;
TCNT0=0x06;
TIMSK=0x01;
ACSR=0x80;
#asm("sei")
PORTA=0x00;
PORTB=0x00;
DDRA=0xff;
DDRB=0xff;
time=0;
}
interrupt [TIM0_OVF]void timer0_ovf_isr(void)  /*打开定时器0 */
{
TCNT0=0x06;//设置初值 (0-ff之间)
time++;
if(time==400)//计算,结合初值算出精确时间
{
miao++;
if(miao>59)
{
miao=0;
fen++;
};
if(fen>59)
{
fen=0;
shi++;
};
if(shi>23)
shi=0;
time=0;//归零
}
}
void main()
{
init();
while(1)
{
display(shi,fen,miao);
}
}
 
例程:独立键盘与数码管显示数字
 
#include<mega16.h>
#include<delay.h>
unsignedchar display[16]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极
unsignedchar temp;
void main(void)
{
DDRA=0xff;
DDRB=0x00;
while(1)
{
temp=PINB;//将值给tem
switch(PINB)
{
case(0xfe):
PORTA=display[0];break;
case(0xfd):
PORTA=display[1];break;
case(0xfb):
PORTA=display[2];break;
case(0xf7):
PORTA=display[3];break;
case(0xef):
PORTA=display[4];break;
case(0xdf):
PORTA=display[5];break;
case(0xbf):
PORTA=display[6];break;
case(0x7f):
PORTA=display[7];break;
}
};
}
 

例程:矩阵键盘与数码管显示数值

 
#include<mega16.h>
#include<delay.h>
//#define uchar unsigned char
//#define uint unsigned int
unsignedchar display[16]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极
unsignedchar yin,temp;
void init()
{
PORTA=0x00;
DDRA=0Xff;
DDRB=0x00;
PORTB=0x00;
}
void keyscan()
{
for(yin=0;yin<2;yin++)
{
PORTB=0xfe;//将第一行置0,即检测第一行
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay_ms(10);//延时
temp=PINB;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PINB;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)
{
case0xee:
PORTA=display[0];break;
case0xde:
PORTA=display[1];break;
case0xbe:
PORTA=display[2];break;
case0x7e:
PORTA=display[3];break;
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PINB;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}
}
for(yin=0;yin<2;yin++)
{
PORTB=0xfd;//将第2行置0,即检测第2行?
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay_ms(10);//延时
temp=PINB;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PINB;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)
{
case0xed:
PORTA=display[4];break;
case0xdd:
PORTA=display[5];break;
case0xbd:
PORTA=display[6];break;
case0x7d:
PORTA=display[7];break;
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PINB;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}
}
for(yin=0;yin<2;yin++)
{
PORTB=0xfb;//将第3行置0,即检测第3
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay_ms(10);//延时
temp=PINB;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PINB;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)
{
case0xeb:
PORTA=display[8];break;
case0xdb:
PORTA=display[9];break;
case0xbb:
PORTA=display[10];break;
case0x7b:
PORTA=display[11];break;
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PINB;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}
}
for(yin=0;yin<2;yin++)
{
PORTB=0xf7;//将第4兄?,即检测第4行
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay_ms(10);//延时
temp=PINB;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PINB;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)
{
case0xe7:
PORTA=display[12];break;
case0xd7:
PORTA=display[13];break;
case0xb7:
PORTA=display[14];break;
case0x77:
PORTA=display[15];break;
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PINB;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}
}
}
void main()
{
init();
PORTB=0xff;//PB输出为高电位
DDRB=0x0f;//设置高
while(1)
{
keyscan();
}
}
 
 
LCD延时的时钟代码
 

#include<lcd.h>
#include<delay.h>
#asm
.equ __lcd_port =0x18
#endasm
int sec =50,min=59,hour=23;
void display_time(void){
lcd_gotoxy(0,0);
lcd_putchar('0'+hour/10);
lcd_putchar('0'+hour%10);
lcd_putchar(':');
lcd_putchar('0'+min/10);
lcd_putchar('0'+min%10);
lcd_putchar(':');
lcd_putchar('0'+sec/10);
lcd_putchar('0'+sec%10);
}
void time_tick(void){
sec++;
if(sec ==60){
sec =0;
min++;
if(min ==60){
min =0;
hour++;
if(hour ==24){
hour =0;
}
}
}
}
void main(void){
lcd_init(16);
while(1){
time_tick();
display_time();
delay_ms(1000);
}
}
 
 
直流电机调速
 

#include<mega16.h>
#include<delay.h>
#define uchar unsignedchar
uchar a;
#define key_up PINA.5
#define key_dowm PINA.6
interrupt [EXT_INT0]void INT0_mode(void)//中断选择电机正反转
{ TCCR1A=0x00;// PD4,PD5都不产生PWM
PORTD=0x00;//初始化PD4,PD5电平相等
a++;
delay_ms(10);
if(a>1)
a=0;
}
void main(void)
{
DDRA.4=0;
DDRA.5=0;
PORTA=0xf0;
DDRD=0xf0;//PD4,5做输出
GICR=0x40;//外部中断0
MCUCR=0x00;//低电平触发INT0
MCUCSR=0x00;
GIFR=0x40;
TCCR1B=0x19;//工作模式14 快速PWM
TCNT1H=0x00;//计数器从0开始
TCNT1L=0x00;
ICR1H=5000/256;//计数上限植高8位
ICR1L=5000%256;// 计数上限植低8位
#asm("sei")
while(1)
{
if(a==0)
{
if(key_up==0)
{ PORTD.5=0;
TCCR1A=0x22;// 只开PD4
OCR1B=1500;//比较数值(快速)
}
if(key_dowm==0)
{ PORTD.5=0;
TCCR1A=0x22;// 只开PD4
OCR1B=3000;//慢速
}
 最后小结,其实不论是什么代码也好,最终代码的调用都应该是使用各种模块分类的形式去调用,而不会是零散的。c是最接近底层硬件的代码,是有非常好的机器亲和性,可以通过单片机通过现象去学好c语言。
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

AVRmega16 LED 例程的更多相关文章

  1. 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器基础板载资源 ...

  2. 【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/1/5

    [iCore3 ARM代码下载地址][全部]DEMO1.0测试程序发布例程一:ARM驱动三色LED例程二:读取arm按键状态例程三:EXTI中断输入实验——读取ARM按键状态例程四:USART通信实验 ...

  3. [异常] JLink Error: Could not find supported CPU core on JTAG chain J-Link连接不到stm32内核问题

    >_<" 昨天晚上还好好的,今天早上调试的时候就不行了,下载程序的时候总是报J-Link连接不上,而且stm32似乎也死机了,led灯不闪烁,TFT屏也无显示. >_< ...

  4. 【资料下载区】【iCore4相关代码、资料下载地址】更新日期2018/02/24

    [iCore4相关文档][更新中...] iCore4原理图(PDF)下载iCore4引脚注释(PDF)下载iCore4机械尺寸(PDF)下载 [iCore4相关例程代码][ARM] DEMO测试程序 ...

  5. 【资料下载区】【iCore1S相关代码、资料下载地址】更新日期2017/10/09

    [iCore1S相关文档][更新中...] iCore1S原理图(PDF)下载iCore1S引脚注释(PDF)下载 [iCore1S相关例程代码][ARM][更新中...] DEMO1.0测试程序发布 ...

  6. 【资料下载区】【GMT43相关代码、资料下载地址】更新日期2017/06/28

    [GMT43相关文档][更新中...] GMT43原理图(PDF)下载GMT43说明书(PDF)下载GMT43机械结构尺寸(PDF)下载 [GMT43相关例程代码][ARM][更新中...] 基于HA ...

  7. Zigbee协议栈--Z-Stack的使用

    使用方法简介:一般情况下用户只需要额外添加三个文件就可以完成一个项目.一个是主文件,存放具体的任务事件处理函数:一个是这个主文件的头文件:另外一个是以Osal开头的操作系统接口文件,是专门存放任务处理 ...

  8. GPIO 的 8 种工作模式

    GPIO 的 8 种工作模式 在初始化 GPIO 的时候,根据我们的使用要求,必须把 GPIO 设置为相应的模式.如 LED 例程中的 GPIO 引脚如果配置为模拟输入模式是必然会导致错误的. 我们配 ...

  9. [stm32][ucos] 1、基于ucos操作系统的LED闪烁、串口通信简单例程

    * 内容简述: 本例程操作系统采用ucos2.86a版本, 建立了5个任务            任务名                                             优先级 ...

随机推荐

  1. .NET 云原生架构师训练营(权限系统 代码实现 Store.EntityFramework)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

  2. 主机磁盘使用率超过85%导致es索引变为只读模式

    [ type=cluster_block_exception, reason=index [ index_name ] FORBIDDEN/12/index read-only / allow del ...

  3. 解决:阿里云服务器被植入挖矿程序后修改密码失败的问题(报错:passwd: Authentication token manipulation error)

    如下图,在修改密码的时候会报错 原因: 通常不能修改密码都是/etc/passwd文件或者/etc/shadow文件被锁住了 解决: 检查/etc/passwd文件和/etc/shadow文件是否被锁 ...

  4. Windows server 2016 2019远程端口修改操作

    windows server 2016 2019修改远程端口操作   一.修改3389远程端口 1,按"win+r"快捷键,在对话框中输入regedit 2, 找到路径 \HKEY ...

  5. Linux系列——配置SSH免密登录

    ​ 在进行配置之前需要先关闭防火墙.配置hosts映射. 具体参见:Linux系列--常规基础操作 下面重点说明如何配置SSH: 1.编辑sshd服务配置文件,开启免密验证, vi /etc/ssh/ ...

  6. NSSCTF-finalrce

    菜狗的我打开题目之后,人都给我吓傻了,直接过滤的超出了我的认知  菜狗直接就枯了,这个题目其实是不难的,就是比较阴间的一个题目,审计代码,可以看到最后一行的代码"exec($url)&quo ...

  7. [Python]小白入门时遇到的各种问题

    Q:关于Python2.X和Python3.X各种版本有什么区别,小白应该选哪个? A: 1.背景及简要介绍 Python 2 发布于 2000 年年底. 随着 Python 2 的不断发展,更多的功 ...

  8. 还在争论WPS、Office哪个更好用?这款云办公工具才是真的香!

    最近,金山WPS更新狠狠的刷了一波存在感.尤其是xlookup函数,着实是有被惊艳到,也让大家看到了国产办公软件的进步.甚至有人认为WPS已经超越了传统的办公软件--微软office.WPS的优点固然 ...

  9. 大数据BI系统是怎么助力企业长久发展的

    多元化集团企业在发展到一定阶段后,往往会遇到业务与财务分离.管理缺乏系统决策支持等管理问题.财务决策支持系统建设实施BI是管理升级的内在要求. 1996年,加特纳集团提出了商业智能(Businesin ...

  10. NPOI导出大量数据的避免OOM解决方案【SXSSFWorkbook】

    一.NPOI的基本知识 碰到了导出大量数据的需求场景:从数据读取数据大约50W,然后再前端导出给用户,整个过程希望能较快的完成.如果不能较快完成,可以给与友好的提示. 大量数据的导出耗时的主要地方: ...