矩阵键盘单个数码管显示C语言程序

矩阵键盘单个数码管显示C语言程序
矩阵键盘单个数码管显示C语言程序

#include

#define uchar unsigned char

#define uint unsigned int

uchar code_h,code_l; //定义行扫描码,列检测数据uchar tmp,keyvalue; //定义接收键值

/*函数说明*/

void delay(void);

uchar keyscan();

/*主函数*/

void main () //键值处理

{

while(1)

{

tmp=keyscan();//调用键盘扫描程序

switch(tmp)

{ case 0x11: P0=0x3f; break; //0

case 0x12: P0=0x06; break; //1

case 0x14: P0=0x5b; break; //2

case 0x18: P0=0x4f; break; //3

case 0x21: P0=0x66; break; //4

case 0x22: P0=0x6d; break; //5

case 0x24: P0=0x7d; break; //6

case 0x28: P0=0x07; break; //7

case 0x41: P0=0x7f; break; //8

case 0x42: P0=0x67; break; //9

case 0x44: P0=0x77; break; //a

case 0x48: P0=0x7c; break; //b

case 0x81: P0=0x39; break; //c

case 0x82: P0=0x5c; break; //d

case 0x84: P0=0x79; break; //e

case 0x88: P0=0x71; break; //f

case 0x00: ; break;

default:P0=0x00;

}

delay();

}

}

/*延时函数*/

void delay(void)

{uchar i;

for(i=0;i<200;i++){}

}

/*键盘扫描函数*/

uchar keyscan(void)

{uchar code_h; //行扫描

uchar code_l; //列扫描

P1=0XF0; //P1.0~P1.3置0,准备读列状态

if((P1&0XF0)!=0XF0) //如果P1.4~P1.7不全为1,可能有键按下

{delay(); //延时消抖动

if((P1&0XF0)!=0XF0) //重读高4位,若还是不全为1,定有键按下

{code_h=0XFE; //P1.0置为0,开始行扫描

while ((code_h&0X10)!=0XF0) //判断是否为最后一行,否则继续扫描{P1=code_h; //P1口输出行扫描值

if((P1&0XF0)!=0XF0) //如果P1.4~P1.7不全为1,该行有按键按下

{code_l=(P1&0XF0|0X0F); //保留P1口高4位,低4位变为1,作为列值

keyvalue=(~code_h)+(~code_l); //键编码=行扫描值+列扫描值,返回主程序return (keyvalue) ;

while((P1&0XF0)!=0XF0); //等待按键释放

}

else //该行没按键按下,左移,扫描下一行code_h=(code_h<<1)|0X01;

}

}

}

return(0x00); //无按键按下,返回0

}

实验四 数码管显示控制

实验四数码管显示控制 一、实验目的 1、熟悉Keil uVision2软件的使用; 2、掌握LED数码管显示接口技术; 3、理解单片机定时器、中断技术。 二、实验设备及仪器 Keil μVision2软件;单片机开发板;PC机一台 三、实验原理及内容 1、开发板上使用的LED数码管是四位八段共阴数码管(将公共端COM接地GND),其内部结构原理图,如图4.1所示。 图4.1共阴四位八段LED数码管的原理图 图4.1表明共阴四位八段数码管的“位选端”低电平有效,“段选端”高电平有效,即当数码管的位为低电平,且数码管的段为高电平时,相应的段才会被点亮。 实验开发板中LED数码管模块的电路原理图,如图4.2所示。 a~h SP2 SP1 P0.0~P0.3 P0.4~P0.7图4.2 LED数码管模块电路原理图

图中,当P1.0“段控制”有效时,P0.0~P0.7分别对应到数码管的a~h段。当P1.1“位控制”有效时,P0.0~P0.7分别对应到DIG1~DIG8。 训练内容一:轮流点亮数码管来检测数码管是否正常。参考程序: ORG 00H AJMP MAIN MAIN: SETB P1.2;LED流水灯模块锁存器的控制位 MOV P0,#0FFH;关闭LED灯 CLR P1.2 SETB P1.3 ;点阵模块的行控制锁存器 MOV P0,#0 ;关闭点阵行 CLR P1.3 MOV A,#11111110B;数码管“位选信号”初值,低电平有效 LOOP:SETB P1.1;数码管位控制锁存器有效 MOV P0,A CLR P1.1 RL A ;形成新的“位选信号”,为选择下一位数码管做准备 SETB P1.0;数码管段控制锁存器有效 MOV P0,#0FFH ;数码管的所有段点亮,显示“8” CLR P1.0 CALL DELAY SJMP LOOP DELAY:MOV R5,#0;延时子程序 D1: MOV R6,#0 D2:NOP DJNZ R6,D2

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入#include #define uchar unsigned char #define uint unsigned int sbit duan=P 2八6; sbit wei=P 2八7; sbit bee=P 2八3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablewe[]={ 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe}; uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15 对应要显示的第一位码值uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15 对应要显示的第二位码值unsigned char temp; unsigned char key; unsigned char i,j;

