标题: 如何补全这avr单片机程序,还要有按键检测、延时去抖,等待抬起等环节。需要怎么补? [打印本页]

作者: 零帝    时间: 2020-3-23 10:27
标题: 如何补全这avr单片机程序,还要有按键检测、延时去抖,等待抬起等环节。需要怎么补?
单片机源程序如下:

#include <iom16v.h>

#define  uint unsigned int

void delay10ms(void)
{
uint t;
for( t=0;t<1360;t++);
}

void main(void)
{
    SFIOR&=0xFB;
        DDRA = 0x00;                                                /*A口输入*/
        PORTA = 0xFF;                                                /*A口上拉*/
    DDRB = 0xFF;                                                /*B口输出*/
        PORTB = 0xFF;                                                /*LED全灭*/
        DDRC = 0xFF;
        PORTC = 0xFF;
        DDRD = 0x00;
        PORTD = 0xFF;

        while (1) {
                if ((PINA & (1 << PA0)) == 0)
                   {        
                      delay10ms();
                          if ((PINA & (1 << PA0)) == 0)
                          while((PINA & (1 << PA0)) == 0);//??????   
                          PORTB = ~(1 << PB0);                /*?????*/
                        }
                if ((PINA & (1 << PA1)) == 0)
                    {
                         delay10ms();
                         if ((PINA & (1 << PA1)) == 0)
                         while((PINA & (1 << PA1)) == 0);//??????
                         PORTB = ~(1 << PB1);
                        }
                if ((PINA & (1 << PA2)) == 0)
                   {
                     delay10ms();
                         if ((PINA & (1 << PA2)) == 0)
                         while((PINA & (1 << PA2)) ==0);//??????  
                        PORTB = ~(1 << PB2);
                        }
                if ((PINA & (1 << PA3)) == 0)
                   {
               
               
               
                        PORTB = ~(1 << PB3);
                        }
                if ((PINA & (1 << PA4)) == 0)
                    {
                        
                        PORTB = ~(1 << PB4);
                        }
                if ((PINA & (1 << PA5)) == 0)
                   {
                  
                        PORTB = ~(1 << PB5);
                        }
                if ((PINA & (1 << PA6)) == 0)
                    {
                        
                        PORTB = ~(1 << PB6);
                        }
                if ((PINA & (1 << PA7)) == 0)
                   {
                  
                        PORTB = ~(1 << PB7);
                        }
                }
}


作者: wo4fisher    时间: 2020-3-23 14:13
如果是初学者,建议先学51,因为51的IO口配置很简单,读写IO的值和位操作的方便性、可操作性都是单片机里最省事的,同时51的例子网上也有好多,便于脱开51硬件去学习外围电路的使用(编程)。
作者: wo4fisher    时间: 2020-3-23 14:16
教科书式的按键检测一般是这样的
if(某个按键按下)
     {
          表达式;
          while(按键按下) ;

作者: jinsheng7533967    时间: 2020-3-23 14:52
建议你买一块AVR的板子回来练,光自己整是折磨,板子才不到100,再或者用仿真软件练,网上面很多AVR的案子,先搞定AVR的端口,其他的同51差别不大
作者: 余生不负    时间: 2020-3-23 15:24
wo4fisher 发表于 2020-3-23 14:16
教科书式的按键检测一般是这样的
if(某个按键按下)
     {

用   while(按键按下) ;  做判断延时真的不好,如果有数码管是闪
作者: yoxi    时间: 2020-3-23 15:56
很简单,坛子里大把的代码,多练练手你就明白怎么做了
作者: lovexulu    时间: 2020-3-23 18:35
动手码上缺失的代码,然后调试。就这么补。
作者: jinsheng7533967    时间: 2020-3-23 19:35
余生不负 发表于 2020-3-23 15:24
用   while(按键按下) ;  做判断延时真的不好,如果有数码管是闪

错!就看你将显示函数放在什么地方




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1