数字显示键盘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告课程名称:嵌入式系统与软件
实验项目名称:简易数字显示键盘
学院:电子科学与技术
专业:微电子科学与工程
指导教师:黎冰
报告人:
学号:
班级:微电子一/二班
实验报告提交时间:2015/12/31
一.实验目的:
了解掌握arm7 lpc2000系列芯片,学会在keil上编译hex文件并在proteus上仿真。
二.项目要求:
1. 选题具备一定的实用价值,产业应用前景及可实现性;
2. 使用Proteus和Keil进行设计和系统仺真;
3. 基于LPC2000系列ARM7芯片进行设计;
三.实验内容:
所用器件:
电阻若干,lpc2138芯片一个,数字键盘一个,数码管一个,开关,电容,等。所实现的功能:
当按下键盘时数码管会显示对应数字并且对应led会亮起,附带流水灯,跑马灯,闪烁灯。
实验程序:
#include
#define uchar unsigned char
#define BEEPCON (1<<12) //0x00001000 //定义P0.12脚控制B1,低电平蜂鸣
int k=0; //定时器中断计数器
uchar a=0; //LED闪烁函数标志
void delay(int x) //普通延时函数
{
int i;
for(;x>0;x--)
for(i=10000;i>0;i--);
}
/**************************** 定时器中断延时函数*******************/ void ms(unsigned int x) //定时器中断延时函数
{
T0TCR = 0X01; //启动定时器
while(k!=x); //当k不等于x时
T0TCR = 0X00; //关闭定时器
T0TC = 0; //设定定时器初值为0
T0PC = 0; //清除定时器中断计数器
k=0;
}
void time0()__irq //定时器服务函数,对应k++
{
k++;
T0IR = 1;
VICVectAddr = 0;
}
/********************LED动作函数*************************/ void LED_1() //流水灯函数
{
unsigned char i;
for(i=0;i<10;i++)
{
IO1SET = 1<<(i+16);
delay(20);
IO1CLR = 1<<(i+16);
}
}
void LED_2() //跑马灯函数
{
unsigned char i;
for(i=0;i<15;i++)
{
if(i<10)
{
IO1SET = 1<<(i+16);
delay(20);
IO1CLR = 1<<(i+16);
}
else
{
IO1SET = 1<<(29-i);
delay(20);
IO1CLR = 1<<(29-i);
}
}
}
void LED_3() //LED闪烁函数
{
unsigned char i;
for(i=0;i<10;i++)
{
IO1SET = 0x1FF<<16;
delay(20);
IO1CLR = 0X1FF<<16;
delay(20);
}
}
/****************************数码管与键盘扫描函数************************/
void display(uchar x) /*数码管显示函数x为显示的数字*/
{
unsigned char table[10]={0x00,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
unsigned char table2[10]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x100}; IO0SET = (table[x]<<25);
IO1SET = (table2[x]<<16);
delay(20);
IO0CLR = (table[x]<<25);
IO1CLR = (table2[x]<<16);
}
void key_w() //键盘按行低电平扫描函数
{
IO0SET = 0X7<<20;
IO0CLR = 1<<20;
delay(2);
IO0SET = 1<<20;
IO0CLR =1<<21;
delay(2);
IO0SET =1<<21;
IO0CLR =1<<22;
delay(2);
IO0SET =1<<22;
}
unsigned char key_r() /*键盘按列读取扫描数值返回值为键盘对应数字*/ {
int a=0,b; //a为行,b为列
switch(IO0PIN&(7<<16)) //通过IP0PIN寄存器获取P0.16,0.17,0.18当前电平状态
{
case 0x00060000:b=1;break;
case 0x00050000:b=2;break;
case 0x00030000:b=3;break;
default:break;