unsigned char STH0; unsigned char STL0; unsigned int code tab[]={ //63625, 63833, 64019, 64104, 64260, 64400, 64524 ,// 低音区:1 2 3 4 64580, 64685, 64778, 64820, 64898, 64968, 65030 ,// 中音区:1 2 3 4 5 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,// 高音区:1 2 3 4 5 65297 ,// 超高音:1 }; // 音调数据表可改 void delay(uchar x) uchar y,z; for(y=x;y>0;y--) for(z=0;z<110;z++); void init() TMOD=0x01; ET0=1; EA=1; void display() { for(i=0;i<2;i++)

4乘4矩阵键盘输入数码管显示四位数

综合课程设计三相步进电机控制器电路的设计 学生姓名__________

指导教师_________ 课程设计任务书 一、设计说明 步进电机是工业过程控制及仪表控制中的主控元件之一,作为执行元件其特点为能够快速起启停、精度高且能直接接收数字量,由于这些特点使其在定位场合得到了广泛的应用。 设计一个三相步进电机控制器,使其能够控制步进电机的工作状态,如步进电机正、反转,步进电机的工作方式等。 用键盘设定步进电机的工作频率,工作方式,并用数码管显示设定值,可以通过按键来更换显示内容。用示波器观测三相的输出波形,并用数码管显示电路的工作状态。 二、技术指标 步进电机的工作频率为:<10kHz 三、设计要求 1.进行方案论证,提出一个合理的设计方案并进行理论设计; 2.对所设计的方案部分进行调试; 3.在选择器件时,应考虑成本。 4.设计测量调试电路。 四、实验要求 1.根据技术指标制定实验方案;验证所设计的电路。 2.进行实验数据处理和分析。 五、推荐参考资料 1?谢自美?电子线路设计?实验?测试.[M]武汉:华中理工大学出版社,2000 年 2. 阎石. 数字电子技术基础. [M] 北京:高等教育出版社,2006年 3. 童诗白、华成英.模拟电子技术基础. [M] 北京:高等教育出版社,2006年 4..付家才. 电子实验与实践. [M] 北京:高等教育出版社,2004年 5.沙占友、李学芝著.中外数字万用表电路原理与维修技术. [M] 北京:人民 邮电出版社,1993年

六、按照要求撰写课程设计报告成绩评定表

一、概述 本次毕设的题目是:三相步进电机控制电路的设计。本次毕设使用80C51单片机作为主控芯片,利用ULN2003A集成电路作为三相步进电机的驱动电路,采用单极性驱动方式,使三相步进电机能在(1)三相单三拍,(2)三相双三拍, (3)三相六拍三种工作方式下正常工作;能实现的功能有:启动/停止控制、方向控制;速度控制;用LED数码管显示工作方式。键盘输入工作频率。本次课程设计采用80C51单片机作为主控芯片,程序采用C语言来编写,驱动电路采用ULN2003A集成电路,显示采用 7SEG-MPX4-CC卩四位共阴数码管,P0接段码,并用8只1K欧左右电阻上拉。P2的4位10 口接位选码。正转,数码管显示1。反转,数码管显示2.不转,数码管显示0.采用Proteus软件进行仿真。在Keil uVsuon3编程环境下编程和编译生成HEX文件,导入到 80C51单片机,实现对各个模块的控制,实现我们所需要的功能。 本次课程是对毕业设计的基础设计,即实现4x4键盘输入,数码管显示输入数字的设计。 二、方案论证 1步进电机驱动方案选择 方案1 :使用功率三极管等电子器件搭建成功率驱动电路来驱动电机的运行。这种方案的驱动电路的优点是使用电子器件联接,电路比较简单,但容易受 干扰,信号不够稳定,缺点是器件较大而不便电路的集成,使用时很不方便,联接时容易出错误。 方案2:使用专门的电机驱动芯片ULN2003A来驱动电机运行。驱动芯片的优点是便于电路的集成,且驱动电路简单,驱动信号很稳定,不易受外界环境的干扰,因而设计的三相步进电机控制系统性能更好。 通过对两种方案的比较,我选择方案2使用ULN2003A S机驱动芯片来作为驱动。 2数码管显示方案选择 方案1:把所需要显示的数据通过专用的七段显示译码器(例如7448)的转换输出给LED显示屏。优点是输出比较简单,可以简化程序,但增加了芯片的费用,电路也比较复杂。 方案2:通过程序把所要的数据转化为七段显示的数据,直接通过单片机接 口来显示,其优点是简化了电路,但增加了软件编写的负担。 通过对两种方案进行比较,我选择通过软件编写来输出显示信号,即单片机直接和显示器相连。 3控制状态的读取 方案1:把按键接到单片机的中断口,若有按键按下,单片机接收到中断信 号,再通过软件编写的中断程序来执行中断,优点是接线简单,简化了电路,但软件编写较为复杂,不易掌握。

数电课程设计-数码管显示控制器的设计与实现

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位: 题目: 数码管显示控制器的设计与实现 初始条件: 555定时器、74LS160计数器、74LS161计数器、74LS153数据选择器、74LS48译码器、74LS04非门与数码管、电阻、电容等相关元件。 要求完成的主要任务: 1、设计任务 根据已知条件,完成对数码管显示控制器的设计、装配与调试。 2、设计要求 (1)、能自动一次显示出数字 0、1、2、3、4、5、6、7、8、9(自然数列),1、 3、5、7、9(奇数列), 0、2、 4、6、8(偶数列),0、1、0、1、2、3、4、 5、6、7(音乐符号序列);然后再从头循环; (2)、打开电源自动复位,从自然数列开始显示。 时间安排: 1、2012 年 6 月 8 日分班集中,布置课程设计任务、选题;讲解课设具体实施计划与课程设计报告格式的要求;课设答疑事项。 2、2012 年 6 月 9 日至 2012 年 7 月 3 日完成资料查阅、设计、制作与调试;完成课程设计报告撰写。 3、2012 年 7 月 4 日提交课程设计报告,进行课程设计验收和答辩。 指导教师签名:年月日 系主任(或责任教师)签名:年月日

目录 摘要 (3) Abstact (4) 引言 (5) 1设计背景 (6) 1.1设计任务 (6) 1.2设计要求 (6) 1.3指导思想 (6) 2方案论证 (7) 2.1方案说明 (7) 2.2方案原理 (7) 3电路的设计与分析 (8) 3.1电路的总体设计 (8) 3.2电路的原理框图 (9) 3.3元电路的设计与分析 (9) 3.3.1多谐振荡电路的设计与分析 (9) 3.3.2计数电路的设计与分析 (11) 3.3.3译码显示电路的设计与分析 (13) 4电路仿真、调试与分析 (16) 4.1脉冲产生电路的仿真 (16) 4.2总电路的仿真 (17) 4.3运行结果分析 (17) 5心得与体会 (18) 附录1元器件清单 (19) 附录2参考文献 (20)

4乘4矩阵键盘输入数码管显示四位数

沈阳航空航天大学 综合课程设计三相步进电机控制器电路的设计 班级 94020101 学号 2009040201023 学生姓名 XXXXXXXXX 指导教师常丽东

课程设计任务书 一、设计说明 步进电机是工业过程控制及仪表控制中的主控元件之一,作为执行元件其特点为能够快速起启停、精度高且能直接接收数字量,由于这些特点使其在定位场合得到了广泛的应用。 设计一个三相步进电机控制器,使其能够控制步进电机的工作状态,如步进电机正、反转,步进电机的工作方式等。 用键盘设定步进电机的工作频率,工作方式,并用数码管显示设定值,可以通过按键来更换显示内容。用示波器观测三相的输出波形,并用数码管显示电路的工作状态。 二、技术指标 步进电机的工作频率为:<10kHz 三、设计要求 1.进行方案论证,提出一个合理的设计方案并进行理论设计; 2.对所设计的方案部分进行调试; 3.在选择器件时,应考虑成本。 4.设计测量调试电路。 四、实验要求 1.根据技术指标制定实验方案;验证所设计的电路。 2.进行实验数据处理和分析。 五、推荐参考资料 1.谢自美. 电子线路设计·实验·测试. [M]武汉:华中理工大学出版社,2000年 2.阎石. 数字电子技术基础. [M]北京:高等教育出版社,2006年 3.童诗白、华成英.模拟电子技术基础. [M]北京:高等教育出版社,2006年 4..付家才. 电子实验与实践. [M]北京:高等教育出版社,2004年 5.沙占友、李学芝著.中外数字万用表电路原理与维修技术. [M]北京:人民邮电出版社,1993年

六、按照要求撰写课程设计报告成绩评定表

MSP430单片机的4X4矩阵键盘C语言程序

MSP430单片机的4X4矩阵键盘C语言程序 #include #define uchar unsigned char#define uint unsigned int uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(unsigned int i) //延时子程序{while(i--);} uchar keyvalue(){ uchar key; uchar np10,np11,np12,np13; P1DIR=0x0f;//第一排P1OUT=~BIT3; delay(10); np10=P1IN&BIT4; if(np10==0) { key=0; } np11=P1IN&BIT5; if(np11==0) { key=1; } np12=P1IN&BIT6; if(np12==0) { key=2; } np13=P1IN&BIT7; if(np13==0) { key=3; } //第二行P1OUT=~BIT2; delay(10); np10=P1IN&BIT4; if(np10==0) { key=4; } np11=P1IN&BIT5; if(np11==0) { key=5; } np12=P1IN&BIT6; if(np12==0) { key=6; } np13=P1IN&BIT7; if(np13==0) { key=7; } //第三行P1OUT=~BIT1; delay(10); np10=P1IN&BIT4; if(np10==0) { key=8; } np11=P1IN&BIT5; if(np11==0) { key=9; } np12=P1IN&BIT6; if(np12==0) { key=10; } np13=P1IN&BIT7; if(np13==0) { key=11; } //第四行P1OUT=~BIT0; delay(10); np10=P1IN&BIT4; if(np10==0) { key=12; } np11=P1IN&BIT5; if(np11==0) { key=13; } np12=P1IN&BIT6; if(np12==0) { key=14; } np13=P1IN&BIT7; if(np13==0) { key=15; } P1OUT=0X00; return key; while(1) { if((P1IN&0X0F)==0x0f) break; }} void main(){ uchar key_value; WDTCTL=WDTPW+WDTHOLD; P1DIR=0X0F; P2DIR=0XFF; P2OUT=0XFF; while(1) { if((P1IN&0XF0)!=0XF0) { delay(100); if((P1IN&0XF0)!=0XF0) { delay(100); if((P1IN&0XF0)!=0XF0) { key_value=keyvalue(); } } } P2OUT=~key_value; }} tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

4×4矩阵键盘数码管显示 最简便易懂的键盘扫描方法

/////4×4矩阵键盘按键为1-16,按键显示0-9、a-f; ////////////////// #include #define uchar unsigned char uchar key=0; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0xc0}; void show(uchar key) { P0=table[key];//显示数值 } void Scan_key()//扫描键盘 { uchar m; P1=0xff;//数码管全亮 P2=0x0f;//P2口赋初值低位1高位0 m=P2; switch (m) { case 0x0e: { P2=0xf0;

m=P2; switch (m) { case 0xe0:{key=0;show(key);break;} case 0xd0:{key=1;show(key);break;} case 0xb0:{key=2;show(key);break;} case 0x70:{key=3;show(key);break;} default:break; } break; } case 0x0d: { P2=0xf0; m=P2; switch (m) { case 0xe0:{key=4;show(key);break;} case 0xd0:{key=5;show(key);break;} case 0xb0:{key=6;show(key);break;} case 0x70:{key=7;show(key);break;} default:break; } break; } case 0x0b: { P2=0xf0; m=P2; switch (m) { case 0xe0:{key=8;show(key);break;} case 0xd0:{key=9;show(key);break;} case 0xb0:{key=10;show(key);break;} case 0x70:{key=11;show(key);break;} default:break; } break; } case 0x07: { P2=0xf0; m=P2; switch (m)

实验四 动态显示与矩阵键盘的编程和综合应用设计(学生版)

实验四综合应用设计——数码管动态显示与矩阵键盘的编程 一、实验目的: 1、掌握单片机I/O技术和程序设计等综合知识。 2、了解矩阵式键盘的内部结构和数码管显示的基本原理,掌握至少一种常用的按键识别方法。 3、熟练掌握数码管动态显示和矩阵键盘识别的综合应用。 二、实验内容: 设计一个矩阵键盘的识别和动态显示综合的系统,控制8个8段数码管动态扫描显示4*4矩阵键盘上按下的按键所对应的值。 三、实验要求: 给定一个4*4的矩阵键盘,16个按键对应显示0123456789ABCDE,第1次按下某按键在第一个8段数码管上显示对应的值,第2次在第二个数码管上显示,以此类推,第9次又在第一个数码管上显示,以此循环下去。其中ABCDE在数码管上无法表达,可以用其它代替,例如:B用8表示,D用0表示,E用H表示等。 四、实验设备及实验耗材: 计算机一台,W A VE6000软件模拟器,完成ISP下载的XLISP软件,XL1000单片机综合仿真实验仪一台(8个8段数码管,4*4矩阵键盘一个,89C51一片,9针对9针的串口线一条,USB电缆一条) 五、实验基本原理与方法: 查阅相关资料掌握矩阵式键盘的内部结构,8段数码管动态显示原理和常用的按键识别方法,建议使用按键识别方法中最常用的“行扫描法”编写程序。结合动态显示技术和矩阵键盘识别技术。 六、实验方案设计: 1、采用哪些I/O口完成通信,采用何种按键识别的方法,如何综合动态显示技术和矩 阵键盘识别技术。 2、说明该程序的功能。 3、硬件连接原理图。 七、实验步骤: 1.弄清实验内容和实验要求。 2.学习相关理论知识,提出实验方案,画出程序流程图。

51单片机控制4个数码管显示

. //使用AT89c51单片机控制四个数码管动态显示0-9999 ,12MHz #include void jiayi();//加1函数 void chufa();//除法函数 void xianshi();//显示函数 void delay();//延时函数 sbit P2_0=P2^0;//个位位码 sbit P2_1=P2^1;//十位位码 sbit P2_2=P2^2;//百位位码 sbit P2_3=P2^3;//千位位码 unsigned char qianwei,baiwei,shiwei,gewei; unsigned int count=0; unsigned char code dis[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极0-9 void main() { while(1) { jiayi(); chufa(); xianshi(); } } void chufa()//将数字的各个位拆开 { qianwei=count/1000;//千位数 baiwei=count%1000/100; //百位数 shiwei=count%100/10; //十位数 gewei=count%10; //个位数 } void jiayi() { count=count+1; if(count==10000) count=0; } void delay()//延时 { unsigned int i,j; for(i=0;i<10;i++) { for(j=0;j<200;j++); } }

51单片机矩阵键盘的C语言程序与分析

51单片机矩阵键盘的C语言程序与分析 2009-10-17 19:25 学习51单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分析电路,然后终于明白其中的原理,这样的话,再看程序,就是那样的简单了。。 首先看一下电路图是怎样连接的,我买的开发板上是AT89S52单片机,矩阵键盘在P3口。接法如下图: 当然上面的图的意思是P3.1~P3.3 跟P3.4~P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。

如果给P3一个扫描初值的话:如0x0F ,则没有键按下时为: P3.1~P3.3为1,P3.4~P3.7为0。 如果有键按下,则情况发生变化:高电平接入低电平:如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。 则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0,低四位保留,可以得到低四位的内容了。 通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P3&0x0F; 如果再得到高四位内容,则可以组成一个数,来定位哪个键了。 用P3=h|0xF0;这会出现什么情况呢?1|0=1 1| 1 =1,这里难道高四位全置1 吗?不是的,当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。即:0111 0111,&F0之后,得到0111 0000,这样的话,我们得到高四位的值了, 用高四位+低四位,就可以得到一个数值,确定一个键。 下面看看人家编写的程序,相信不是太难了吧。 //keyboard.c 这里的行与列的扫描,也就是把字节的8位,高四位与低四位分开来,从而确定坐标。 //行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍 #include //包含头文件 #define uchar unsigned char #define uint unsigned int unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。 uchar keyscan(void); //主要的矩阵键盘扫描函数。 void delay(uint i); void main() { uchar key; P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符 while(1) { key=keyscan();//调用键盘扫描,

LED数码管显示矩阵键盘按键的设计

任务九设计说明2 一、电路原理及仿真图: 二、程序设计: #include #define uchar unsigned char uchar display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x40}; uchar key; void get(){ uchar a; P1=0x0f; //按下按钮// a=P1^0x0f; switch(a) //确定行// { case 1:key=0;break; case 2:key=4;break; case 4:key=8;break; case 8:key=12;break; case 0:key=16;} P1=0xf0; a=P1^0xf0; switch(a) //确定列//{ case 16:key=key+3;break; case 32:key=key+2;break; case 64:key=key+1;break;

case 128:key=key+0;}} void main(){ P0=display[16]; get(); P0=display[key]; } 程序完成两个功能,首先扫描键盘,检测是否有按键按下并计算键值。 然后如果有按键按下则驱动数码管显示相应键值,否则显示”-“符号。 三、设计说明 如电路原理图所示,图中矩阵键盘和P3端口连接,共阳极数码管的段选端和单片机的P0口连接,位选直接接到高电平,使得数码管始终处于选通状态。系统启动后,单片机逐行扫描键盘,当没有按键按下时,驱动数码管显示“-”符号,当检测到有按键按下时,单片机将相应键值对应的数码编码送至P0端口,驱动数码管以十六进制方式显示被按下的按键的键值。四、遇到的问题 首先遇到的问题是系统启动后数码管没有任何显示,仔细查看仿真现象后发现P0口始终为高阻状态,于是怀疑是数码管极性错误。再检查数码管型号后发现果然使用了共阴极数码管,于是换成共阳极数码管后终于有了显示。其次是希望键值从键盘的左下角起始,即左下角键值为0。但由于对键盘的扫描方向理解的不是很透彻,导致调试了很多次,键值排列顺序都不尽人意。不过最终还是达到了设计要求。

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

