/*

*功能:使用矩阵按键使得按键按下时数码管上显示各自对应的数字的平方数;

*    且使用定时器0中断使得彩色流水灯先以20毫秒的速度左移流动4秒后,

*    然后使得彩色流水灯以20毫秒的速度右移流动;

*日期:2013-05-02-16:46

*作者:徐冉

*特别说明:本程序代码已经通过调试,仅供学习使用;

*

*/

/***********AT89C52-RC 单片机- 51hei-5 实验板***********/

/*****************51hei开发板*********************/

#include typedef unsigned int uint;

typedef unsigned char uchar;

sbit wela = P2^7;

sbit dula = P2^6;

sbit FM = P2^3;

uchar code table[] = {

0x3F,  //"0"

0x06,  //"1"

0x5B,  //"2"

0x4F,  //"3"

0x66,  //"4"

0x6D,  //"5"

0x7D,  //"6"

0x07,  //"7"

0x7F,  //"8"

0x6F  //"9"

};

uint key1 = 0;

uchar counter = 0, x = 0, flag = 0;

void display(uint num);

void delay(uint xms);

void Marix_keyscan();

void init();

//主程序

void main()

{

init();//定时器0初始化

while(1)

{

if(counter == 200)//定时器定时左移流动4秒

{

counter = 0;

flag = 1;

TR0 = 0;

TH0 = 0xB8;

TL0 = 0X00;

TR0 = 1;

x = 0;

}

Marix_keyscan();

display(key1);

}

}

//定时器0初始化子程序

void init()

{

TMOD = 0x01;

TH0 = 0xB8;

TL0 = 0X00;

EA = 1;

ET0 = 1;

TR0 = 1;

}

//数码管优化显示子程序

void display(uint num)

{

uchar bai, shi, ge;

bai = num / 100 % 10;

shi = num / 10 % 10;

ge  = num % 10;

if(num < 10)

{

dula = 1;

P0 = table[ge];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0xfe;

wela = 0;

P0 = 0x00;

delay(1);

}

else if(num < 100)

{

dula = 1;

P0 = table[shi];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0xfe;

wela = 0;

P0 = 0x00;

delay(1);

dula = 1;

P0 = table[ge];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0xfd;

wela = 0;

P0 = 0x00;

delay(1);

}

else

{

dula = 1;

P0 = table[bai];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0xfe;

wela = 0;

P0 = 0x00;

delay(1);

dula = 1;

P0 = table[shi];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0xfd;

wela = 0;

P0 = 0x00;

delay(1);

dula = 1;

P0 = table[ge];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0xfb;

wela = 0;

P0 = 0x00;

delay(1);

}

}

//延时子程序

void delay(uint xms)

{

uint i, j;

for(i = xms; i > 0; i--)

for(j = 125; j > 0; j--);

}

//矩阵按键检测子程序

void Marix_keyscan()

