c51键盘程序
单片机原理与应用及C51程序设计MCS51与键盘显示器的接口

第七章 MCS-51与键盘、显示器的接口
3.键位的编码
通常有两种方法编码。 (1)用连接键盘的I/O线的二进制组合进行编码。如(a)图 (2)顺序排列编码。如(b)图,处理方法如下:编码值=行首编 码值X+列号Y。
P1.0
88 84 82 81
P1.1
48 44 42 41
P1.2
28 24 22 21
第七章 MCS-51与键盘、显示器的接口
第七章 MCS-51与键盘、显示器的接口
7.1 MCS-51单片机1与键盘接口
7.1.1 键盘的工作原理 键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态, 当按下键时它才闭合。它的结构和产生的波形如图所示。
VCC
P1.1 (a)
断开 P1.1 GND
第七章 MCS-51与键盘、显示器的接口
K0:AJMP KEY0 K1:AJMP KEY1 …… K7:AJIMP KEY7 KEY0:…… ;0号键功能程序 JMP START ;0号键功能程序执行完返回 KEY1:…… ;0号键功能程序 JMP START ;1号键功能程序执行完返回 …… KEY7:…… ;7号键功能程序 JMP START ;7号键功能程序执行完返回
闭合 (b)
断开
第七章 MCS-51与键盘、显示器的接口
键盘的处理主要涉及三个方面:
1.按键的识别
2.抖动的消除 消除按键盘抖动通常有两种方法:硬件消抖和软件消抖。 硬件消抖是通过在按键输出电路上加一定的硬件线路来消除抖动,
一般采用R—S触发器或单稳态电路。如图。
+5V
闭合 断开 +5V
输出
软件消抖是利用延时来跳过抖动过程
MSP430和AT89C51单片机4x4键盘C程序

MSP430和AT89C51单片机4x4键盘C程序本程序在一位上显示按键,如果多位显示主程序需要修高为多位显示。
本程序软件包括去抖功能,没有注释说明。
#include#define uchar unsignedchar#define uint unsigned intuint key,i;uchar temp,temp1,ms,buff;uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay(ms){while(ms--) {for(i=0;i<120;i++); }}void B_key(){ temp1=0xfe; P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1; switch(temp) { case 0xee:key=0;break; case 0xde:key=1;break; case 0xbe:key=2;break; case 0x7e:key=3;break; default:break; } } } temp1=0xfd; P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1;switch(temp) { case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; default:break; } } } temp1=0xfb;P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1; switch(temp) { case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key=10;break;case0x7b:key=11;break; default:break; } } } temp1=0xf7; P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1;switch(temp) { case 0xe7:key=12;break; case 0xd7:key=13;break; case 0xb7:key=14;break; case 0x77:key=15;break;default:break; } }}}void main(){while(1){ B_key(); P2=tab[key]; P3=0x04;}}tips:感谢大家的阅读,本文由我司收集整编。
C51典型例程(按键驱动)

主要(zhǔyào)内容:
1. 键盘(jiànpán) 2. LED数码管 3. 字符型LCD
精品资料
键盘(jiànpán)
1. 独立式键盘(jiànpán)
(1) 独立式键盘的结构 与特点
精品资料
键盘(jiànpán)
1. 独立式键盘(jiànpán)
(2) 编程模式 在确定了键盘的编程结构后,就可以编制键盘接口程序。键盘接口程序 的功能实际上就是驱动键盘工作,完成按键的识别,根据所识别按键的键值, 完成按键子程序的正确散转,从而完成单片机应用系统对用户按键动作的预 定义响应。
形。 (2)16×2字符(zìfú)型LCD引脚说明 16×2字符(zìfú)型LCD共有14个引脚,其功能见表6-3所示。
精品资料
字符(zìfú)型LCD
2. HD44780 驱动器(16×2字符型LCD)
(3)LCD内部的内存 LCD内部存储器共分为3种:固定字形ROM,称为CG(Character
(2) 定时扫描方式
定时扫描方式就是每隔一段时间对键 盘扫描一次,它利用单片机内部的定时 器产生一定时间(例如10ms)的定时, 当定时时间到就产生定时器溢出中断, CPU响应中断后对键盘进行扫描,并在 有键按下时识别出该键,再执行该键的 功能程序。
精品资料
键盘(jiànpán)
4. 键盘(jiànpán)的工作方式
2)忙碌标志(Busy Flag,BF)。当LCD模块内部处于忙碌状态,不能接 收或处理外部信号时,这个标志就会被设定为1,因此在对LCD模块控制时,一 定要先检查这个忙碌标志,当BF=0时,才可以对LCD模块进行控制。
精品资料
字符(zìfú)型LCD
2. HD44780 驱动器(16×2字符型LCD)
基于C51单片机的键盘及LCD显示

}
}
}
1.实验报告格式:
一.实验名称
二.实验目的
三.实验内容
四.设计思想
五.硬件设计
六.程序代码
七.参考文献
2.硬件电路原理图用PROTEL等软件画出。
附录:程序源代码:
附录1
#include "reg51.h"
#include "intrins.h"
#define THCO 0xee
#define TLCO 0x0
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
}
void InitLCD() //液晶初始化
{
send_command(0x30); //功能设置:一次送8位数据,基本指令集
2)ST7920控制器系列中文图形液晶模块资料手册
三、设计指标
利用实验板上提供的键盘电路,LCD显示电路,设计一人机界面,能实现以下功能:
1.LCD上显示“重庆科技学院”
2.按键至少包括0-9的数字键
3.LCD显示按键值
4.电子钟显示:时,分,秒(选作)
四、实验要求
1.以单片机为核心,设计4*4非编码键盘及LCD的硬件电路,画出电路原理图。
{
unsigned char hi=0;//汉字显示
if(x==0) send_command(0x80+y);//
else if(x==1) send_command(0x90+y);
51单片机矩阵键盘C语言编程

X1
19 X1
P20 P21 P22 P23 P24 P25 P26 P27
21 22 23 24 25 26 27 28
+5V
RES X1
+5V
C3 1uF
R1
C1
1K
X2
18 X2
RES
9 RESET
EA/VPP RD/P37 WR/P36 ALE/PRDG
PSEN
31 17 16 30 29
1
}
/****************************************************************************** 函数名称:void keyscan() 函数功能:键盘扫描及按键处理
******************************************************************************/
//如果有按键闭合
{ keyvalue=(~HSM)+(~(LJC|0x0f));
//计算键盘值
return(keyvalue);
//返回键值
} else HSM=(HSM<<1)|0x01;
//行扫描左移 1 位,准备扫描下一行}} Nhomakorabea}
return(0x00);
}
break;
case 0x12: P0=0x66; //4
break;
case 0x22: P0=0x6d; //5
break;
case 0x42: P0=0x7d; //6
break;
case 0x82: P0=0x07; //7
break;
数控焊机C51程序