单片机实验报告——矩阵键盘数码管显示

单片机实验报告 信息处理实验 实验二矩阵键盘 专业:电气工程及其自动化 指导老师:高哲 组员:明洪开张鸿伟张谦赵智奇 学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日

矩阵键盘 一、实验内容 1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。按其它键没有结果。 二、实验目的 1、学习独立式按键的查询识别方法。 2、非编码矩阵键盘的行反转法识别方法。 3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 5、掌握利用Keil51软件对程序进行编译。 6、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 三、实验原理 1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。 2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。 3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然

后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

单片机课设数码管显示滚动控制

《单片机设计与实训》 设计报告 题目:数码管滚动显示控制姓名:王伟杰 班级:自动化四班 学号: 2014550430 指导老师:张莹 提交日期: 2016年10月29日

目录 一、设计题目与要求 (4) 1.1设计题目 (4) 1.2设计要求 (4) 二、系统方案设计 (4) 2.1硬件电路设计 (5) 1.单片机最小系统简介 (5) 2.数码管显示电路 (7) 2.3硬件选型及说明 (8) 1. ST89C51单片机 (8) 2. 四位一体七段共阴极显示数码管 (10) 三、系统原理图设计与仿真 (11) 3.1系统仿真图 (11) 3.2系统仿真结果 (12) 四、程序设计 (13) 4.1程序设计 (13) 4.2程序流程图 (15) 五、系统调试 (16) 5.1系统硬件调试 (16) 5.2系统软件调试 (16) 六、总结与体会 (17)