{

uchar temp;  //定义一个变量存放P3口的值

//第一次矩阵按键检测

P3 = 0xfe;  //给P3口赋一个值,使得矩阵按键的第一行置为低电平,其余口置为高电平;

temp = P3;  //将P3口的值赋给temp

temp &= 0xf0;  //通过与0xf0&来检测矩阵按键的各列通过行列检测与检测矩阵按键

if(temp != 0xf0)

{

//检测有矩阵按键按下

delay(5);//消抖

temp = P3;//再次将P3口的值赋给temp,即再次赋初值检测矩阵按键;

temp &= 0xf0; //再次按位与检测矩阵按键行列

if(temp != 0xf0)

{ //确认有键按下

FM = 0;//蜂鸣器发声

temp = P3; //将此时的P3口的值赋给temp

switch(temp)

{

case 0xee: key1 = 1 * 1;

break; //检测到key1按下

case 0xde: key1 = 2 * 2;

break; //检测到key2按下

case 0xbe: key1 = 3 * 3;

break; //检测到key3按下

case 0x7e: key1 = 4 * 4;

break; //检测到key4按下

default:

break;

}

//按键释放

while(temp != 0xf0)

{

//重新赋初值检测矩阵按键

temp = P3;

temp &= 0xf0;

}

delay(5);//释放去抖

//按键释放

while(temp != 0xf0)

{

//重新赋初值检测矩阵按键

temp = P3;

temp &= 0xf0;

}

//按键释放关闭蜂鸣器

FM = 1;

}

}[page]

//第二次矩阵按键检测

P3 = 0xfd; //给P3口赋初值,使得矩阵按键的第二行置0,其余行为高电平;

temp = P3;//将用于检测的值赋给变量temp

temp &= 0xf0;

if(temp != 0xf0)

{

delay(5);//消抖

//重新装入待于检测的初值;

temp = P3;

temp &= 0xf0;

if(temp != 0xf0)

{

//确定矩阵按键有键被按下

//将此时的P3口的值赋给temp

FM = 0;

temp = P3;

//开始检测

switch(temp)

{

case 0xed: key1 = 5 * 5;

break;

case 0xdd: key1 = 6 * 6;

break;

case 0xbd: key1 = 7 * 7;

break;

case 0x7d: key1 = 8 * 8;

break;

default:

break;

}

//检测按下释放

while(temp != 0xf0)

{

//重新装入初值

temp = P3;

temp &= 0xf0;

}

delay(5);//释放去抖

while(temp != 0xf0)

{

//重新装入初值

temp = P3;

temp &= 0xf0;

}

//按键释放关闭蜂鸣器

FM = 1;

}

}

//第三次矩阵按键检测

P3 = 0xfb;

temp = P3;

temp &= 0xf0;

if(temp != 0xf0)

{

delay(5);//消抖

//重新装入检测初值

temp = P3;

temp &= 0xf0;

if(temp != 0xf0)

{

//将此时P3口的值赋给temp

temp = P3;

FM = 0;//蜂鸣器发声

//检测按下的是哪一个按键,行列检测

switch(temp)

{

case 0xeb: key1 = 9 * 9;

break;

case 0xdb: key1 = 10 * 10;

break;

case 0xbb: key1 = 11 * 11;

break;

case 0x7b: key1 = 12 * 12;

break;

default:

break;

}

//检测按键释放

while(temp != 0xf0)

{

temp = P3;

temp &= 0xf0;

}

delay(5);

while(temp != 0xf0)

{

temp = P3;

temp &= 0xf0;

}

//按键释放关闭蜂鸣器

FM = 1;

}

}

//第四次检测矩阵按键

P3 = 0xf7;//第四行为低电平,其余行为高电平;

temp = P3;//将待检测的值赋给temp;

temp &= 0xf0;

if(temp != 0xf0)

{

delay(5); //消抖

//重新装入检测初值

temp = P3;

temp &= 0xf0;

if(temp != 0xf0)

{

//确认有按键按下

//将此时的P3口的实际值赋给temp;

temp = P3;

FM = 0;

//开始检测

switch(temp)

{

case 0xe7: key1 = 13 * 13;

break;

case 0xd7: key1 = 14 * 14;

break;

case 0xb7: key1 = 15 * 15;

break;

case 0x77: key1 = 16 * 16;

break;

default:

break;

}

//检测按键释放

while(temp != 0xf0)

{ //重新装入初值

temp = P3;

temp &= 0xf0;

}

delay(5);

while(temp != 0xf0)

{

temp = P3;

temp &= 0xf0;

}

//关闭蜂鸣器

FM = 1;

}

}

}

//定时器0中断服务子程序

void int_time0() interrupt 1

{

TH0 = 0xB8;

TL0 = 0X00;

counter++;

if(flag == 0)

{  //流水灯左移流动

if(counter % 1 == 0)

{

P1 = ~(1 << x++);

if(x == 8)

{

x = 0;

}

}

}

else

{ //流水灯右移流动

if(counter % 1 == 0)

{

P1 = ~(0x80 >> x++);

if(x == 8)

{

x = 0;

}

}

}

}

