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. 看我如何使用 shell 来获取所有 KVM 虚拟机的 IP 地址

    文章目录 脚本说明 脚本展示 效果展示 此脚本的初衷是因为,KVM创建的桥接网卡的虚拟机,无法使用virsh domifaddr命令获取IP,而创建的nat网卡的虚拟机,则可以直接使用virsh do ...

  2. Vue 源码解读(7)—— Hook Event

    前言 Hook Event(钩子事件)相信很多 Vue 开发者都没有使用过,甚至没听过,毕竟 Vue 官方文档中也没有提及. Vue 提供了一些生命周期钩子函数,供开发者在特定的逻辑点添加额外的处理逻 ...

  3. 传输层 lcx实现本地端口映射&&内网代理

    如果目标服务器由于防火墙的限制,部分端口(例如3389)的数据无法通过防火墙,可以将目标服务器相应端口的数据透传到防火墙允许的端口(例如53),在目标主机上执行如下命令,就可以直接从远程桌面连接目标主 ...

  4. RENIX流量发送模式——网络测试仪实操

    信而泰的RENIX平台支持5种传输模式, 如下图所示. 模式一: continuous Continuous:连续发送流 持续发送方式是默认的发送模式,  它不会自动的停止, 会一直发送, 直到用户手 ...

  5. Spring Cloud Gateway现高风险漏洞,建议采取措施加强防护

    大家好,我是DD 3月1日,Spring官方博客发布了一篇关于Spring Cloud Gateway的CVE报告. 其中包含一个高风险漏洞和一个中风险漏洞,建议有使用Spring Cloud Gat ...

  6. Smartbi与Tableau功能盘点,我选Smartbi!

    只要对大数据BI行业有所了解的人群,想必这两个数据分析工具Tableau和PowerBI都已经耳熟能详了吧. ·关于Tableau Tableau是一种数据可视化的工具,可提供复杂的计算.数据混合和仪 ...

  7. 运行jar包使用外部依赖

    nohup java -Dloader.path="lib/" -Dfile.encoding=utf-8 -jar test.jar > test.out 2>&am ...

  8. 什么是闭包?(python)

    闭包,又称闭包函数或闭合函数,和嵌套函数类似.不同之处在于,闭包函数的外部函数返回的不是一个具体的值,而是一个函数.一般情况下,返回的函数会赋值给一个变量,便于反复调用. def outer(out) ...

  9. jprofiler 查看程序内存泄露

    在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备今后遇到相似问题时可以作为参考. 运行环境: Tomcat6,jdk6,JProfiler8 内存 ...

  10. Visual Studio 文字样式背景设置

    菜单栏 "工具"->选项->环境->常规