附录一 (19) 附录二 (20) 附录三 (34)

一、设计题目与要求 单片机课程设计是一门实践课程,要求学生具有制作调试单片机最小系统及外设的能力,能够掌握单片机内部资源的使用。单片机课程设计内容包括硬件设计、制作及软件编写、调试,学生在熟练掌握焊接技术的基础上,能熟练使用单片机软件开发环境Keil C51编程调试,并使用STC ISP调试工具采用串口下载方式联调制作的单片机最小系统。单片机课程设计题目包含基本部分及扩展部分,基本部分即单片机最小系统部分,扩展部分是对单片机内部资源及外部IO口的功能扩展,使制作的单片机系统具有一定的功能。 1.1设计题目 数码管滚动显示控制 1.2设计要求 自制一个单片机最小系统,包括串口下载、复位电路,采用两个四位一体数码管作为显示器件,通过按钮选择实现四种滚动显示模式,例如从左至右,从右至左,内缩,外扩等,滚动信息可以是数字或有意义的英文字符。 二、系统方案设计

单片机矩阵键盘检测程序并用数码管显示c语言程序

#include #define uint16 unsigned int #define uint8 unsigned char //控制数码管段选锁存口 sbit P3_7=P3^7; //共阴数码管显示 uint8 code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0}; uint8 temp; uint16 num; //延时子函数 void delay(uint16 z) { uint16 x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //子函数声明 uint8 keyscan(); void display(uint8);

