实践出真知之三----从跑马灯开始 (顺便搞定一个电话键盘)
标题说明:“窃取”的傻孩子《深入浅出AVR单片机》第三章的标题
帖子摘要:
1.从零开始学AVR (说明:希望能对AVR还没入门的朋友有所帮助)
2.学完第三章的一个电话键盘小实验
3.实验总结
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506193.jpg
(原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506194.jpg
(原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506195.jpg
(原文件名:3.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506196.jpg
(原文件名:4.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506197.jpg
(原文件名:5.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506198.jpg
(原文件名:6.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506199.jpg
(原文件名:7.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506200.jpg
(原文件名:8.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506201.jpg
(原文件名:9.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506202.jpg
(原文件名:10.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506203.jpg
(原文件名:11.jpg)
********************************************
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506205.jpg
(原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506206.jpg
(原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506207.jpg
(原文件名:3.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506208.jpg
(原文件名:4.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506209.jpg
(原文件名:5.jpg)
/*
FileName: 28KeyTest
Date: 2009/11/22
Time: 17:30-22:00
*/
#include<iom48v.h>
#include"led_dis.h"
#include"key.h"
#include"delay.h"
void Init(void)
{
DDRB = 0XF0;
DDRC = 0XFF;
DDRD = 0XFF;
PORTB = 0B11111110;
PORTC = 0B11011111;
PORTD = 0XFF;
}
void main(void)
{
unsigned char KeyValue=0;
Init();
while(1)
{
KeyValue = Key_Scan();
Led_Display(KeyValue);
}
}
/****************************delay.h***********************/
#ifndef _DELAY_H_
#define _DELAY_H_
extern void Delay_ms(unsigned char Time);
#endif
/****************************delay.c***********************/
#include<macros.h>
#include"delay.h"
void Delay_ms(unsigned char Time)
{
unsigned char n;
while(Time>0)
{
for (n=1; n<187; n++)
{
NOP();
}
Time--;
}
/****************************key.h***********************/
#ifndef _KEY_H_
#define _KEY_H_
#define Key_0 0x00
#define Key_1 0x01
#define Key_2 0x02
#define Key_3 0x03
#define Key_4 0x04
#define Key_5 0x05
#define Key_6 0x06
#define Key_7 0x07
#define Key_8 0x08
#define Key_9 0x09
#define Key_Time 10
#define Key_Uptri 11
#define Key_Downtri12
#define Key_Alarm 13
#define Key_Set 14
#define Key_Mup 15
#define Key_Mdown 16
#define Key_Nongli 17
#define Key_Star 18
#define Key_Sharp 19
#define Key_TP 20
#define Key_X 21
#define Key_Down 22
#define Key_Up 23
#define Key_AC 24
#define Key_CE 25
#define Key_Music 26
#define Key_Redial 27
#define NoKey 29
#define Key_X_1PORTC |= 0B00011111; \
PORTC &= 0B11101111; \
PORTB |= 0B11110000
#define Key_X_2PORTC |= 0B00011111; \
PORTC &= 0B11110111; \
PORTB |= 0B11110000
#define Key_X_3PORTC |= 0B00011111; \
PORTC &= 0B11111011; \
PORTB |= 0B11110000
#define Key_X_4PORTC |= 0B00011111; \
PORTC &= 0B11111101; \
PORTB |= 0B11110000
#define Key_X_5PORTC |= 0B00011111; \
PORTC &= 0B11111110; \
PORTB |= 0B11110000
#define Key_X_6PORTC |= 0B00011111; \
PORTB |= 0B11111111; \
PORTB &= 0B11011111
#define Key_X_7PORTC |= 0B00011111; \
PORTB |= 0B11111111; \
PORTB &= 0B11101111
#define Key_Scan_Port PINB
#define Key_Y_1 ((Key_Scan_Port|0B11110111)==0B11110111)
#define Key_Y_2 ((Key_Scan_Port|0B11111011)==0B11111011)
#define Key_Y_3 ((Key_Scan_Port|0B11111101)==0B11111101)
#define Key_Y_4 ((Key_Scan_Port|0B11111110)==0B11111110)
extern unsigned char Key_Scan(void);
#endif
}
/****************************key.c***********************/
#include<iom48v.h>
#include<macros.h>
#include"key.h"
#include"delay.h"
unsigned char Key_Scan(void)
{
/****扫描第一行****/
Key_X_1;
NOP();
if (Key_Y_1)
return Key_Time;
else if(Key_Y_2)
return Key_Uptri;
else if(Key_Y_3)
return Key_Downtri;
else if(Key_Y_4)
return Key_Alarm;
Key_X_2;
NOP();
if (Key_Y_1)
return Key_Set;
else if(Key_Y_2)
return Key_Mup;
else if(Key_Y_3)
return Key_Mdown;
else if(Key_Y_4)
return Key_Nongli;
Key_X_3;
NOP();
if (Key_Y_1)
return Key_1;
else if(Key_Y_2)
return Key_4;
else if(Key_Y_3)
return Key_7;
else if(Key_Y_4)
return Key_Star;
Key_X_4;
NOP();
if (Key_Y_1)
return Key_2;
else if(Key_Y_2)
return Key_5;
else if(Key_Y_3)
return Key_8;
else if(Key_Y_4)
return Key_0;
Key_X_5;
NOP();
if (Key_Y_1)
return Key_3;
else if(Key_Y_2)
return Key_6;
else if(Key_Y_3)
return Key_9;
else if(Key_Y_4)
return Key_Sharp;
Key_X_6;
NOP();
if (Key_Y_1)
return Key_TP;
else if(Key_Y_2)
return Key_X;
else if(Key_Y_3)
return Key_Down;
else if(Key_Y_4)
return Key_Up;
Key_X_7;
NOP();
if (Key_Y_1)
return Key_AC;
else if(Key_Y_2)
return Key_CE;
else if(Key_Y_3)
return Key_Music;
else if(Key_Y_4)
return Key_Redial;
return NoKey;
}
/****************************led_dis.h***********************/
#ifndef _LED_DIS_H_
#define _LED_DIS_H_
#include<iom48v.h>
#define Led_0 0
#define Led_1 1
#define Led_2 2
#define Led_3 3
#define Led_4 4
#define Led_5 5
#define Led_6 6
#define Led_7 7
#define Led_8 8
#define Led_9 9
#define Led_A 0X0A
#define Led_B 0X0B
#define Led_C 0X0C
#define Led_D 0X0D
#define Led_E 0X0E
#define Led_F 0X0F
#define Led_H 16
#define Led_L 17
#define Led_P 18
#define Led_r 19
#define Led_U 20
#define Led_T 21
#define Led_n 22
#define Led_S 5
#define Led_d 23
#define Led_X1 24
#define Led_X2 25
#define Led__26
#define Led_Pls1 27
#define Led_Pls2 28
#define Led___ 29
#define Led_NULL 30
#define Led1 PORTD |= 0B10000000
#define Led2 PORTC |= 0B00100000
#define Led1M PORTD &= 0B01111111
#define Led2M PORTC &= 0B11011111
#define LedDisPort PORTD
extern void Led_Display(unsigned char KeyValue);
#endif
/****************************led_dis.c***********************/
#include<iom48v.h>
#include"led_dis.h"
#include"delay.h"
#include"key.h"
const unsigned char DisTab[]=
{
0xC0,0xF9,0xA4,0xB0,0x99, //0,1,2,3,4
0x92,0x82,0xF8,0x80,0x90, //5,6,7,8,9
0x88,0x83,0xC6,0xA1,0x86, //A,b,C,d,E
0x8E,0x89,0xC7,0x8C,0xAF, //F,H,L,P,r
0xC1,0x87,0xC8,0xA1,0x93, //U,T,n,d,X1,
0x9A,0xBF,0xB9,0x8F,0xF7,0XFF //X2,-,Pls1,Pls2,NULL
};
void Led_Display(unsigned char KeyValue)
{
static unsigned char L1=Led___, L2=Led___; //验证一下static
switch(KeyValue)
{
case NoKey: break;
case Key_1: L1=Led_NULL; L2=Led_1; break;
case Key_2: L1=Led_NULL; L2=Led_2; break;
case Key_3: L1=Led_NULL; L2=Led_3; break;
case Key_4: L1=Led_NULL; L2=Led_4; break;
case Key_5: L1=Led_NULL; L2=Led_5; break;
case Key_6: L1=Led_NULL; L2=Led_6; break;
case Key_7: L1=Led_NULL; L2=Led_7; break;
case Key_8: L1=Led_NULL; L2=Led_8; break;
case Key_9: L1=Led_NULL; L2=Led_9; break;
case Key_0: L1=Led_NULL; L2=Led_0; break;
case Key_Time: L1=Led_T; L2=Led_E; break;
case Key_Uptri: L1=Led_U; L2=Led_P; break;
case Key_Downtri:L1=Led_D; L2=Led_n; break;
case Key_Alarm: L1=Led_A; L2=Led_L; break;
case Key_Set: L1=Led_S; L2=Led_E; break;
case Key_Mup: L1=Led_n; L2=Led_P; break;
case Key_Mdown: L1=Led_n; L2=Led_d; break;
case Key_Nongli: L1=Led_n; L2=Led_L; break;
case Key_Star: L1=Led_S; L2=Led_r; break;
case Key_Sharp: L1=Led_S; L2=Led_P; break;
case Key_TP: L1=Led_T; L2=Led_P; break;
case Key_X: L1=Led_X1; L2=Led_X2; break;
case Key_Down: L1=Led__; L2=Led__; break;
case Key_Up: L1=Led_Pls1; L2=Led_Pls2; break;
case Key_AC: L1=Led_A; L2=Led_C; break;
case Key_CE: L1=Led_C; L2=Led_E; break;
case Key_Music: L1=Led_U; L2=Led_C; break;
case Key_Redial: L1=Led_r; L2=Led_L; break;
}
LedDisPort = DisTab;// | 0B10000000;
Led1;
Delay_ms(1);
Led1M;
LedDisPort = DisTab & 0B01111111;//while(1);
Led2;
Delay_ms(1);
Led2M;
}
****************************************************************
总结:
在读取引脚的电平之前一定要先延时一定时间,刚开始时我因为没延时导致按部分按键读取错误,浪费了整整一天的调试时间。 进步不小。 笨小孩 和 傻孩子 似乎很像啊。 关于这个延迟,有兴趣,请参考配套辅导教材:(从这里下载)http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3239709&bbs_page_no=1&bbs_id=3039
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506299.JPG
(原文件名:1.JPG) 谢谢:【3楼】 Gorgon Meducer 傻孩子 mark。
页:
[1]