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. C语言中各种输入函数之间的区别

    以下内容全部来自Bay(百度百科) scanf的返回值 scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF. 如: scanf("%d%d", &a, ...

  2. 8、Linux基础--rpm、yum、yum私有仓库、系统优化

    笔记 1.晨考 1.文件的三种时间属性,每一种时间属性在什么情况下改变 atime : 访问时间 mtime :修改时间 ctime :修改属性时间 2.权限的类型 可读(r, 4) 可写(w, 2) ...

  3. 矩阵QR分解

    1 orthonormal 向量与 Orthogonal 矩阵 orthonormal 向量定义为 ,任意向量  相互垂直,且模长为1: 如果将  orthonormal 向量按列组织成矩阵,矩阵为  ...

  4. Realtime Data Processing at Facebook

    概要 这篇论文发表于2016年,主要是介绍Facebook内部的流式计算平台的设计与思考,对于流式计算的关键特性的实现选型上进行深度对比分析. 流式计算系统5个衡量指标 文中提到有5个重要的考量部分 ...

  5. FreeHttp2.3升级说明

    一.升级方法 下载新版本插件 https://files.cnblogs.com/files/lulianqi/FreeHttp2.3.0zip  或 http://lulianqi.com/file ...

  6. 漏洞CVE 2017-8464

    概述 微软的Patch Tuesday更新发布了多达95个针对Windows.Office.Skype.IE和Edge浏览器的补丁.其中27个涉及远程代码执行,18个补丁被微软设定为严重(Critic ...

  7. ts转js运行报错:“tsc : 无法加载文件

    一.在typescript.ts转换成.js运行时报错解决办法: 1.第一步:鼠标在vscode软件上右击打开属性–>兼容性–>以管理员的身份运行此程序,如下图: 2.第二步:打开vsco ...

  8. (转载)C 中static 和inline

    https://www.cnblogs.com/lxlx1798/articles/9996521.html

  9. 04-Eureka服务注册与发现

    1.介绍 2.快速开始 父工程的maven 配置文件,如下 <?xml version="1.0" encoding="UTF-8"?> <p ...

  10. Lua中如何实现类似gdb的断点调试--02通用变量打印

    在前一篇01最小实现中,我们实现了Lua断点调试的的一个最小实现.我们编写了一个模块,提供了两个基本的接口:设置断点和删除断点. 虽然我们已经支持在断点进行变量的打印,但是需要自己指定层数以及变量索引 ...