用单片机驱动八位数码管,用矩阵键盘控制

never110101 2012-08-05 05:12:00
小弟想写一个程序用4*4矩阵键盘使数码管分别显示0到F

小弟写了个程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar num;
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

void display(uchar num)
{
wela=1;
P0=0x3f;
wela=0;
P0=0x00;
dula=1;
P0=table[num];
dula=0;
}

void keyscan()
{
uchar temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: num=table[0];
break;

case 0xde: num=table[1];
break;

case 0xbe: num=table[2];
break;

case 0x7e: num=table[3];
break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=P3&0xf0;
}
display(num);

}

P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: num=table[4];
break;

case 0xdd: num=table[5];
break;

case 0xbd: num=table[6];
break;

case 0x7d: num=table[7];
break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=P3&0xf0;
}
display(num);

}

P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: num=table[8];
break;

case 0xdb: num=table[9];
break;

case 0xbb: num=table[10];
break;

case 0x7b: num=table[11];
break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=P3&0xf0;
}
display(num);
}


P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: num=table[12];
break;

case 0xd7: num=table[13];
break;

case 0xb7: num=table[14];
break;

case 0x77: num=table[15];
break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=P3&0xf0;
}
display(num);
}

}

void main()
{
while(1)
{

keyscan();
}
}


在单片机上的效果是按了按键后,六个数码管显示的都是“8.”,小弟单片机是共阳极数码管
...全文
532 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxiaofengq5 2012-08-12
  • 打赏
  • 举报
回复
理解原理后自己编一段,印象更深刻。
nonocast 2012-08-07
  • 打赏
  • 举报
回复
你试试这个,看看一个按键(最下排左边一个)可以不

#include <REGX52.H>

#define uint unsigned int
#define uchar unsigned char
#define true 1
#define false 0

sbit key1 = P3 ^ 4;
sbit key2 = P3 ^ 5;
sbit key3 = P3 ^ 6;
sbit key4 = P3 ^ 7;

sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;

unsigned char code table[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};

uchar numt0, num;

void delay(uint);
void display(uchar);
void init();
void keyscan();

void main(void) {
do {
keyscan();
display(num);
} while(true);
}

void init() {
TMOD = 0x01;
TH0 = (65536 - 45872) / 256;
TL0 = (65535 - 45872) / 256;
EA = 1;
ET0 = 1;
}

void keyscan() {
if(key1 == 0){
delay(10);
if(key1 == 0){
num = ++num % 60;
while(!key1);
}
}
}

void display(uchar arg) {
uchar shi, ge;
shi = arg / 10;
ge = arg % 10;

dula = 1;
P0 = table[shi];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe; // 1111 1110
wela = 0;
delay(5);

dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd; // 1111 1101
wela = 0;
delay(5);
}

void delay(uint arg) {
uint i, k;
for(i = arg; i > 0; --i) {
for(k = 110; k > 0; --k);
}
}
Xxxxxxx.. 2012-08-07
  • 打赏
  • 举报
回复
简化一下吧,其实听郭天祥讲的,理解了原理,就可以自己重新再编写~自己画个矩阵来想想,印象会更深!虽然我也是看郭天祥的~加油吧!
霹雳华 2012-08-07
  • 打赏
  • 举报
回复
天祥门徒!!
never110101 2012-08-06
  • 打赏
  • 举报
回复
是的,模仿他根据自己的单片机和习惯写的,无论按那个键都是显示“8.”,请问你知道原因吗?
nonocast 2012-08-06
  • 打赏
  • 举报
