基于atmega48的扫描按键例子

这个例子详细展示了如何在ATmega48单片机上实现按键扫描。通过初始化IO口、定时器T1中断服务以及按键扫描函数,实现了对按键位置的判断和数据的实时更新。代码中包括了IO口设置、定时器配置、数据刷新流程和译码功能。
摘要由CSDN通过智能技术生成

仿真图:其中左边的的温度传感器等AD转换与本例子无关
在这里插入图片描述

#include “iom48v.h”
#include “macros.h”
#define uchar unsigned char
#define uint unsigned int
#define KEY_Press keycode!=0x00

#pragma interrupt_handler T1_refresh: 12

void delay(uint a)
{
while(a–);
}

const uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};

uchar segcode[4]={0XFF,0XFF,0XFF,0XFF}; //段码 (存放译码值)
uchar data[4]; //显示数据
uchar keycode; //判断按键位置
uchar n=0; //显示刷新标志
uchar key=0; //键值 PINB!=0X0F
uchar digit=0;

/IO口初始化函数/
void IO_Init(void)
{
DDRB = 0xF0;
PORTB = 0x0F; //上拉
DDRC = 0xFF;
PORTC = 0xFF;
DDRD = 0xFF;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <iom16v.h> #include <macros.h> #define RS_0 PORTD &= ~(1 << PD3) #define RS_1 PORTD |= (1 << PD3) #define RW_0 PORTD &= ~(1 << PD4) #define RW_1 PORTD |= (1 << PD4) #define EN_0 PORTD &= ~(1 << PD6) #define EN_1 PORTD |= (1 << PD6) //微秒级延时程序晶振8MHZ void delay_us(int time) { do { time--; } while (time>1); } //毫秒级延时程序晶振8MHZ void delay_ms(unsigned int time) { while(time!=0) { delay_us(1000); time--; } } /*显示屏命令写入函数*/ void LCD_write_com(unsigned char com) { RS_0; RW_0; PORTB = com; EN_1; delay_us(20); EN_0; } /*显示屏命令写入函数*/ void LCD_write_data(unsigned char data) { RS_1; RW_0; PORTB = data; EN_1; delay_us(200); EN_0; } /*显示屏清空显示*/ void LCD_clear(void) { LCD_write_com(0x01); delay_ms(5); } /*显示屏字符串写入函数*/ void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_write_com(0x80 + x); } else { LCD_write_com(0xC0 + x); } while (*s) { LCD_write_data( *s); s ++; } } /*显示屏单字符写入函数*/ void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) { if (y == 0) { LCD_write_com(0x80 + x); } else { LCD_write_com(0xC0 + x); } LCD_write_data( data); } /*显示屏初始化函数*/ void LCD_init(void) { DDRB = 0xFF; /*I/O口方向设置*/ DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6); LCD_write_com(0x38); /*显示模式设置*/ delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); LCD_write_com(0x08); /*显示关闭*/ LCD_write_com(0x01); /*显示清屏*/ LCD_write_com(0x06); /*显示光标移动设置*/ delay_ms(5); LCD_write_com(0x0C); /*显示开及光标设置*/ } void main(void) { unsigned char i; unsigned char *p; PORTA = 0xFF; /*打开上拉*/ DDRA = 0x00; /*方向输入*/ PORTB = 0xFF; /*电平设置*/ DDRB = 0xFF; /*方向输出*/ PORTC = 0x7F; DDRC = 0x80; PORTD = 0xFF; DDRD = 0x00; delay_ms(100); LCD_init(); while (1) { i = 1; p = "yixiangongren"; //LCD_clear(); LCD_write_str(1,0,"www.eehome.cn"); delay_ms(50); while (*p) { LCD_write_char(i,1,*p); i ++; p ++; //delay_ms(50); } delay_ms(500); } } 本文来自: 电子工程师之家http://www.eehome.cn
摘 要 电动自行车由于轻便灵活、节能环保、价格适中而得到人们的广泛使用,成 为人们短途出行的理想交通工具。同时中国具有世界上最庞大的自行车市场,电 动自行车产业在中国有着非常广阔的应用前景。因此发展电动自行车具有良好的 社会意义和可观的经济效益。 目前电动自行车的动力驱动主要是轮毂式无刷直流电动机。电动自行车控制 器作为电动自行车的控制核心,是电动自行车的关键部件,与无刷直流电动机一 起构成电动自行车的动力驱动系统。为了提高电动自行车的的骑行舒适性、安全 性,本文对电动自行车的动力驱动系统进行了深入的研究,并简要介绍了电动自 行车控制器的功能构成和软硬件设计。 首先简要介绍了无刷直流电动机的基本结构和工作原理,并求出了其学模 型;分析了无刷直流电动机换相转矩脉动产生的原因,提出了采用延时导通重叠 换相法对转矩脉动进行抑制;同时阐述了无刷直流电动机能量回馈制动的原理, 得出能量回馈制动的控制规律;最后给出了电动自行车功能设计的要求。 其次详细介绍了无刷直流电动机的控制策略,根据无刷直流电动机的调速特 性,采用PWM调制方式,通过调节电机电枢电压调节电机速度。并对速度电流双 闭环调速系统进行了详细的论述,通过采用模糊-PI控制算法调节速度,提高了电 机转速的控制精度。 最后介绍了电动自行车控制器的软硬件设计,并给出样机运行的实验结果。 硬件设计以单片机ATmega48为核心,包括电源电路、三相全桥逆变电路及其驱动 保护电路、电流检测等部分。软件设计采用“时间片”分时思想和模块化结构, 根据控制需求编写了各个模块程序,如驱动换相、柔性电子刹车(EABS)、欠 压保护;并实现“速度-电流”双闭环的控制功能;给出了各模块详细的程序流程 图。 实验结果表明:控制器较好地实现了对无刷直流电动机的控制,各项性能达 到预定要求,电机启动迅速、转矩脉动较小、速度跟踪性能良好、运行平稳可靠。 关键词:电动自行车;无刷直流电动机;转矩脉动;能量回馈制动;模糊-PI控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值