数控焊机C51程序#include#include#define uchar unsigned charuchar *pp; //数据指针uchar k; //命令和地址数据uchar d; //显示数据uchar js; //字符个数uchar Key=0x00; //键码清零uchar pk=0; //显示屏序号uchar hang; //定义行号uchar lie; //定义列号uchar dm1=0x00; //程序代码高位uchar dm2=0x00; //程序代码低位uchar DMX,DMX0; //串行发送数据uchar TH20; //定时器2计数器高位uchar TL20; //定时器2计数器低位int sj; //时间变量单位usint Sz; //数字序号字符个数sbit RS=P3^7; //设置RS为P0.7口sbit RW=P3^6; //设置RW为P0.6口sbit E=P3^5; //设置E为P0.5口sbit DR1=P3^4; // 电机方向信号sbit PU1=P3^3; // 行走步进电机脉冲信号void ImimC52();void Write_com(uchar com); //写指令函数void Write_date(uchar date); //送数据函数void Write_p(); //设置地址,写显示数据void ImimLCM(); //LCM初始化函数//void ClearLCM(); //LCM清屏函数void Qsp(); //写起始屏void Delay(int sj); //延时函数,单位时间为1u void Janpan(); //菜单屏分类函数void Xingzou(); //行走函数void caidan1(); //写第一菜单屏函数void caidan2(); //写第二菜单屏函数void caidan3(); //写第选定菜单屏函数void Caidan3T(); //写选定菜单头菜单void caidan4(); // 写第就绪菜单屏函数void caidan5(); //写第运行菜单屏函数void caidan6(); //停止运行返回就绪菜单屏void caidan7(); //返回运行或返回起始单屏void Panmang(); //判忙函数void KeyScan(); //键盘扫描子函数//void Tkanmengou(); // 踢看门狗函数char code Hanzi01[32]= //起始屏第一行{0x02,0x03, //笑脸,心0xb0,0xb2, //安0xbb,0xd5, //徽0xca,0xa1, //省0xb0,0xf6, //蚌0xb2,0xba, //埠0xca,0xd0, //市0x03,0x02,//心,笑脸0x54,0x45, //T,R0x4c,0x3a, //L,:0x30,0x35, //0,50x35,0x32, //5,20x2d,0x34, //-40x39,0x32, //9,20x32,0x32, //2,20x37,0x32, //7,2};char code Hanzi02[32]= //起始屏第二行{0xb6,0xab,//东0xb7,0xbd,//方0xbb,0xfa,//机0xb5,0xe7,//电0xc9,0xe8,//设0xb1,0xb8,//备0xb9,0xab,//公0xcb,0xbe,//0x46,0x41, //F,A0x58,0x3a, //X,:0x30,0x35, //0,50x35,0x32, //5,20x2d,0x34, //-,40x39,0x32, //9,20x32,0x32, //2,20x37,0x32, //7,2};char code Hanzi11[32]=//第一菜单屏第一行{0xb8,0xd6,//钢0xb0,0xe5,//板0xb6,0xc8,//度0xa1,0xb2,// (0xba,0xc1,//毫0xc3,0xd7,//米0xa1,0xb3,//)0x43,0x3a, //C,:0x2d,0x32, //-,20x34,0x20, //4,0x20,0x44, // ,D0x3a,0x32, //:,20x36,0x2d, //6,-0x33,0x30, //3,0};char code Hanzi12[32]= //第一菜单屏第二行{0x41,0x3a, //A,:0x30,0x38, //0,80x2d,0x31, //-,10x32,0x20, //2,0x20,0x42, // ,B0x3a,0x31, //:,10x34,0x2d, //4,-0x31,0x38, //1,80x45,0x3a, //E,:0x33,0x32, //3,20x2d,0x33, //-,30x36,0x20, //6,0x20,0x46, // ,F0x3a,0x33, //:,30x38,0x2d, //8,-0x34,0x32, //4,2};char code Hanzi22[32]= //第二、一菜单屏第二行{ 0x41,0x3a, //A,:0x30,0x36, //0,60x38,0x20, //8,0x20,0x42, // ,B0x3a,0x30, //:,00x38,0x2a, //8,*0x45,0x3a, //E,:0x31,0x30, //1,00x2a,0x31, //*,10x32,0x20, //2,0x20,0x46, // ,F0x3a,0x31, //:,10x32,0x2a, //2,*0x31,0x32, //1,2};char code Hanzi23[16]= //第二、一菜单屏第三行{ 0x43,0x3a, //C,:0x30,0x38, //0,80x2a,0x31, //*,10x30,0x20, //0,0x20,0x44, // ,D0x3a,0x31, //:,10x30,0x2a, //0,*0x31,0x30, //1,0};char code Hanzi32[32]= //第二、二菜单屏第二行{ 0x41,0x3a, //A,:0x31,0x32, //1,20x2a,0x31, //*,10x34,0x20, //4,0x20,0x42, // ,B0x34,0x2a, //4,*0x31,0x34, //1,40x45,0x3a, //E,:0x31,0x36, //1,60x2a,0x31, //*,10x38,0x20, //8,0x20,0x46, // ,F0x3a,0x31, //:,10x38,0x2a, //8,*0x31,0x38, //1,8};char code Hanzi33[16]= //第二、二菜单屏第三行{ 0x43,0x3a, //C,:0x31,0x34, //1,40x36,0x20, //6,0x20,0x44, // ,D0x3a,0x31, //:,10x36,0x2a, //6,*0x31,0x36, //1,6};char code Hanzi42[32]= //第二、三菜单屏第二行{ 0x41,0x3a, //A,:0x31,0x38, //1,80x2a,0x32, //*,20x30,0x20, //0,0x20,0x42, // ,B0x3a,0x32, //:,20x30,0x2a, //0,*0x32,0x30, //2,00x32,0x32, //2,20x2a,0x32, //*,20x34,0x20, //4,0x20,0x46, // ,F0x3a,0x32, //:,20x34,0x2a, //4,*0x32,0x34, //2,4};char code Hanzi43[16]= //第二、三菜单屏第三行{ 0x43,0x3a, //C,:0x32,0x30, //2,00x2a,0x32, //*,20x32,0x20, //2,0x20,0x44, // ,D0x3a,0x32, //:,20x32,0x2a, //2,*0x32,0x32, //2,2};char code Hanzi52[32]= //第二、四菜单屏第二行{ 0x41,0x3a, //A,:0x32,0x34, //2,40x2a,0x32, //*,20x36,0x20, //6,0x20,0x42, // ,B0x36,0x2a, //6,*0x32,0x36, //2,60x45,0x3a, //E,:0x32,0x38, //2,80x2a,0x33, //*,30x20,0x46, // ,F0x3a,0x33, //:,30x30,0x2a, //0,*0x33,0x30, //3,0};char code Hanzi53[16]= //第二、四菜单屏第三行{ 0x43,0x3a, //C,:0x32,0x36, //2,60x2a,0x32, //*,20x38,0x20, //8,0x20,0x44, // ,D0x3a,0x32, //:,20x38,0x2a, //8,*0x32,0x38, //2,8};char code Hanzi62[32]= //第二、五菜单屏第二行{ 0x41,0x3a, //A,:0x33,0x30, //3,00x2a,0x33, //*,30x32,0x20, //2,0x20,0x42, // ,B0x3a,0x33, //:,30x32,0x2a, //2,*0x33,0x32, //3,20x45,0x3a, //E,:0x33,0x34, //3,40x2a,0x33, //*,30x36,0x20, //6,0x20,0x46, // ,F0x36,0x2a, //6,*0x33,0x36, //3,6};char code Hanzi63[16]= //第二、五菜单屏第三行{ 0x43,0x3a, //C,:0x33,0x32, //3,20x2a,0x33, //*,30x34,0x20, //4,0x20,0x44, // ,D0x3a,0x33, //:,30x34,0x2a, //4,*0x33,0x34, //3,4};char code Hanzi72[32]= //第二、六菜单屏第二行{ 0x41,0x3a, //A,:0x33,0x36, //3,60x2a,0x33, //*,30x38,0x20, //8,0x20,0x42, // ,B0x3a,0x33, //:,30x38,0x2a, //8,*0x33,0x38, //3,80x45,0x3a, //E,:0x34,0x30, //4,00x2a,0x34, //*,40x32,0x20, //2,0x20,0x46, // ,F0x3a,0x34, //:,40x32,0x2a, //2,*};char code Hanzi73[16]= //第二、六菜单屏第三行{ 0x43,0x3a, //C,:0x33,0x38, //3,80x2a,0x34, //*,40x30,0x20, //0,0x20,0x44, // ,D0x3a,0x34, //:,40x30,0x2a, //0,*0x34,0x30, //4,0};char code Hanzi81[32]= //选定菜单屏第一行{0xd1,0xa1, //选0xb6,0xa8, //定0xba,0xb8, //焊0xbd,0xe1, //结0xb8,0xd6, //钢0xb0,0xe5, //板0xba,0xf1, //厚0xb6,0xc8, //度0x20,0x20,0x20,0x20,0xcf,0xc2, //下0xb0,0xe5, //板0x20,0x20, //x,x0xba,0xc1, //毫0xc3,0xd7, //米0x20,0x20,};char code Hanzi82[32]= //选定菜单屏第二行{ 0x20,0x20,0xc9,0xcf, //上0xb0,0xe5, //板0x20,0x20, //x,x0xba,0xc1, //毫0xc3,0xd7, //米0x20,0x20,0x20,0x20,0x20,0x20,0xc7,0xeb, //请0xc8,0xb7, //确0xb6,0xa8, //定0x3f,0x20, //?0x20,0x20,0x20,0x20,0x20,0x20,};char code Hanzi100[16]= //运行菜单第四行{ 0x20,0x20,0x20,0x20,0x20,0x20,0xd4,0xcb, //运0xd0,0xd0, //行0x20,0x20,0x20,0x20,0x20,0x20,};char code Hanzi101[16]= //就绪菜单第四行{ 0x20,0x20,0x20,0x20,0x20,0x20,0xbe,0xcd, //就0xd0,0xf7, //绪0x20,0x20,0x20,0x20,0x20,0x20,};char code Hanzi102[16]= //运行菜单第四行{ 0x20,0x20,0x20,0x20,0x20,0x20,0xd4,0xdd, //暂0xcd,0xa3, //停0x20,0x20,0x20,0x20,0x20,0x20,};char code Shuozi[144]= //数字字符{0x30,0x36,0x30,0x38, //数字0,10x30,0x38,0x30,0x38,0x30,0x38,0x31,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x31,0x32,0x31,0x32,0x31,0x32,0x31,0x32,0x31,0x34,0x31,0x34,0x31,0x34,0x31,0x34,0x31,0x36,0x31,0x36,0x31,0x36,0x31,0x36,0x31,0x38, 0x31,0x38,0x31,0x38, 0x31,0x38,0x32,0x30, 0x32,0x30,0x32,0x30, 0x32,0x30,0x32,0x32, 0x32,0x32,0x32,0x32, 0x32,0x32,0x32,0x34, 0x32,0x34,0x32,0x34, 0x32,0x34,0x32,0x36, 0x32,0x36,0x32,0x36, 0x32,0x36,0x32,0x38, 0x32,0x38,0x32,0x38, 0x32,0x38,0x33,0x30, 0x33,0x30,0x33,0x30, 0x33,0x30,0x33,0x32, 0x33,0x32,0x33,0x32, 0x33,0x32,0x33,0x34, 0x33,0x34,0x33,0x34, 0x33,0x34,0x33,0x36, 0x33,0x36,0x33,0x36, 0x33,0x36,0x33,0x38, 0x33,0x38,0x33,0x38, 0x33,0x38,0x34,0x30, 0x34,0x30,0x34,0x30, 0x34,0x30,0x34,0x32, 0x34,0x32,0x34,0x32, //0x32,0x33, //数字2,3 //0x34,0x35, //数字4,5 //0x36,0x37, //数字6,7 //0x38,0x39, //数字8,9};char code Hanzi000[16]= //清除行{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,};//************主函数******************* void main() //主程序{ImimC52(); //C52初始化函数ImimLCM(); //LCM初始化函数P1=0xf0;DMX=0x00; //程序代码清零Qsp(); //写起始屏//Tkanmengou(); // 踢看门狗函数while(1){KeyScan(); //键盘扫描子函数Janpan(); //菜单屏分类函数//Tkanmengou(); // 踢看门狗函数}}//************C52初始化程序********************void ImimC52() //C52初始化函数:{IE=0; //关总中断和所有中断TMOD=0x20; //设置定时器T1为模式2,自动重装入的8位定时器模式//0010 0000=0x20//0~~~ ~~~~ [GATE-1] T1门控制位0:T1不受外部引脚控制1:T1受外部引脚(INT1)控制//~0~~ ~~~~ [C/T-1] T1工作方式选择位0:T1定时器方式1:T1计数器方式//~~10 ~~~~ [M1-0] T1工作模式选择位00:13位模式01:16位模式// 10:8位自动重装入模式11:T1停止计数//~~~~ 0~~~ [GATE-0] T0门控制位0:T0不受外部引脚控制1:T0受外部引脚(INT1)控制//~~~~ ~0~~ [C/T-0] T0工作方式选择位0:T0定时器方式1:T0计数器方式//~~~~ ~~00 [M1-0] T0工作模式选择位00:13位模式01:16位模式// 10:8位自动重装入模式11:T0分为两个8位计数器TCON=0x00; //清中断标志位,设置外部中断触发方式为低电平//0000 0000=0x00//0~~~ ~~~~ [TF1] T1溢出中断标志位0: 1:发生中断(进入中断自动请0)//~0~~ ~~~~ [TR1] T1启停控制位0:T1禁止1:T1使能//~~0~ ~~~~ [TF0] T0溢出中断标志位0: 1:发生中断(进入中断自动请0)//~~~0 ~~~~ [TR0] T0启停控制位0:T0禁止1:T0使能//~~~~ 0~~~ [IE1] 外部中断1标志位0:1:请求中断//~~~~ ~0~~ [IT1] 外部中断1触发方式控制位0:低电平触发1:高电平触法//~~~~ ~~0~ [IE0] 外部中断0标志位0:1:请求中断//~~~~ ~~~0 [IT0] 外部中断0触发方式控制位0:低电平触发1:高电平触法TH1=0xfd; //装载计数器,设置波特率为9600TL1=0xfd; //装载计数器,设置波特率为9600SCON=0xD0; //设置串行模式3,清串行发送和接收中断标志位//1101 0000=0xD0//11~~ ~~~~ [SM0 SM1] 工作方式选择位00:同步移位寄存器方式波特率为fosc/12 01:10位异步方式波特率由定时器控制// 10:11位异步方式波特率fosc/32或fosc/64 11:11位异步方式波特率由定时器控制//~~0~ ~~~~ [SM2] 多机通讯控制位位0:多机通讯禁止1:多机通讯使能//~~~1 ~~~~ [REN] 接收使能位0:接收禁止1:接收使能//~~~~ 0~~~ [TB8] 发送数据的第9位单机通讯的奇偶校验位或多机通讯的地址帧(TB8=1)或数据帧(TB8=0)//~~~~ ~0~~ [RB8] 接收数据的第9位单机通讯的奇偶校验位或模式1的停止位或多机通讯的地址帧(TB8=1)或数据帧(TB8=0) //~~~~ ~~0~ [TI ] 发送中断标志位1:发送缓冲寄存器已空(必须由软件复位清0)//~~~~ ~~~0 [RI ] 接收中断标志位1:接收缓冲寄存器已满(必须由软件复位清0)PCON=0x00; //设置SMOD=0,波特率不加倍//0000 0000=0x00//0~~~ ~~~~ [SMOD] 波特率倍增位0:波特率不增加1:波特率增加1倍//~000 ~~~~ [ ]//~~~~ 0~~~ [GF1] CHMOS型单片机掉电控制位//~~~~ ~0~~ [GF0] CHMOS型单片机掉电控制位//~~~~ ~~0~ [PD] CHMOS型单片机掉电控制位//~~~~ ~~~0 [IDL] CHMOS型单片机掉电控制位T2CON=0x00; //设置定时器T2模式,为16位自动再装入,并清标志位//0000 0000=0x00//0~~~ ~~~~ [TF2] T2溢出中断标志位由软件复位0: 1:发生中断(必须由软件复位)//~0~~ ~~~~ [EXF2] T2外部中断标志位0: 1:T2EX引脚负跳变而引起的捕获或重装入中断标志位(必须由软件复位)//~~0~ ~~~~ [RCLK] 串行口接收时钟标志位0:使用T1溢出作为串行口接收时钟1:使用T2溢出作为串行接收口时钟//~~~0 ~~~~ [TCLK] 串行口发送时钟标志位0:使用T1溢出作为串行口发送时钟1:使用T2溢出作为串行口发送时钟//~~~~ 0~~~ [EXEN2] T2外部触发准许标志位0:禁止T2EX引脚触发1:使能T2EX引脚(P1.1)负跳变触发捕获或重装入//~~~~ ~0~~ [TR2] T2启停控制位0:禁止T2计数1:使能T2计数//~~~~ ~~0~ [C/T2 ] T2功能选择为0:定时器模式1:计数器模式//~~~~ ~~~0 [CP/RL2] T2捕获或重装如选择位0:捕获和计数都触发重新装入1:T2EX引脚(P1.1)负跳变触发捕获或重装入T2MOD=0x00; //设置定时器T2为加1计数模式//0000 0000=0x00//~~~~ ~~~~ [ ]//~~~~ ~~0~ [T2OE ] T2输出启动位0:T2输出禁止1:T2输出使能//~~~~ ~~~0 [DCEN] T2捕获或重装如选择位0:T2加计数模式1:由T2EX引脚电平控制加减计数模式P0=0xff; //初始化P0口P1=0xff;P2=0xff;P3=0xff;EA=1; //开总中断//EX0=1; //开外部中断0中断ET2=1; //开T2中断ES=1; //开串行中断TR1=1; //启动定时器1PU1=0;DR1=0;}//************判忙程序******************** void Panmang() //判忙函数{uchar q=0x80; //判忙变量RS=0; //设置读写指令状态RW=1; //设置读状态while(q&0x80){P0=0xff; //向P0口送oxff,将P0口置高E=1; //使能q=P0; //P0口送入qE=0; //关闭使能}}//************写指令程序******************** void Write_com(uchar com) //写指令函数{Panmang(); //判忙函数RS=0; //设置读写指令状态RW=0; //设置写状态P0=com; //指令送入P0口E=1; //使能E=0; //关闭使能}//************送单个显示数据程序******************** void Write_date(uchar date) //送数据函数{Panmang(); //判忙函数RS=1; //设置读写数据状态RW=0; //设置写状态E=1; //使能P0=date; //数据地址送入P0口E=0; //关闭使能}//************写显示数据程序******************** void Write_p() //设置地址,写显示数据{int i;Write_com(k); //设置显示首地址for(i=0;i<js;i++,pp++)< bdsfid="587" p=""></js;i++,pp++)<>{d=*pp; //送数据地址Write_date(d); //写显示数据}}//************LCM初始化程序******************** void ImimLCM() //LCM初始化函数{Write_com(0x30); //功能设定,8位数据方式基本指令Write_com(0x30); //功能设定,8位数据方式基本指令Write_com(0x0c); //显示开,游标关,反白关Write_com(0x01); //清除显示Write_com(0x06); //进入设定点,游标右移,画面不移动}//************LCM清屏程序********************/*void ClearLCM() //LCM清屏函数{E=0; //关使能RW=0; //设置写状态P0=0x01;Write_com(0x01); //写清屏指令} *///************写起始屏显示数据程序********************void Qsp() //写起始屏{k=0x80; //显示首地址为0x80,第一行js=32; //数据个数为16pp=Hanzi01; //取数据首地址Write_p(); //写显示数据k=0x90; //显示首地址为0x90,第二行pp=Hanzi02; //取数据首地址Write_p(); //写显示数据pk=0; //显示屏序号TR2=0;dm1=0x00;dm2=0x00;DMX=0x00; //程序代码清零}//*******************延时子程序*******************void Delay(int sj) //延时函数,单位时间为1us {int i,j;for(i=0;i<sj;i++)< bdsfid="626" p=""></sj;i++)<>for(j=0;j<1;j++);}//*******************串行通讯发送函数******************* void Tongxun() //串行通讯发送函数{TI=0; // 清发送中断标志位RI=0; //清接收标志位ACC=DMX; //数据送入ACY=P; //奇偶位送入进位位TB8=CY; //奇偶位送入进位位SBUF=ACC; //发送数据//while(TI!=1);//Tkanmengou(); // 踢看门狗函数;//TI=0; // 清发送中断标志位}//*******************菜单屏分类函数*****************void Janpan() //菜单屏分类函数{if(Key!=0x00) //判断键码,如果扫描到按键按下{switch(pk) //屏选分类{case 0: //在起始屏下caidan1(); //写第一级菜单屏break;case 1: //在第一级菜单屏下caidan2(); //写第二级菜单屏break;case 2: //在第二级菜单屏下caidan3(); //写第选定菜单屏break;case 3: //在选定菜单屏下caidan4(); //写第就绪菜单屏break;case 4: //在就绪菜单屏下caidan5(); //写第运行菜单屏break;case 5: //在运行屏下caidan6(); //返回就绪屏或写起始屏break;case 6: //在暂停屏下caidan7(); //返回运行屏或写起始屏break;default:break;}}Key=0x00; //键码清零}//*******************行走函数******************void Xingzou() //行走函数{TH2=TH20; // 计数值设定TL2=TL20; // 计数值设定RCAP2H=TH20; // 计数值设定RCAP2L=TL20; // 计数值设定TR2=1; // 启动定时器2}//*******************写第一菜单屏函数******************void caidan1() //写第一菜单屏函数{switch(Key) //判断键码{case 0x77: //菜单键js=32;k=0x80;pp=Hanzi11;//指针指向第一行数组的首地址Write_p();//写汉字程序,1行(钢板厚度(毫米))k=0x90;pp=Hanzi12;//指针指向第二行数组的首地址Write_p();//写汉字程序,2行(A:08-12 B:14-18)pk=1;break;case 0xbe: //前进键DR1=1; // 步进电机方向设定(前进)TH20=0x00; //定时器2计数器高位值TL20=0x00; //定时器2计数器低位值Xingzou(); //行走函数break;case 0xde: //停止键((停止前进、后退、上升、下降)TR2=0; //关定时器2break;case 0xee: //后退键DR1=0; // 步进电机方向设定(后退)TH20=0x00; //定时器2计数器高位值TL20=0x00; //定时器2计数器低位值Xingzou(); //行走函数break;default:break;}Key=0x00; //键码清零}//*******************写第二菜单屏函数****************** void caidan2() //写第二级菜单屏函数{switch(Key) //判断键码{case 0x7b: //A键(二级菜单第1屏)js=16;k=0x80;pp=Hanzi11;//指针指向第一行数组的首地址Write_p();//写汉字程序,1行(钢板厚度(毫米))k=0x88;;pp=Hanzi23;//指针指向第三行数组的首地址Write_p();//写汉字程序,3行(C:08*10 D:10*10) )js=32;k=0x90;pp=Hanzi22;//指针指向第二行数组的首地址Write_p();//写汉字程序,2行(A:06*08 B:08*08)pk=2;dm1=0x10; //程序高4位代码TH20=0x00; //定时器2计数器高位值TL20=0x00; //定时器2计数器低位值break;case 0xbb: //B键(二级菜单第2屏)js=16;k=0x80;pp=Hanzi11;//指针指向第一行数组的首地址Write_p();//写汉字程序,1行(钢板厚度(毫米)k=0x88;pp=Hanzi33;//指针指向第三行数组的首地址Write_p();//写汉字程序,3行(C:14*16 D:16*16) js=32;k=0x90;pp=Hanzi32;//指针指向第二行数组的首地址Write_p();//写汉字程序,2行(A:12*14 B:14*14) pk=2;dm1=0x20; //程序高4位代码TH20=0x00; //定时器2计数器高位值TL20=0x00; //定时器2计数器低位值break;case 0xdb: //C键(二级菜单第3屏)js=16;k=0x80;pp=Hanzi11;//指针指向第一行数组的首地址Write_p();//写汉字程序,1行(钢板厚度(毫米)k=0x88;pp=Hanzi43;//指针指向第三行数组的首地址Write_p();//写汉字程序,3行(C:20*22 D:22*22) js=32;k=0x90;pp=Hanzi42;//指针指向第二行数组的首地址Write_p();//写汉字程序,2行(A:18*20 B:20*20) pk=2;dm1=0x30; //程序高4位代码TH20=0x00; //定时器2计数器高位值TL20=0x00; //定时器2计数器低位值break;case 0x7d: //D键(二级菜单第4屏)js=16;k=0x80;pp=Hanzi11;//指针指向第一行数组的首地址Write_p();//写汉字程序,1行(钢板厚度(毫米)k=0x88;pp=Hanzi53;//指针指向第三行数组的首地址Write_p();//写汉字程序,3行(C:26*28 D:28*28) js=32;k=0x90;pp=Hanzi52;//指针指向第二行数组的首地址Write_p();//写汉字程序,2行(A:24*26 B:26*26) pk=2;dm1=0x40; //程序高4位代码TH20=0x00; //定时器2计数器高位值TL20=0x00; //定时器2计数器低位值break;case 0xbd: //E键(二级菜单第5屏)js=16;k=0x80;pp=Hanzi11;//指针指向第一行数组的首地址Write_p();//写汉字程序,1行(钢板厚度(毫米)k=0x88;pp=Hanzi63;//指针指向第三行数组的首地址Write_p();//写汉字程序,3行(C:32*34 D:34*34) js=32;k=0x90;pp=Hanzi62;//指针指向第二行数组的首地址Write_p();//写汉字程序,2行(A:30*32 B:32*32) pk=2;dm1=0x50; //程序高4位代码TH20=0x00; //定时器2计数器高位值。
带注解简单c51程序