void main() { num=17; while(1) { display(keyscan()); } } void display(uint8 num1) { P2=0xf8; P3_7=1; P0=table[num1-1]; P3_7=0; } uint8 keyscan() { P1=0xfe; temp = P1;

temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num=1;break; case 0xde:num=2;break; case 0xbe:num=3;break; case 0x7e:num=4;break; default:break; } while(temp!=0xf0)//检测按键是否放开 { temp=P1; temp=temp&0xf0; }

基于C51单片机矩阵键盘控制蜂鸣器的应用

学校代码 10126 学号科研创新训练论文 题目基于C51单片机的蜂鸣器和流水灯的 应用 院系内蒙古大学鄂尔多斯学院 专业名称自动化 年级 2013 级 学生姓名高乐 指导教师高乐奇 2015年06月20日

基于C51单片机的蜂鸣器和流水灯的应用 摘要 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。本文介绍了单片机的发展及应用,和基于单片机的蜂鸣器和流水灯的知识及应用,还介绍了此次我所设计的课题。 关键词:C-51单片机,控制系统,流水灯,蜂鸣器,程序设计

The application of buzzer and flowing water light based on C51 MCU Author:GaoLe Tutor:GaoLeQi Abstract This age is a new technology emerge in endlessly era, in the electronic field especially automation intelligent control field, the traditional schism components or digital logic circuit, is composed of control system with unprecedented speed was replaced by micro-controller intelligent control system. SCM has small, strong function, low cost, etc, it can be said that wide application, intelligent control and automatic control core is the micro-controller.This article introduces the MCU development and application,the knowledge and application of buzzer and flowing water light based on MCU,then introduces the task I have designed this time. Keyword:C51 micro-controller,control system,flowing water light,buzzer ,programming