回复
貌似是天祥的版本
单片机及嵌入式系统课程设计 学 院 专业班级 学 号 姓 名 指导老师 2016年 6 月 20 日 1. 设计目的 1. 巩固和掌握对"单片机及嵌入式系统"课程内容的认识和理解,提高应用水平。 2. 掌握汇编语言程序的编制方法。 3. 熟悉键盘控制和七段码管及74系列芯片的使用。 2. 系统结构 设计中通过键盘输入到单片机中,由程序控制找到输入点,计算键码,调用显示 模块,把输入的数值通过LED显示器显示出来。 1. 判断键盘中有无键按下: 将全部行线P1.0到P1.3置低电平,然后检测列线的状态。只要有一列的电平为低,则 表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中 。若所有列线均为高电平,则键盘中无键按下。 2. 判断闭合键所在的位置: 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:将行线置为低电平 ,即在置行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐 行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键 就是闭合的按键。检测的方法是P1.4-P1.7输出全"1",读取P1.0- P1.3的状态,若P1.0-P1.3为全"0",则无键闭合,否则有键闭合。 3. 去除键抖动:当检测到有键按下后,延时一段时间再做下一步的检测判断。 4. 识别:当确定键按下时,通过软件计算键码找到相对位置的数据调用显示模块把数字或 字母显示出来或者实现其他功能。 各主要部件的功能: 1. 矩阵键盘:4×4矩阵键盘,按键传送输入信息; 2. 单片机AT89C51:采用软件编程来实现按键信息的提取和转换; 3. 七段数码管:用于显示最终被单片机转换过的按键信息。 3. 系统原理 1. 单片机简介及主系统电路 AT89C51单片机是51系列单片机的一个成员,是8051单片机的简化版。内部自带2K 字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,与Intel MCS- 51系列单片机的指令和输出管脚相兼容。由于将多功能八位CPU和闪速存储器结合在单 个芯片中,因此,AT89C2051构成的单片机系统是具有结构最简单、造价最低廉、效率 最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,提高了系 统的性价比。其最小系统电路图如下: 2. 数码管工作原理 LED是发光二极管的英文缩写,LED显示器是由发光二极管构成的,它在单片机中的 应用非常普遍。通常所说的LED显示器由7个发光二极管组成。 此外,显示器中还有一个圆点型发光二极管以dp表示,用于小数点表示。通过七个 发光二极管亮暗的不同组合,可以显示多种数字、字母以及其它符号。 LED显示中的发光二极管共有两种连接方法: 共阳极接法:把发光二极管的阳极连 在一起构成公共阳极。使用时公共阳极接+5V。这样阴极端输入低电平的段发光二极管 就导通点亮,而输入高电平的则不亮。共阴极接法:把发光二极管的阴极连在一起构 成公共阴极。使用时公共阴极接地。这样阳极端输入高电平的段发光二极管就导通点 亮,而输入低电平的则不亮。 控制数码管驱动级的控制电路有静态式和动态式两类: 静态驱动:它是指每个数码管都要用一个译码器译码驱动。 动态驱动:它是所的数码管使用一个专门的译码驱动器,使各位数码管逐个轮流显示 ,它的扫描速度极快,因此显示效果与静态驱动相同。 本次的设计采用共阳极接法和动态驱动数码管硬件电路图 3. 4×4矩阵键盘的工作原理 键盘是由若干按键组成的开关矩阵,是嵌入式控制系统的一种输入部件。键盘分两 种:一种是独立式按键,另一种是矩阵式按键。如图所示。独立式按键用的比较少, 可以直接与单片机的P1口某一位进行连接,通过判断这一位的状态知道是否有键输入 。在应用中通常需要数量较多的按键,为了减少I/O口的占用,通常将按键排列成矩阵 形式,如图所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是 通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之 直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线 就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要 的键数比较多时,采用矩阵法来做键盘是合理的。 矩阵式键盘 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,行线通 过电阻接正电源,并将列线所接的单片机的I/O口作为输出端,而行线所接的I/O口则 作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行 线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状 态就可得知是否有键按下 了。 4. 系统软件框图 5. 软件代码 ORG 0000H LJ
电子电路单片机设计毕业设计论文资料软硬件设计50例资料合集资料8: 0451、CP2102 USB转串口DXP资料及其相关资料.rar 0452、l297_l298组合驱动步进电机DXP资料及其相关资料.rar 0453、L298N电机驱动器_共地DXP资料及其相关资料.rar 0454、L297_L298驱动器DXP资料及其相关资料.rar 0455、L298N直流步进两用驱动器DXP资料及其相关资料.rar 0456、L6203直流电机驱动器DXP资料.rar 0457、LCD1602接线模块DXP资料.rar 0458、LED节能灯电路模块DXP资料及其相关资料.rar 0459、LM317电压可调模块DXP资料及其相关资料.rar 0460、LM393声音传感器DXP资料及其相关资料.rar 0461、LMD18200直流电机驱动器DXP资料及其相关资料.rar 0462、LMDJ18200直流电机驱动器DXP资料及其相关资料.rar 0463、mega8_mega16DXP资料.rar 0464、MPS430F149单片机精简开发板DXP资料.rar 0465、MPS430F149单片机精简开发板DXP资料及其相关资料.rar 0466、MSP430贴片转直插板DXP资料及其相关资料.rar 0467、PIC精简开发板DXP资料及其相关资料.rar 0468、RS232转485通讯模块DX资料.rar 0469、S52多功能板DXP资料及其相关资料.rar 0470、LM2576 稳压模块DXP资料及其相关资料.rar 0471、S52最小系统 (黑色)DXP资料及其相关资料.rar 0472、S52精简开发板DXP资料及其相关资料.rar 0473、STK672-080电机驱动DXP资料及其相关资料.rar 0474、TCS230颜色识别DXP资料及其相关资料.rar 0475、THB7128步进电机驱动器DXP资料.rar 0476、USB下载线DXP资料及其相关资料.rar 0477、USB下载线—new(黑)DXP资料及其相关资料.rar 0478、八入八出继电器工控板DXP资料.rar 0479、八位数码管显示板DXP资料及其相关资料.rar 0480、变压器电源模块DXP资料及其相关资料.rar 0481、变压器双12伏双5伏电源板DXP资料及其相关资料.rar 0482、超声波DXP资料及其相关资料.rar 0483、超声波测距DXP资料.rar 0484、传感器控制继电器模块DXP资料.rar 0485、大功率步进电机驱动器DXP资料及其相关资料.rar 0486、单红外LM393DXP资料及其相关资料.rar 0487、单片机USB下载线_直插mega8DXP资料.rar 0488、定时开关模块DXP及其相关资料.rar 0489、对射式传感器—计数传感器DXP资料及其相关资料.rar 0490、对射式深度红外传感器DXP资料及其相关资料.rar 0491、仿PLC控制器DXP资料及其相关资料.rar 0492、加速度传感器DXP资料及其相关资料.rar 0493、精简USB下载线DXP资料.rar 0494、矩阵键盘DXP资料及其相关资料.rar 0495、抗干扰红外发射接收一体DXP资料及其相关资料.rar 0496、两位数码管显示模块DXP资料.rar 0497、凌阳串口下载线DXP资料及其相关资料.rar 0498、凌阳单片机最小系统板DXP资料及其相关资料.rar 0499、频率PWM控制均可调模块DXP资料及其相关资料.rar 0500、三闪灯DXP资料.rar

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