2011年12月26日更新……
矩阵键盘控制数码管显示
使用模块化编程:
KEIL略图:
程序文件:
矩阵键盘控制数码管显示.rar
部分程序文件预览:
#include "Def.h"
#include "MatrixKeyBoard.h"
#include "DelayMs.h"
#define ShuMaGuanDelayMs 1
#define MatrixKeyBoardDelayMs 10
#define Dula P0 //给数码管送数据
#define Wela P2 //打开数码管显示
sbit DulaEn = P3^7; //使能74HC573锁存器
uchar ShuMaGuanWela[8] =
{
0x00, //第1个数码管阴极接地;
0x01, //第2个数码管阴极接地;
0x02, //第3个数码管阴极接地;
0x03, //第4个数码管阴极接地;
0x04, //第5个数码管阴极接地;
0x05, //第6个数码管阴极接地;
0x06, //第7个数码管阴极接地;
0x07 //第8个数码管阴极接地;
};
uchar code ShuMaGuanDisplay[]=
{
0x3f,0x06,0x5b,0x4f, //0,1,2,3
0x66,0x6d,0x7d,0x07, //4,5,6,7
0x7f,0x6f,0x77,0x7c, //8,9,A,B
0x39,0x5e,0x79,0x71 //C,D,E,F
};
uint Wela1,
Tem1,
KeyBoard,
Clear = 0x00;
//
//子函数声明
//
void ShuMaGuanInit(void);
void MatrixKeyBoardDisplay(uchar);
//******************************************************************************
//
// MatrixKeyBoard(void); //矩阵键盘函数
//
//******************************************************************************
void MatrixKeyBoard(void)
{
while(1)
{
P3 = 0x7F; //将第1列线置低电平,其他列为高电平;
Tem1 = P3; //将P3口的状态赋给临时变量Tem1;
Tem1 &= 0x0F; //用于判断P3的低4位是否有0,即判断是否有按键按下;
if (Tem1 != 0x0F) //如果不相等,说明有按键按下;
{
DelayMs(MatrixKeyBoardDelayMs); //延时去抖
Tem1 = P3;
Tem1 &= 0x0F;
if (Tem1 != 0x0F) //再次判断按键是否真的被按下
{
switch (Tem1)
{
case 0x0E:
KeyBoard = 0; //S5被按下,此时数码管显示“0”;
break;
case 0x0D:
KeyBoard = 1; //S6被按下,此时数码管显示“1”;
break;
case 0x0B:
KeyBoard = 2; //S7被按下,此时数码管显示“2”;
break;
case 0x07:
KeyBoard = 3; //S8被按下,此时数码管显示“3”;
break;
}
while(Tem1 != 0x0F) //等待按键释放
{
Tem1 = P3; //按键释放前,不停地取P3口数据,
Tem1 &= 0x0F; //进行运算判断;
}
//MatrixKeyBoardDisplay(KeyBoard); //受74HC138的影响,显示函数如果放在此处,只会在第8位数码管显示!
}
}
MatrixKeyBoardDisplay(KeyBoard); //显示数据
P3 = 0xBF; //将第2列线置低电平,其他列为高电平;
Tem1 = P3; //将P3口的状态赋给临时变量Tem1;
Tem1 &= 0x0F; //用于判断P3的低4位是否有0,即判断是否有按键按下;
if (Tem1 != 0x0F) //如果不相等,说明有按键按下;
{
DelayMs(MatrixKeyBoardDelayMs); //延时去抖
Tem1 = P3;
Tem1 &= 0x0F;
if (Tem1 != 0x0F) //再次判断按键是否真的被按下
{
switch (Tem1)
{
case 0x0E:
KeyBoard = 4; //S5被按下,此时数码管显示“4”;
break;
case 0x0D:
KeyBoard = 5; //S6被按下,此时数码管显示“5”;
break;
case 0x0B:
KeyBoard = 6; //S7被按下,此时数码管显示“6”;
break;
case 0x07:
KeyBoard = 7; //S8被按下,此时数码管显示“7”;
break;
}
while(Tem1 != 0x0F) //等待按键释放
{
Tem1 = P3; //按键释放前,不停地取P3口数据,
Tem1 &= 0x0F; //进行运算判断;
}
//MatrixKeyBoardDisplay(KeyBoard); //受74HC138的影响,显示函数如果放在此处,只会在第8位数码管显示!
}
}
MatrixKeyBoardDisplay(KeyBoard); //显示数据
P3 = 0xDF; //将第3列线置低电平,其他列为高电平;
Tem1 = P3; //将P3口的状态赋给临时变量Tem1;
Tem1 &= 0x0F; //用于判断P3的低4位是否有0,即判断是否有按键按下;
if (Tem1 != 0x0F) //如果不相等,说明有按键按下;
{
DelayMs(MatrixKeyBoardDelayMs); //延时去抖
Tem1 = P3;
Tem1 &= 0x0F;
if (Tem1 != 0x0F) //再次判断按键是否真的被按下
{
switch (Tem1)
{
case 0x0E:
KeyBoard = 8; //S9被按下,此时数码管显示“8”;
break;
case 0x0D:
KeyBoard = 9; //S10被按下,此时数码管显示“9”;
break;
case 0x0B:
KeyBoard = 10; //S11被按下,此时数码管显示“A”;
break;
case 0x07:
KeyBoard = 11; //S12被按下,此时数码管显示“B”;
break;
}
while(Tem1 != 0x0F) //等待按键释放
{
Tem1 = P3; //按键释放前,不停地取P3口数据,
Tem1 &= 0x0F; //进行运算判断;
}
//MatrixKeyBoardDisplay(KeyBoard); //受74HC138的影响,显示函数如果放在此处,只会在第8位数码管显示!
}
}
MatrixKeyBoardDisplay(KeyBoard); //显示数据
P3 = 0xEF; //将第4列线置低电平,其他列为高电平;
Tem1 = P3; //将P3口的状态赋给临时变量Tem1;
Tem1 &= 0x0F; //用于判断P3的低4位是否有0,即判断是否有按键按下;
if (Tem1 != 0x0F) //如果不相等,说明有按键按下;
{
DelayMs(MatrixKeyBoardDelayMs); //延时去抖
Tem1 = P3;
Tem1 &= 0x0F;
if (Tem1 != 0x0F) //再次判断按键是否真的被按下
{
switch (Tem1)
{
case 0x0E:
KeyBoard = 12; //S13被按下,此时数码管显示“C”;
break;
case 0x0D:
KeyBoard = 13; //S14被按下,此时数码管显示“D”;
break;
case 0x0B:
KeyBoard = 14; //S15被按下,此时数码管显示“E”;
break;
case 0x07:
KeyBoard = 15; //S16被按下,此时数码管显示“F”;
break;
}
while(Tem1 != 0x0F) //等待按键释放
{
Tem1 = P3; //按键释放前,不停地取P3口数据,
Tem1 &= 0x0F; //进行运算判断;
}
//MatrixKeyBoardDisplay(KeyBoard); //受74HC138的影响,显示函数如果放在此处,只会在第8位数码管显示!
}
}
MatrixKeyBoardDisplay(KeyBoard); //显示数据
}
}
//******************************************************************************
//
// MatrixKeyBoardDisplay(uchar Dula1); //数码管显示函数
//
//******************************************************************************
void MatrixKeyBoardDisplay(uchar Dula1)
{
ShuMaGuanInit();
//
//送入断数据
//
Dula = Clear; //清空数码管显示:消影
DulaEn = 1; //打开74HC573锁存器
Dula = ShuMaGuanDisplay[Dula1]; //给数码管送数据
DulaEn = 0; //关闭锁存器,锁存住送入的数据
Dula = Clear; //消影
//
//循环显示每一位数据
//
for (Wela1=0; Wela1<8; Wela1++)
{
Wela = ShuMaGuanWela[Wela1]; //打开数码管显示
DelayMs(ShuMaGuanDelayMs); //短暂延时
}
}
//******************************************************************************
//
// ShuMaGuanInit(void); //数码管初始化
//
//******************************************************************************
void ShuMaGuanInit(void) //清空数码管所有显示:消影
{
DulaEn = 1; //打开74HC573锁存器
Dula = Clear; //清空数码管显示:消影
DulaEn = 0; //锁存数码管为空,不显示
}
********************************************---分界线-----*****************************************
2011年12月23日更新……
1602
使用模块化编程:
KEIL略图:
程序文件:
1602.rar
部分程序文件预览:
#include "Def.h"
#include "LCD_1602.h"
#include "DelayMs.h"
//#include "ShuMaGuanInit.h"
#define Delay_LCD_1602 50
sbit LCD_RS = P2^4;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^6;
uchar num;
uchar code Column_1[] = "I Love MCU !";
uchar code Column_2[] = "www.eepw.com.cn";
void Write_Command(uchar Command);
void Write_Data(uchar Data);
void LCD_1602_init(void);
void
LCD_1602(void)
{
LCD_1602_init(); //初始化
Write_Command(0x80 + 0x00);//第一行显示
for (num=0; num<12; num++)
{
Write_Data(Column_1[num]);
DelayMs(Delay_LCD_1602);
}
Write_Command(0x80 + 0x40);//第二行显示
for (num=0; num<15; num++)
{
Write_Data(Column_2[num]);
DelayMs(Delay_LCD_1602);
}
/*
for (num=0; num<40; num++)
{
Write_Command(0x18);
DelayMs(200);
}
*/
while(1);
}
void
Write_Command(uchar Command)
{
LCD_RW = 0;
LCD_RS = 0;
P0 = Command;
DelayMs(Delay_LCD_1602);
LCD_EN = 1;
DelayMs(Delay_LCD_1602);
LCD_EN = 0;
}
void
Write_Data(uchar Data)
{
LCD_RW = 0;
LCD_RS = 1;
P0 = Data;
DelayMs(Delay_LCD_1602);
LCD_EN = 1;
DelayMs(Delay_LCD_1602);
LCD_EN = 0;
}
void
LCD_1602_init(void)
{
//Dula = 0;
//Wela = 0;
Write_Command(0x38);
Write_Command(0x0C);//开关显示与光标设置;
Write_Command(0x06);//指针与……
Write_Command(0x01);
}
********************************************---分界线-----*****************************************
2011年12月23日更新……
数码管静态与动态显示
使用模块化编程:
KEIL略图:
程序文件:
数码管静态与动态显示.rar
部分程序文件预览:
#include "Def.h"
#include "DelayMs.h"
#include "ShuMaGuan.h"
#define ShuMaGuanDelayMs 2
#define Dula P0 //给数码管送数据
#define Wela P2 //打开数码管显示
sbit DulaEn = P3^7; //使能74HC573锁存器
uchar ShuMaGuanWela[8] =
{
0x00, //第1个数码管阴极接地;
0x01, //第2个数码管阴极接地;
0x02, //第3个数码管阴极接地;
0x03, //第4个数码管阴极接地;
0x04, //第5个数码管阴极接地;
0x05, //第6个数码管阴极接地;
0x06, //第7个数码管阴极接地;
0x07 //第8个数码管阴极接地;
};
uchar code ShuMaGuanDisplay[]=
{
0x3f,0x06,0x5b,0x4f, //0,1,2,3
0x66,0x6d,0x7d,0x07, //4,5,6,7
0x7f,0x6f,0x77,0x7c, //8,9,A,B
0x39,0x5e,0x79,0x71 //C,D,E,F
};
int Wela1,
Dula1 = 0,
Tem1,
Clear = 0x00;
void ShuMaGuanInit(void);
//******************************************************************************
//
// ShuMaGuan(void); //数码管显示函数:每次编译时,动态与静态显示只能二选一!
//
//******************************************************************************
void ShuMaGuan(void) //P0:段选;P2:位选;
{
ShuMaGuanInit(); //清空数码管所有显示:消影
while(1)
{
//*动态显示
//
//8个数码管动态显示0~7
//
for (Dula1=0; Dula1<8; Dula1++)
{
Dula = Clear; //清空数码管显示:消影
DulaEn = 1; //打开74HC573锁存器
Dula = ShuMaGuanDisplay[Dula1]; //给数码管送数据
DulaEn = 0; //关闭锁存器,锁存住送入的数据
Dula = Clear; //消影
Wela = ShuMaGuanWela[Dula1]; //打开数码管显示
DelayMs(ShuMaGuanDelayMs); //短暂延时
}
//动态显示*/
/*静态显示
//
//8个数码管静态显示0~F
//
//
//送入断数据
//
Dula = Clear; //清空数码管显示:消影
DulaEn = 1; //打开74HC573锁存器
Dula = ShuMaGuanDisplay[Dula1]; //给数码管送数据
DulaEn = 0; //关闭锁存器,锁存住送入的数据
Dula = Clear; //消影
//
//循环显示每一位数据
//
for (Wela1=0; Wela1<8; Wela1++)
{
Wela = ShuMaGuanWela[Wela1]; //打开数码管显示
DelayMs(ShuMaGuanDelayMs); //短暂延时
}
//
//延时显示数据,并更新数据
//
Tem1 ++;
if (Tem1 == 50)
{
Tem1 = 0;
Dula1 ++;
}
//
//重置显示数据
//
if (Dula1 == 15)
{
Dula1 = 0;
}
//静态显示*/
}
}
//******************************************************************************
//
// ShuMaGuanInit(void); //数码管初始化
//
//******************************************************************************
void ShuMaGuanInit(void) //清空数码管所有显示:消影
{
DulaEn = 1; //打开74HC573锁存器
Dula = Clear; //清空数码管显示:消影
DulaEn = 0; //锁存数码管为空,不显示
}
********************************************---分界线-----*****************************************
2011年12月21日更新……
2个定时器8种方式控制流水灯
使用模块化编程:
KEIL略图:
程序文件:
2个定时器8种方式控制流水灯.rar
部分程序文件预览:
#include "Def.h"
#include "Timer0.h"
#include "Timer1.h"
#include "LED_8.h"
#include "DelayMs.h"
uchar a = 0xFE;
void LED_8(void)
{
Timer0_Init(); //定时器0与定时器1的初始化函数是分别定义的,此处不能同时有效;
//Timer1_Init(); //使用哪个定时器,就在此处启用哪个!
while (1) //使用哪种方式,就在Timer0.c与Timer1.c中启用对应方式的设置!
{
P1 = a;
if (Tiemr0_Mode0_1 >= 100) //定时器0方式0 计时5ms 100:500ms
// if (Tiemr0_Mode1_1 >= 10) //定时器0方式1 计时50ms 10:500ms
// if (Tiemr0_Mode2_1 >= 1843) //定时器0方式2 计时0.27ms 1843:500ms 使用 >= 是为防止有多个选择语句时,执行第一个时间过长,错过其他语句的判断;
// if (Tiemr0_Mode3_L_1 >= 1843) //定时器0方式3低8位计数器 计时0.27ms 1843:500ms 使用 >= 是为防止有多个选择语句时,执行第一个时间过长,错过其他语句的判断;
// if (Tiemr0_Mode3_H_1 >= 1843) //定时器0方式3高8位计数器 计时0.27ms 1843:500ms 使用 >= 是为防止有多个选择语句时,执行第一个时间过长,错过其他语句的判断;
//******************************************************************************
// if (Tiemr1_Mode0_1 >= 100) //定时器1方式0 计时5ms 100:500ms
// if (Tiemr1_Mode1_1 >= 10) //定时器1方式1 计时50ms 10:500ms
// if (Tiemr1_Mode2_1 >= 1843) //定时器1方式2 计时0.27ms 1843:500ms 使用 >= 是为防止有多个选择语句时,执行第一个时间过长,错过其他语句的判断;
{
a = _crol_(a, 1);
Tiemr0_Mode0_1 = 0; //定时器0方式0
// Tiemr0_Mode1_1 = 0; //定时器0方式1
// Tiemr0_Mode2_1 = 0; //定时器0方式2
// Tiemr0_Mode3_L_1 = 0; //定时器0方式3低8位计数器
// Tiemr0_Mode3_H_1 = 0; //定时器0方式3高8位计数器
//******************************************************************************
// Tiemr1_Mode0_1 = 0; //定时器1方式0
// Tiemr1_Mode1_1 = 0; //定时器1方式1
// Tiemr1_Mode2_1 = 0; //定时器1方式2
}
}
}
********************************************---分界线-----*****************************************
2011年12月4日更新……
修改后的LED部分原理图,参阅:
http://uphotos.eepw.com.cn/soothmusic/pics/55fb6a04e45e4aa050facf59031a8247.jpg
LED点阵模拟垂直电梯提示_视频预览:
LED模拟垂直电梯提示_视频下载:
http://dl.dbank.com/c0vubd9ik9
LED模拟垂直电梯提示_代码下载:
LED模拟垂直电梯提示_代码.pdf
LED模拟垂直电梯提示_代码预览:
//******************************************************************************
//
// LED_DianZhen.c
// f=11.0592Hz
// MCU:STC89C52RC
// Copyright (c) 2011-2011 Soothmusic. All rights reserved.
//
//******************************************************************************
#include "reg52.h"
#define Dynamic_Display 4
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code Di[] = //用于列控制
{ 0xfe,//11111110
0xfd,//11111101
0xfb,//11111011
0xf7,//11110111
0xef,//11101111
0xdf,//11011111
0xbf,//10111111
0x7f// 01111111
};
//******************************************************************************
//
// 函数声明
//
//******************************************************************************
void Arrow(void); //模拟垂直电梯,从1楼到2楼,再从2楼到1楼,LED指示
int DelayMs(uint z); //延时函数
//******************************************************************************
//
// LED_DianZhen的主函数
//
//******************************************************************************
void main(void)
{
Arrow(); //模拟垂直电梯,从1楼到2楼,再从2楼到1楼,LED指示
}
//******************************************************************************
//
// 延时函数
//
//******************************************************************************
int DelayMs(uint z)
{
uint i,j;
for (i=z; i>0; i--)
for (j=110; j>0; j--);
return 0;
}
//******************************************************************************
//
// Arrow(); //模拟垂直电梯,从1楼到2楼,再从2楼到1楼,LED指示
//
//******************************************************************************
void Arrow(void)
{
uchar code LED_Arrow_Up[16][8] = //往上箭头
{
{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00},
{0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00},
{0x00,0x80,0x40,0xE0,0x40,0x80,0x00,0x00},
{0x80,0x40,0x20,0xF0,0x20,0x40,0x80,0x00},
{0x40,0x20,0x10,0xF8,0x10,0x20,0x40,0x00},
{0x20,0x10,0x08,0xFC,0x08,0x10,0x20,0x00},
{0x10,0x08,0x04,0xFE,0x04,0x08,0x10,0x00},
{0x08,0x04,0x02,0xFF,0x02,0x04,0x08,0x00},
{0x04,0x02,0x01,0x7F,0x01,0x02,0x04,0x00},
{0x02,0x01,0x00,0x3F,0x00,0x01,0x02,0x00},
{0x01,0x00,0x00,0x1F,0x00,0x00,0x01,0x00},
{0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00},
{0x00,0x40,0x44,0x7E,0x7E,0x7E,0x40,0x40}//"1"
};
uchar code LED_Arrow_Down[16][8] = //往上箭头
{
{0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00},
{0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x00},
{0x00,0x01,0x02,0x07,0x02,0x01,0x00,0x00},
{0x01,0x02,0x04,0x0F,0x04,0x02,0x01,0x00},
{0x02,0x04,0x08,0x1F,0x08,0x04,0x02,0x00},
{0x04,0x08,0x10,0x3F,0x10,0x08,0x04,0x00},
{0x08,0x10,0x20,0x7F,0x20,0x10,0x08,0x00},
{0x10,0x20,0x40,0xFF,0x40,0x20,0x10,0x00},
{0x20,0x40,0x80,0xFE,0x80,0x40,0x20,0x00},
{0x40,0x80,0x00,0xFC,0x00,0x80,0x40,0x00},
{0x80,0x00,0x00,0xF8,0x00,0x00,0x80,0x00},
{0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00},
{0x00,0x44,0x66,0x72,0x52,0x5E,0x4E,0x44}//2
};
uint i = 0,
j = 0,
z = 0,
x = 0;
P0 = 0x00;
DelayMs(3000);
for (x=0; x<3; x++) //往上箭头
{
for (z=0; z<15; z++)
{
if ((x==0) && (z==0))
{
for (j=0; j<50; j++) //显示1
{
for (i=0; i<8; i++)
{
P2 = Di[i];
P0 = LED_Arrow_Up[15][i];
DelayMs(Dynamic_Display);
}
}
}
for (j=0; j<3; j++)
{
for (i=0; i<8; i++)
{
P2 = Di[i];
P0 = LED_Arrow_Up[z][i];
DelayMs(Dynamic_Display);
}
}
}
}
for (x=0; x<3; x++) //往下箭头
{
for (z=0; z<15; z++)
{
if ((x==0) && (z==0))
{
for (j=0; j<50; j++) //显示2
{
for (i=0; i<8; i++)
{
P2 = Di[i];
P0 = LED_Arrow_Down[15][i];
DelayMs(Dynamic_Display);
}
}
}
for (j=0; j<3; j++)
{
for (i=0; i<8; i++)
{
P2 = Di[i];
P0 = LED_Arrow_Down[z][i];
DelayMs(Dynamic_Display);
}
}
}
}
for (j=0; j<50; j++) //显示1
{
for (i=0; i<8; i++)
{
P2 = Di[i];
P0 = LED_Arrow_Up[15][i];
DelayMs(Dynamic_Display);
}
}
P0 = 0x00;
while(1); //显示停止
}
********************************************---分界线-----*****************************************
2011年11月26日更新……PCB板已到
2011年11月24日更新……
元器件采购中……