矩阵键盘数码管显示键值 程序

#include #include #define uchar unsigned char #define uint unsigned int uchar dis_buf; //显示缓存 uchar temp; uchar key; //键顺序吗 void delay0(uchar x); //x*0.14MS #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; // 此表为LED 的字模0 1 2 3 4 5 6 7 8 9 a b c d e f unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5 E,~0x79,~0x71}; /*************************************************************/ /* */ /* 延时子程序*/ /* */ /*************************************************************/ void delay(uchar x) { uchar j; while((x--)!=0) { for(j=0;j<125;j++) {;} } } /*************************************************************/ /* */ /* 键扫描子程序(4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为行*/ /* P1.1 P1.2 P1.3为列*/ /* */ /*************************************************************/ void keyscan(void)

STM32-矩阵键盘程序4×4

/*--------------------------------------------------------------------------------------* 矩阵键盘驱动 * 文件: keyboard.c * 编写人:LiuHui * 描述:扫描4x4 矩阵键盘输入,并返回键值 * 适用范围:驱动采用ST3.5 库编写,适用于STM32F10x 系列单片机 * 所用引脚:PA0-PA7 * 编写时间:2014 年5 月20 日 --------------------------------------------------------------------------------------*/ #include "stm32f10x.h" #include "keyboard.h" #include "dealy.h" /*--------------------------------矩阵键盘初始化----------------------------------------* 功能:初始化stm32 单片机GPIO //PA0-PA7 * 参数传递: * 输入:无 * 返回值:无 --------------------------------------------------------------------------------------*/ void KeyBoard_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); } /*------------------------------矩阵键盘扫描--------------------------------------------* 功能:扫描矩阵键盘,并返回键值 * 参数: * 输入:无 * 返回:有键按下返回该键值 * 无键按下时则返回0 --------------------------------------------------------------------------------------*/ u8 Read_KeyValue(void) { u8 KeyValue=0; if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f) {

相关文档
最新文档