c语言矩阵键盘控制四个led灯,51单片机矩阵键盘与左右流水灯控制C程序相关推荐

  1. c51语言花样流水灯汇编程序,基于51单片机的各种花样的流水灯c51程序

    /*----------------------------------------------- 功能:流水灯对称移动闪烁(双闪烁) -------------------------------- ...

  2. 74hc595点亮点阵式led交通灯灯 c语言程序,89C51单片机C语言用四个74hc595控制四个LED实现交通灯...

    89C51单片机C语言用四个74hc595控制四个LED实现交通灯 (2009-05-16 18:52:38) 标签: 教育 #include #define uchar unsigned char ...

  3. 记录一个 三个io口控制四个LED灯和一个按键的电路和怎么检测

    昨天要写个底层程序 发现要控制四个led灯和一个按键,按键开始一直不能很好的检测, 后面论坛问人才搞好. 分时扫描: 前1-4驱动LED,5检测KEY 1,LED1输出高,LED2输出低,LED3输入 ...

  4. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  5. 自学51单片机 - 矩阵按键实验

    自学51单片机 - 矩阵按键实验 1.开发板原理图 2.程序 2.1 行列式扫描法 2.2 线翻转扫描法 3.结果 1.开发板原理图 2.程序 2.1 行列式扫描法 /**************** ...

  6. 单片机并口应用实验c语言,1单片机并口简单应用(流水灯).docx

    试验1单片机并口简单应用(流水灯) 实验目的 1.了解单片机C语言程序的基本结构 2.了解单片机C语言程序的设计和调试方法 3.掌握顺序控制程序的简单编程 4.熟悉51单片机的端口使用 实验仪器 单片 ...

  7. 51单片机数码管交通灯倒计时c语言,51单片机数码管倒计时模拟交通灯汇编程序...

    /********************************************************************** 51单片机数码管倒计时模拟交通灯汇编程序 LED数码管为 ...

  8. 一个51单片机的键盘扫描程序,算法简单有效

    一个51单片机的键盘扫描程序,算法简单有效 发一个51单片机的键盘扫描程序,算法简单有效                                        再给大家分享一个不错按键程序(来 ...

  9. 【Proteus仿真】51单片机汇编数显大型交通灯控制

    [Proteus仿真]51单片机汇编数显大型交通灯控制 Proteus仿真 学汇编的人虽然 不多,但是还是有的,分享一个汇编的案例,给需要的人予以参考学习,有些时候我们还是需要懂一些汇编指令比较好. ...

  10. 51单片机+直流电机PWM 10级调速控制

    51单片机+直流电机PWM 10级调速控制 Proteus仿真演示 示例程序代码 #include <STC89C5xRC.H> typedef unsigned char u8; typ ...

最新文章

  1. sqlserver Distributed Transaction 分布式事务
  2. 如何去应付你的上司给你一个变化无常的需求?
  3. Git之不明觉厉11-利其器source tree
  4. (转载)H.264码流的RTP封包说明
  5. C# 将\u1234类型的字符转化成汉字
  6. [NTU-Machine-learning-note]1 Introduction(4)
  7. 常用损失函数(L1、L2、SSIM和MS-SSIM)对比简介
  8. Leetcode 978. 最长湍流子数组
  9. 计算机还是数学竞赛内容吗,除了AMC,数学牛娃还能参加什么高含金量的数学竞赛...
  10. 一起开心寒假训练总复习
  11. java web部署文档_javaweb项目实施部署文档
  12. 在Windows下正确安装Scipy与Numpy
  13. python类使用异步_异步Python类
  14. 免费图片文字识别,非常好用
  15. Workgroup 协议
  16. 七代处理器装win7_为什么7代cpu装不了win7
  17. 七、MySQL之数据定义语言(二)
  18. C# 判断两张图片是否一致,极快速。
  19. 详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], p[0] 的含义
  20. Discuz! Q的搜索引擎优化(SEO)攻略

热门文章

  1. 阿里云的对象存储服务,oss 简介
  2. 时间管理--番茄工作法
  3. java date获取24点_获取0点和24点时间戳的方式
  4. STM32野火教程学习
  5. html拾色器没效果,用html和js写一个拾色器
  6. asp.net mysql 论坛源码_最新asp.net微信商城快速开发框架Magicodes.Shop微商城开发框架源码企业商业版源代码...
  7. Linux虚拟机网络配置
  8. pc ps4手柄 驱动_《地平线:黎明时分》PC版性能表现分析
  9. NETAPP存储常用巡检命令
  10. 计算机科学导论复习提纲,计算机科学导论复习资料整理