天天看点

单片机与嵌入式系统实验-流水灯实验

  • 实验目的要求

根据原理图完成仿真电路的绘制;能够根据设计需求完成代码编写,实现功能;能够独立完成软件、硬件功能测试

  • 实验内容

(1)阅读普中开发板原理图,在proteus上完成仿真电路图设计,包括LED灯(使用P3口)、矩阵按键。

(2)矩阵按键功能分配:最左上角按键K0---流水灯启动,最右上角按键K3---流水灯停止,

最左下角按键K12---流水灯从上往下流水;最右下角按键K15---流水灯从下往上流水。

同时在最右面的数码管上显示对应的按键号码(静态显示即可),注意初始状态时哪个按键都没有按下过,流水灯全灭,数码管全灭。

  • 实验过程

流程图:

单片机与嵌入式系统实验-流水灯实验

仿真电路图:

单片机与嵌入式系统实验-流水灯实验

实现代码:

#include<reg51.h>
char code led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
char code key_buf[] = {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
					0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
char code led[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
	
	void delay10ms(void)
	{
		unsigned char i,j;
		for(i=20;i>0;i--)
		for(j=248;j>0;j--);
			}

	char getkey(void){
		char key_scan[] = {0xef,0xdf,0xbf,0x7f};
		char i = 0, j = 0;
		for (i = 0; i < 4; i++)
		{
			P2 = key_scan[i];
			if((P2&0x0f) != 0x0f){
				for(j = 0; j< 16; j++){
					if (key_buf[j] == P2)
						return j;
					
				}
			}
		}
		return -1;
	}

	void main(void){
		char k;
		char key = 0;
		P0 = 0x00;
		P3 = 0xff;
		while(1){
			key = getkey();
			
			if(key != -1){
				P0 = led_mod[key];
						if (key == 15){
							for (k = 0; k < 8; k++){
								P3 = led[k];
								delay10ms();
								delay10ms();
								}
							}
						else if(key == 12){
							for (k = 0; k < 8 ; k++){
								P3 = led[7 - k];
								delay10ms();
								delay10ms();
								}
							}
						else if(key = 3){
								break;
								}

						}
					} 
					}
           

运行截图:

单片机与嵌入式系统实验-流水灯实验
  • 实验总结
  1. 进一步掌握了通过键码的方式对矩阵键盘的扫描,也学习了LED流水灯的电路结构。
  2. 掌握了基本的流水灯的设计原理。
  3. 学习了流程图的绘制。