首先先说明一下我才刚刚接触单片机,都是说这个入门慢,其实说的一点错误没有。我觉得我入门这个很慢,学这个也才刚刚的半个月,现在只是刚刚的通过按键,能够点亮或者熄灭一盏灯。
1.四月三十号,刚刚把流水灯搞定完了就开始搞,通过按键点亮熄灭一盏灯,刚开始看的资料觉得跟不知道从哪里下手,就先问了几个学的比较快的同学,他们把说说的也是那样似懂非懂,上午上完了第一节课就没有课了我就一直坐在实验室研究这个任务,先看了几个视频,觉得讲的根本不是一个地方,然后去看一些电子书,基本上的远离通顺了,但是写出代码又是一件大事情,还好在每个电子书后面有成品的代码,我就把那个代码copy到IDE中,想先运行一下,先看看效果,但是这种实验要通过按键的,不能在电脑上的,虚拟上看出来,没那么问题来了,怎么连线又是一回事,我又仔细看了一遍LED灯的模组资料(看了最好三四遍了),把线连好了之后发现是错的,根本不亮(最让我苦恼的事情这种事情是百度不到的),然后又自己乱搞了几次发现只有一盏灯亮,我有事再没有办法了,只好请旁边这个卓越班的同学帮我搞一下,结果原来是程序的错误,没有~符号,他给我家里两行代码就这么搞好了,哎,总是太过相信权威了呀。这个哥们又给我一些建议说我是I/O口,没有学好,但是我还是觉得只有亲身实践了才能学得到更多了东西,当然我不能和这个卓越班的比。
下面就是让我熬战五六个小时的简短代码
// 功能描述: 按下某按键,点亮对应的发光二极管。
//
// 参考外围接线:IOA0~IOA7与1×8键盘相连,
// 1×8键盘的公共端接到高电平(VCC)
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define ClearWatchdog (volatile unsigned int *)0x7012
int main()
{
int i,key_data;
*P_IOA_Data = 0x00ff; //设置IOA0~IOA15为带上拉的低电平输入
*P_IOA_Dir = 0x0000;
*P_IOA_Attrib = 0x0000;
*P_IOB_Data = 0x0000; //设置IOB0~IOB15为带数据缓存的低电平输出
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff;
while(1)
{
if(*P_IOA_Data!=0x0000) //有键按下
{
key_data = *P_IOA_Data;
key_data=~key_data;
key_data&=0x00ff;
switch(key_data)
{ case 0x01: *P_IOB_Data = 0x0001; break; //按键S1按下,点亮发光二极管D1
case 0x02: *P_IOB_Data = 0x0002; break; //按键S2按下,点亮发光二极管D2
case 0x04: *P_IOB_Data = 0x0004; break; //按键S3按下,点亮发光二极管D3
case 0x08: *P_IOB_Data = 0x0008; break; //按键S4按下,点亮发光二极管D4
case 0x10: *P_IOB_Data = 0x0010; break; //按键S5按下,点亮发光二极管D5
case 0x20: *P_IOB_Data = 0x0020; break; //按键S6按下,点亮发光二极管D6
case 0x40: *P_IOB_Data = 0x0040; break; //按键S7按下,点亮发光二极管D7
case 0x80: *P_IOB_Data = 0x0080; break; //按键S8按下,点亮发光二极管D8
}
}
for(i=0;i<0x0f00;i++) //延长发光二极管点亮一段时间
{*ClearWatchdog = 0x0001; }
*ClearWatchdog = 0x0001; //清看门狗
*P_IOB_Data = 0x0000; //熄灭所有发光二极管
}
}