日志[转] 带注解简单c51程序-学习专用2010-9-9 15:47阅读(5)下一篇:单片机C语言编程... |返回日志列表∙赞∙转载∙分享∙评论∙复制地址∙更多名称:IO口高低电平控制#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/void main (void){P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,ff 换算成二进制是 1111 1111P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮//0xfe是16进制,0x开头表示16进制数,fe换算成二进制是 1111 1110while (1) //主循环{//主循环中添加其他需要一直工作的程序}}----------------------- 我是分割线------------------------- 名称:IO口信号输入#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/void main (void){P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,ff 换算成二进制是 1111 1111while (1) //主循环{P1=P3; //读入P3的值然后赋值给P1,如果P3.0=0,其他为1,则执行过该语句后P1.0=0,其他值为1,对应P1.0口的灯亮 //程序可以通过独立按键测试,在开发板上需要切换成独立按键模式}}----------------------- 我是分割线------------------------- 名称:流水灯#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------延时子程序------------------------------------------------*/void delay(unsigned int cnt){while(--cnt);}/*------------------------------------------------主函数------------------------------------------------*/main(){P1=0xfe; //给初始化值换算成二进制是1111 1110while(1){delay(30000);//延时程序P1<<=1; //左移一位该语句等效于 P1=P1<<1P1|=0x01; //最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或"if(P1==0x7f) //检测是否移到最左端?"=="表示检测符号2端的值是否相等{delay(30000);P1=0xfe; //重新赋值}}}----------------------- 我是分割线------------------------- 名称:独立按键#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit key1=P3^0; //定义按键位置sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;/*------------------------------------------------延时子程序------------------------------------------------*/void delay(unsigned int cnt){while(--cnt);}/*------------------------------------------------主函数------------------------------------------------*/main(){P2=0x00;while(1){if(!key1) //按下相应的按键,数码管显示相应的码值P0=0x06;//数码管显示"1"if(!key2)P0=0x5B;//2if(!key3)P0=0x4F;//3if(!key4)P0=0x66;//4}}----------------------- 我是分割线------------------------- 名称:独立按键去抖动#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit key1=P3^0; //定义按键位置sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;/*------------------------------------------------延时子程序------------------------------------------------*/void delay(unsigned int cnt){while(--cnt);}/*------------------------------------------------主函数------------------------------------------------*/ main(){P2=0x00;while(1){if(!key1){ //按下相应的按键,数码管显示相应的码值delay(1000);if(!key1){P0=0x06;//数码管显示"1"}}if(!key2){ //按下相应的按键,数码管显示相应的码值delay(1000);//去抖动if(!key2) //检测按键确实按下,进行按键处理 {P0=0x5B;//数码管显示"2"//这里可以添加按键按下所需要的操作,如数据加减乘除,蜂鸣器等设备开关}}if(!key3){ //按下相应的按键,数码管显示相应的码值delay(1000);if(!key3){P0=0x4F;//数码管显示"3"}}if(!key4){ //按下相应的按键,数码管显示相应的码值delay(1000);if(!key4){P0=0x66;//数码管显示"4"}}}}----------------------- 我是分割线------------------------- 名称:定时器#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P1^2; //定义LED端口/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------主程序------------------------------------------------*/main(){Init_Timer0();while(1);}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1 using 1{TH0=0x00; //重新赋值TL0=0x00;LED=~LED; //指示灯反相,可以看到闪烁}----------------------- 我是分割线------------------------- 名称:外部中断0电平触发#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------主程序------------------------------------------------*/main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=0; //电平触发while(1){//在此添加其他程序}}/*------------------------------------------------外部中断程序------------------------------------------------*/void ISR_Key(void) interrupt 0 using 1{P1=~P1;}----------------------- 我是分割线------------------------- 名称:外部中断0边沿触发#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------主程序------------------------------------------------*/main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=1; //边沿触发while(1){//在此添加其他程序}}/*------------------------------------------------外部中断程序------------------------------------------------*/void ISR_Key(void) interrupt 0 using 1{P1=~P1; //s3按下触发一次,P1取反一次,这里需要切换跳帽到独立按键模式}----------------------- 我是分割线-------------------------名称:外部中断1#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------主程序------------------------------------------------*/main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX1=1; //外部中断0开IT1=1; //边沿触发,IT1=0表示电平触发while(1){//在此添加其他程序}}/*------------------------------------------------外部中断程序------------------------------------------------*/void ISR_Key(void) interrupt 2 using 1{//在此处可以添加去抖动程序,防止按键抖动造成错误P1=~P1;}----------------------- 我是分割线------------------------- 名称:矩阵键盘#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define uchar unsigned char#define uint unsigned intunsigned 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(); //调用键盘扫描,switch(key){case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值case 0x7d:P0=dofly[1];break;//1case 0x7b:P0=dofly[2];break;//2case 0x77:P0=dofly[3];break;//3case 0xbe:P0=dofly[4];break;//4case 0xbd:P0=dofly[5];break;//5case 0xbb:P0=dofly[6];break;//6case 0xb7:P0=dofly[7];break;//7case 0xde:P0=dofly[8];break;//8case 0xdd:P0=dofly[9];break;//9case 0xdb:P0=dofly[10];break;//acase 0xd7:P0=dofly[11];break;//bcase 0xee:P0=dofly[12];break;//ccase 0xed:P0=dofly[13];break;//dcase 0xeb:P0=dofly[14];break;//ecase 0xe7:P0=dofly[15];break;//f}}}/*------------------------------------------------键盘扫描程序------------------------------------------------*/uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值中间变量P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖if(cord_h!=0x0f){cord_h=P3&0x0f; //读入列线值P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}/*------------------------------------------------延时程序------------------------------------------------*/void delay(uint i) //延时函数{while(i--);}----------------------- 我是分割线------------------------- 名称:PWM 调光#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED = P1^2; //定义LED灯,通过LED显示调光效果unsigned char CYCLE; //定义周期该数字X基准定时时间如果是10 则周期是10 x 0.1msunsigned char PWM_ON ;//定义高电平时间/********************************************************** ********//* 延时函数*//********************************************************** ********/void delay(unsigned int cnt){while(--cnt);}/********************************************************** ********//* 主函数*//********************************************************** ********/main(){bit Flag;TMOD |=0x01; //定时器设置 0.1ms in 12M crystal TH0=(65536-100)/256;TL0=(65536-100)%256; //定时0.1mSIE= 0x82; //打开中断TR0=1;CYCLE = 10; // 时间可以调整这个是10调整 8位PWM就是256步while(!Flag){delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果PWM_ON++; //这个使用较长延时,以便能看清楚变化过程if(PWM_ON == CYCLE){ //这个里可以添加其他程序如到最亮时候控制设备Flag=1;}}while(Flag) //亮度递减同上,是个相反的过程{delay(20000);PWM_ON--;if(PWM_ON == 0){Flag=0;}}}/********************************************************** ********//* 定时器中断函数*//********************************************************** ********/void tim(void) interrupt 1 using 1{static unsigned char count;TH0=(65536-100)/256;TL0=(65536-100)%256; //定时0.1mSif (count==PWM_ON){LED = 1; //灯灭}count++;if(count == CYCLE){count=0;if(PWM_ON!=0) //如果左右时间是0 保持原来状态LED = 0; //灯亮 }}。
C51单片机程序

1.定时器实验程序:#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp,bai,shi,ge,aa,cnt;uchar code table[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; void delay(uint z);void init();void display(uchar bai,uchar shi,uchar ge);void main(){init();while(1){if(aa==20){aa=0;temp++;if(temp==1001){temp=0;}bai=temp/100;shi=temp%100/10;ge=temp%10;}display(bai,shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar bai,uchar shi,uchar ge){P0=table[bai];P2=0xfe;delay(1);P0=table[shi];P2=0xfd;delay(1);P0=table[ge];P2=0xfb;delay(1);}void init(){aa=0;cnt=0;temp=0;P1=0xfe;TMOD=0X11; //T1、T0工作方式均为1TH0=(65536-50000)/256;TL0=(65536-50000)%256; //计时50msTH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;TR0=1; //使能T1,T0ET1=1;TR1=1;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;cnt++;if(cnt >= 20){cnt = 0;P1=_crol_(P1,1); //流水灯}}2.矩阵键盘试验程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intchar code SST516[3] _at_ 0x003b;char table[17]= {0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9, 0x26,0xa1,0xb1};uchar dis_buf,buf;uchar temp;uchar key;void delay(uchar x) //延时函数{uchar j;while((x--)!=0){for(j=0;j<125;j++);}}/*键扫描子程序*/void keyscan(void){P1=0x0F;delay(1);temp=P1;temp=temp&0x0F;temp=~(temp|0xF0);if(temp==1)key=0;else if(temp==2)key=1;else if(temp==4)key=2;else if(temp==8)key=3;elsekey=16;P1=0xF0;delay(1);temp=P1;temp=temp&0xF0;temp=~((temp>>4)|0xF0);if(temp==1)key=key+0;else if(temp==2)key=key+4;else if(temp==4)key=key+8;else if(temp==8)key=key+12;elsekey=16;dis_buf=table[key]; //改变后键值赋给dis_buf}void keydown(void){P1=0xF0;if(P1!=0xF0) //P1状态改变说明有键按下{keyscan();while(P1!=0xF0);}}main(){P0=0xFF;P2=0x7F;dis_buf=0xBF;buf = 0xBF; //备份dis_bufwhile(1){keydown();P0 = dis_buf; //键值送显示if(dis_buf!=buf) //当dis_buf改变时,说明键值改变{dis_buf=buf;P2 = _crol_(P2,1); //数码管移位显示}delay(2);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();
void display(uchar aa);
void main()
{
num=17; //num=17代表:数组中第17的数。
dula=1; //打开段选
P0=0; //给P0一个值
dula=0; //关闭段选
wela=1; //打开位选锁存器的工作方试就
P0=0xc0; //给P0一个值
wela=0;//关闭位选
while(1)
{
display(keyscan()); // 两个函数的调用先用keyscan函数}
}
void display(uchar aa) //函数的调用被调用函数
{
dula=1; //打开段选
P0=table[aa-1]; //给P0一个值,在table数组中调用值给P0。
然后P0就有数显视
dula=0; //关闭段选
}
uchar keyscan()
{
1111000 P3=0xfe; //给P3口一个初值高四位都为1 只有最低一位是0 temp=P3; //定义的一个数temp 接收P3的口收回的值
temp=temp&0xf0; //然后用P3口接回来的值与给P3口定义的值进行与。
“与”有零则为零。
while(temp!=0xf0) //与出来的值与原来的值比较。
如果有变化说明有键按下。
{
delay(5); //延时一会。
防止抖动
temp=P3; //接收P3的口收回的值
temp=temp&0xf0; //再与一次,确认
while(temp!=0xf0) //“与”出来的值与原来的值比较。
如果有变化说明有键按下则进入这个while中
{ //如果与出来的值等oxfo则说明值为假。
不会执行这个while
temp=P3; //用P3的口收回的值看看是什么数,使用swith函数
switch(temp) //然后就是使用switch函数
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0) //目的为了走出上一个while,作用:判断P3口中还有没有键被按下
{//如果p3口的值与11110000不等就明是真的。
就是再执行以下的值
temp=P3; //还接收P3口收回的值;
temp=temp&0xf0; // 再与我们给点的数与然后再到0xf0比较
}
}
}
11111101 P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
11111011 P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
11110111 P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}。