搜档网
当前位置:搜档网 › 单片机按键显示程序及原理图

单片机按键显示程序及原理图

单片机按键显示程序及原理图
单片机按键显示程序及原理图

1.KEYLED---按键一位显示ORG 0000H

LJMP MAIN

ORG 0030H MAIN:mov a,#010h

mov 50h,a

main1: LCALL LED

LCALL KEY

SJMP MAIN1 KEY: LCALL KS

JNZ K1

LCALL DELAY

LJMP K5

K1: LCALL DELAY

LCALL DELAY

LCALL KS

JNZ K2

LJMP K5

K2: MOV R2,#0FEH

MOV R4,#00H

K3: MOV A,R2

MOV P2,A

MOV A,P2

ANL A,#0F0H

SWAP A

JB ACC.0,L1

MOV A,#00H

LJMP LK

L1: JB ACC.1,L2

MOV A,#04H

LJMP LK

L2: JB ACC.2,L3

MOV A,#08H

LJMP LK

L3: JB ACC.3,NEXT MOV A,#0CH LK: ADD A,R4

PUSH ACC

K4: LCALL DELAY

LCALL KS

JNZ K4

POP ACC

mov 50h,a

K5: RET

NEXT:INC R4

MOV A,R2

JNB ACC.3,K5

RL A

MOV R2,A

LJMP K3

KS: MOV A,#0F0H

MOV P2,A

MOV A,P2

CPL A

ANL A,#0F0H

SWAP A

RET

LED: mov a,50h

mov r1,A

mov p3,#0efh LED1: MOV A,r1

mov dptr,#table

MOVc A,@a+dptr

mov p0,a

LCALL DELAY

RET

DELAY:mov r5,#10H

D0: MOV R6,#0FAH

D1: DJNZ R6,D1

djnz r5,D0

RET

table:db

0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0C6h,0A1h,86h,8Eh,0ch END

2.KEYLEDINT1---按键4位显示,中断

ORG 0000H

LJMP MAIN

org 0013h

ljmp subint1

org 001bh

ljmp subt1

ORG 0030H

MAIN:mov a,#010h

mov 50h,a

mov 51h,#0h

mov 52h,#0h

mov 53h,#0ch

mov 54h,#0h

mov 55h,#4

clr p1.2

setb p1.5

CLR RS0

CLR RS1

//SETB RS0

mov r7,#20

CLR RS0

mov tl0,#00h

mov th0,#00h

mov tl1,#0B0h

mov th1,#3ch

mov tmod,#11h

mov ie,#8ch

mov tcon,#04h

//setb tr0

setb tr1

clr p1.0

main1:mov R0,#4fh

mov R2,#0F7h main2:mov R3,#04H main3:mov A,R2

RL A

mov R2,A

INC R0

LCALL LED

DJNZ R3,main3

SJMP MAIN1 LED: mov a,@R0

mov r1,A

mov p3,r2

LED1: MOV A,r1

mov dptr,#table

MOVc A,@a+dptr

mov p0,a

LCALL DELAY

RET

DELAY:mov r5,#4H

D0: MOV R6,#0faH D1: DJNZ R6,D1

djnz r5,D0

RET

table:db

0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0C6h,0A1h,86h,8Eh,0ch

subint1:push acc

inc 54h

dec 55h

mov a,55h

cjne a,#00h,subint10

mov 55h,#4

cpl p1.5

cpl p1.2

subint10:pop acc

reti

subt1: mov tl1,#0B0h

mov th1,#3Ch

push acc

//SETB RS0

dec r7

cjne r7,#00h,subt10

mov a,54h

mov b,#4

div ab //mul

mov 54h,#00h

mov r7,#20

mov b,#0ah

div ab

mov 50h,b

mov b,#0ah

div ab

mov 51h,b

mov b,#0ah

div ab

mov 52h,b

mov b,#0ah

div ab

mov 53h,b

cpl p1.4 subt10: //CLR RS0

pop acc

reti

3.中断脉宽调制PWM

Org 0000h

ljmp main

org 000bh

ljmp subt0

org 0030h main: mov 50h,#0h

mov 51h,#10h

mov 52h,#80h

mov 53h,#00h

mov tl0,#00h

mov th0,#00h

mov tmod,#01h

mov ie,#82h

setb tr0

lp1: sjmp lp1

subt0: mov tl0,#00h

mov th0,#00h

inc 50h

mov a,53h

cjne A,#0,lp2

mov a,50h

cjne a,51H,lp4

mov 50h,#00h

mov 53h,#01h

SETB p1.3

SJMP LP4

cjne a,52H,lp4

mov 50h,#00h

mov 53h,#00h

CLR p1.3

lp4: reti

end

4.中断脉宽调制PWM扩展

Org 0000h

ljmp main

org 000bh

ljmp subt0

org 0030h

main: mov 50h,#1h

mov 56h,#0h

mov 57h,#2h

mov 58h,#30h

mov 59h,#00h

mov tl0,#00h

mov th0,#00h

mov tmod,#01h

setb tr0

lp1: LCALL LED

LCALL KEY

mov a,50h

JZ lp1

mov B,A

mov A,57h

MUL AB

mov 58H,A

sjmp lp1

subt0: PUSH ACC

mov tl0,#00h

mov th0,#00h

inc 56h

mov a,59h

cjne A,#0,lp2

mov a,56h

cjne a,57H,lp4

mov 56h,#00h

mov 59h,#01h

SETB p1.3

SJMP LP4

LP2: mov a,56h

cjne a,58H,lp4

mov 56h,#00h

mov 59h,#00h

CLR p1.3

lp4: POP ACC

reti

KEY: LCALL KS

JNZ K1

LCALL DELAY

LJMP K5

K1: LCALL DELAY

LCALL DELAY

LCALL KS

JNZ K2

LJMP K5

K2: MOV R2,#0FEH

MOV R4,#00H

K3: MOV A,R2

MOV P2,A

MOV A,P2

ANL A,#0F0H

SWAP A

JB ACC.0,L1

MOV A,#00H

LJMP LK

L1: JB ACC.1,L2

MOV A,#04H

LJMP LK

L2: JB ACC.2,L3

MOV A,#08H

LJMP LK

L3: JB ACC.3,NEXT

MOV A,#0CH LK: ADD A,R4

PUSH ACC

K4: LCALL DELAY

LCALL KS

JNZ K4

POP ACC

mov 50h,a

K5: RET

NEXT:INC R4

MOV A,R2

JNB ACC.3,K5

RL A

MOV R2,A

LJMP K3

KS: MOV A,#0F0H

MOV P2,A

MOV A,P2

CPL A

ANL A,#0F0H

SWAP A

RET

LED: mov a,50h

mov r1,A

mov p3,#0efh LED1: MOV A,r1

mov dptr,#table

MOVc A,@a+dptr

mov p0,a

LCALL DELAY

RET

DELAY:mov r5,#10H

D0: MOV R6,#0FAH

D1: DJNZ R6,D1

djnz r5,D0

RET

table:db

0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0C6h,0A1h,86h,8Eh,0ch end

J1

1.ADC0809参考电路

2.DAC0832参考电路

3.4位LED显示参考电路

自己写的按键单片机程序

自己写的按键单片机程序 用4个按键来控制数码管显示的内容#include#define duan P0//段选#define wei P2//位选unsigned char code wei1[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制unsigned char code duan1[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0 x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char ge,shi,bai,a,b;sbit key1=P1;sbit key2=P1 ;sbit key3=P1 ;sbit key4=P1 ;void keys();//按键函数void s(unsigned char xms);//延时函数void DigDisplay(); //动态显示函数void init(); //初始化函数void main(void){init(); while(1){DigDisplay();keys();} }void DigDisplay(){unsigned char i;unsigned int j;bai=a/100;shi=a%100/10;ge=a%10;i=0;wei = wei1[i];//发送位选duan = duan1[bai]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[shi]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[ge]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐}void init() {key1=1;key2=1;key3=1;key4=1;TMOD=0X01;TH0=(65536- 45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;}void s(unsigned char xms){unsigned char x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void times() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;b++;if(b==20){b=0;a++;if(a==256){a=0;}}}void keys(){if(key1==0){s(10);if(key1==0){a++;TR0=0;if(a==256)a=0;while(!key1)Dig Display();}}if(key2==0){s(10);if(key2==0){TR0=0;if(a==0)a=256;a--

51单片机04矩阵按键逐行扫描,行列扫描代码

矩阵键盘扫描原理 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 方法二: 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。

//行列扫描 #include #define GPIO_KEY P0 #define GPIO_LCD P2 unsigned char code a[17]= {~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0, ~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00}; //按位取反的用法 void delay10ms(); void keydown();//要与下面的定义一致 void main() { GPIO_LCD=a[16];//初始化数码管 while(1) { keydown(); } }

void delay10ms() { unsigned char a,b; for(a=38;a>0;a--) for(b=130;b>0;b--); } void keydown() //检测按下,按下时需要消抖,检测松开,返回按键值//没有按键时保持 { unsigned char n=0,key; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay10ms(); //延时10ms消抖 if(GPIO_KEY!=0x0f)//再次检测按键是否按下 { GPIO_KEY=0x0f;//测试列 switch(GPIO_KEY) { case 0x07: key=0;break;

程序文件流程图

目录 8.2.3.4 a.质量手册编号 (2) 8.2.3.4 b.程序文件编号 (2) 8.2.3.4 d.质量记录编号 (2) 8.2附图 1:组织(及所属部门)制订、发放的文件受控流程图 (3) 8.2附图 2:外来受控文件受控流程图 (4) 8.3.2质量记录控制流程图 (5) 8.4.2内部质量审核工作流程图 (6) 8.5.2 6.10进货检验的不合格品控制程序 (7) 8.5.2 6.10产品已交付和使用时发现的不合格品控制程序 (8) 8.5.2产品最终检验的不合格品控制程序流程图 (9) 8.5.2产品实现过程中不合格品控制程序流程图 (10) 8.6.2A类纠正措施流程图 (11) 8.6.2B类纠正措施 (12) 8.6.2C类纠正措施 (13) 8.7.2《质量情况通报》的编制、发放、回收、处理 (14) 8.7.2财务状况预警系统 (15) 8.7.2预防措施的制订、实施和评价 (16) 8.8.2管理评审控制程序流程图 (17) 8.9.2人员招聘录用程序流程图 (18) 8.9.2培训程序流程图 (19) 8.9.2考核程序流程图 (20) 8.11.2产品实现过程策划程序流程图 (21) 8.11.2策划依据 (22) 8.12.2产品要求的识别与评审过程 (23) 8.12.2产品合同修改过程 (24) 8.12.2市场信息控制过程 (25) 8.13.2设计和开发控制程序 (26) 8.14.2采购控制程序流程图 (27) 8.15.2生产运作程序流程图 (28) 8.17.2测量和监控策划程序 (29) 8.18.2体系业绩的测量和监控过程程序 (30) 8.19.2过程的测量、监控和分析程序流程图 (31) 8.20.2产品测量和监控程序流程图 (32) 8.21.2持续改进过程控制程序 (33)

51单片机密码锁制作的程序和流程图

51单片码锁制作的程序和流程图(很详细) 一、基本组成: 单片机小系统+4*4矩阵键盘+1602显示+DC电机 基本电路: 键盘和和显示 键盘接P1口,液晶的电源的开、关通过P2.7口控制 电机(控制口P2.4) 二、基本功能描述: 1.验证密码、修改密码 a)锁的初始密码是123456(密码最长为10位,最短为1位)。 2.恢复初始密码 a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。

3.使系统进入低功耗状态 a)在实际使用中,锁只有在开门时才被使用。因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。 b)同时将LCD背光灯关闭 4.DC电机模拟开锁动作。 a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。 三、密码锁特点说明: 1.0 输入将被以字符形式输入,最长为10位。 超过10位时系统将自动截取前10位、但不作密码长度溢出提示。 2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。 3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。 4.0 若2分钟无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。 5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。 6.0 修改密码键和恢复初始密码键最好置于室。 这是Proteus仿真结果: 输入密码123456: 显示结果: 密码正确时电机启动、电机将持续5秒:

51单片机密码锁制作的程序和流程图

51单片机密码锁制作的程序和流程图(很详细) 一、基本组成: 单片机小系统+4*4矩阵键盘+1602显示+DC电机 基本电路: 键盘和和显示 键盘接P1口,液晶的电源的开、关通过P2.7口控制 电机(控制口P2.4) 二、基本功能描述: 1.验证密码、修改密码 a)锁的初始密码是123456(密码最长为10位,最短为1位)。 2.恢复初始密码 a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。

3.使系统进入低功耗状态 a)在实际使用中,锁只有在开门时才被使用。因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。 b)同时将LCD背光灯关闭 4.DC电机模拟开锁动作。 a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。 三、密码锁特点说明: 1.0 输入将被以字符形式输入,最长为10位。 超过10位时系统将自动截取前10位、但不作密码长度溢出提示。 2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。 3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。 4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。 5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。 6.0 修改密码键和恢复初始密码键最好置于室内。 这是Proteus仿真结果: 输入密码123456: 显示结果: 密码正确时电机启动、电机将持续5秒:

单片机键盘输入程序

这是读取键盘的子程序 主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法 以及如何处理读入的键值 思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反 那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms 应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘的抗干扰设计等在单电能机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种查询式键盘的工作原理与读取方式。 下面是汇编语言写的单片机键盘输入程序 ************************************************** led1 bit p1.0;LED 显示位定义 led2 bit p1.1 led3 bit p1.2 led4 bit p1.3 led5 bit p1.4 led6 bit p1.5 led7 bit p1.6 led8 bit p1.7 s1 bit p0.0 ;数码管位定义 s2 bit p0.1 s3 bit p0.2 s4 bit p0.3 s5 bit p0.4 s6 bit p0.5 s7 bit p0.6 s8 bit p0.7 led_data equ p2;数码管显示数据定义 key1 bit p3.5 ;按键引脚定义

key2 bit p3.6; key3 bit p3.7; key equ 46h;按键寄存单元 org 00h jmp main org 030h main:mov sp,#30h;首先定义 lcall REST;初始化子程序 lp:lcall pro_key;调用键盘查询子程序 lcall KEYPR ;用来显示所查询到的键值jmp lp;反复调用,不断查询 REST: mov a,#00h mov b,#00h mov p0,#0 mov p1,0ffh ; mov p2,#0 mov key,#00h mov p2,#255 clr beep RET KEYPR: mov a,key;键值在累加器KEY中 jz PROEND ;如果A= 0,表示没有按键,返回cjne a,#1,k1;A= 1 ,用户按了第一个键mov a,#1 ;处理 A = 1的情况 mov dptr,#tab_nu ;查表 movc a,@a+dptr mov led_data,a ;显示"1" setb s1 ;在第一位

单片机矩阵键盘扫描程序

#include #include #define uint unsigned int #define uchar unsigned char sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 uint keyflag ; //键盘正在读取标志位,如果Keyflag为1 ,表示正在读取键盘,停止其他功能; char x,y,m,n,c; //Keyflag为0,读取键盘结束,恢复其他功能 char flag1=0; //频率范围10~1000Hz uchar Hrate = 0; //一个周期内高点平占据时间 uchar Lrate = 0; //一个周期内低电平占据时间 uint FREQ0; //定时器T0的计数变量// uint FREQ1; //定时器T1的计数变量// sbit P2_1=P2^0; //设置P2.1,作为信号输出口// uint disbuf[3]; uint figure=0; int sum2=0; int sum1=0; int flag=0; uint count=0; uint max=0; uint disbuf_temp=0; /******************************************************************** * 名称: 1602显示延时函数delay() * 功能: 延时,延时时间大概为5US。

* 输出: 无 ***********************************************************************/ void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************** * 名称: bit Busy(void) * 功能: 这个是一个读状态函数,读出函数是否处在忙状态 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ bit Busy(void) { bit busy_flag = 0; RS = 0; RW = 1; E = 1; delay(); busy_flag = (bit)(P0 & 0x80); E = 0; return busy_flag; } /******************************************************************** * 名称: wcmd(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void wcmd(uchar del) { while(Busy()); RS = 0; RW = 0; E = 0; delay(); P0 = del; delay(); E = 1;

程序流程图编写规范_(终极整理版)

程序流程图规范 1.引言 国际通用的流程图形态和程序: 开始(六角菱型)、过程(四方型)、决策(菱型)、终止(椭圆型)。在作管理业务流程图时,国际通用的形态:方框是流程的描述;菱形是检查、审批、审核(一般要有回路的);椭圆一般用作一个流程的终结;小圆是表示按顺序数据的流程;竖文件框式的一般是表示原定的程序;两边文件框式的一般是表示留下来的资料数据的存储。 2.符号用法 程序流程图用于描述程序内部各种问题的解决方法、思路或算法。 图1-1 标准程序流程图符号 1)数据:平行四边形表示数据,其中可注明数据名、来源、用途或其 它的文字说明。此符号并不限定数据的媒体。 2)处理:矩形表示各种处理功能。例如,执行一个或一组特定的操作,

从而使信息的值,信息形式或所在位置发生变化,或是确定对某一流向的选择。矩形内可注明处理名或其简要功能。 3)特定处理:带有双纵边线的矩形表示已命名的特定处理。该处理为 在另外地方已得到详细说明的一个操作或一组操作,便如子例行程序,模块。矩形内可注明特定处理名或其简要功能。 4)准备:六边形符号表示准备。它表示修改一条指令或一组指令以影 响随后的活动。例如,设置开关,修改变址寄存器,初始化例行程序。 5)判断:菱形表示判断或开关。菱形内可注明判断的条件。它只有一 个入口,但可以有若干个可供选择的出口,在对符号内定义各条件求值后,有一个且仅有一个出口被激活,求值结果可在表示出口路径的流线附近写出。 6)循环界限:循环界限为去上角矩形或去下角矩形,分别表示循环的 开始和循环的结束。一对符号内应注明同一循环标识符。可根据检验终止循环条件在循环的开始还是在循环的末尾,将其条件分别在上界限符内注明(如:当A>B)或在下界限符内注明(如:直到C

单片机按键连接方法

单片机按键连接方法总结(五种按键扩展方案详细介绍) 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。 1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。 这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案。 2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。 这是一种矩阵式键盘,用8个I/O控制了16个按钮开关,优点显而易见。当然这种电路的程序设计相对也还是很简单的。由P00到P03循环输出低电平,然后检测P04到P07的状态。比方说这里P00到P03口输出1000,然后检测P04到P07,如果P04为1则说明按下的键为s1,如果P05为1则说明按下的是s2等等。为了电路的可靠,也可以和第一种方案一样加上上拉电阻。 3)、第三种是我自己搞的一种方案,可以使用4个I/O控制8个按键,电路多了一些二极管,稍微复杂了一点。 这个电路的原理很简单,就是利用二极管的单向导电性。也是和上面的方案一样,程序需要采用轮训的方法。比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查询P02和P03的状态,如果P02为高则说明按下的是s5,若P03为高则说明按下的是s6,然后再让P00为低,P01为高,同样检测P02和P03的状态。接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。这种方案的程序其实也不难。 4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比我的上一种方案的I/O利用率更高,他用4个I/O口控制了12个按键。我相信你了解了之后也会惊奇的。 首先好好品味一下这个方案吧,想想怎么来识别按键呢!

单片机4X4键盘扫描和显示课程设计

二、设计内容 1、本设计利用各种器件设计,并利用原理图将8255单元与键盘及数码管显示单元连接,扫描键盘输入,最后将扫描结果送入数码管显示。键盘采用4*4键盘,每个数码管可以显示0-F共16个数。将键盘编号,记作0-F,当没按下其中一个键时,将该按键对应的编号在一个数码管上显示出来,当在按下一个 键时,便将这个按键的编号在下一个数码管上显示,数码管上 可以显示最近6次按下的按键编号。 设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。 三、问题分析及方案的提出 4×4键盘的每个按键均和单片机的P1口的两条相连。若没有按键按下时,单片机P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。单片机定时对P1口进行程序查询,即可发现键盘上是否有按键按下以及哪个按键被按下。 实现4×4键盘的接口需要用到单片机并编写相应的程序来识别键盘的十六个按键中哪个按键被按下。因为此题目还要求将被按下的按键显示出来,因此可以用两个数码管来分别显示被按下的按键的行与列

表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列。例如0xD7是键盘的第二行第四列的按键 对于数码管的连接,采用了共阳极的接法,其下拉电阻应保证芯片不会因为电流过大而烧坏。 五、电路设计及功能说明 4×4键盘的十六个按键分成四行四列分别于P1端口的八条I/O 数据线相连;两个七段数码管分别与单片机的P0口和P2口的低七 位I/O数据线相连。数码管采用共阳极的接法,所以需要下拉电阻 来分流。结合软件程序,即可实现4×4键盘的接口及显示的设计。 当按下键盘其中的一个按键时,数码管上会显示出该按键在4×4键 盘上的行值和列值。所以实现了数码管显示按键位置的功能 四、设计思路及原因 对于4×4键盘,共有十六个按键。如果每个按键与单片机的一个引脚相连,就会占用16个引脚,这样会使的单片机的接口不够用(即使够用,也是对单片机端口的极大浪费)。因此我们应该行列式的接法。行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。在这种键若没有按键按下时,单片机从P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。因此0xEX(X表示任意4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X 二、实验内容

程序流程图

程序流程图 编写马磊编写时间2011-07-04 审批审批者姓名(及其职务)审批时间 版本V0.9

1概述 利用计算机进行程序设计时,不仅仅只处理一些简单的数据,在大部分的程序设计里处理的问题还是相当复杂的。对于那些复杂的程序设计,读者不可能直接就能写出程序的源代码,而是要通过一些具体的设计方法(如用程序流程图)把程序设计思想先写出来,然后根据程序流程图编写代码。本章将具体介绍进行程序设计时使用的基本方法和C程序的流程控制。 2程序设计的基本知识 2.1程序流程图 在描述一个程序的基本结构思想时有很多种方法,其中程序流程图是最常用也是最基本的方法。 2.1.1传统程序流程图 传统流程图表示法的特点是用一些图框表示各种类型的操作,用线表示这些操作的执行顺序。美国国家标准化协会ANSI规定了一些常用的流程图符号,现已为世界各国普遍采用。我国也有自己的国家标准GB 1526-89与该标准基本相同,本书就参照ANSI标准做具体介绍。标准中各种图示如图3.1所示。 起止框输入输出框判断框处理框

或 流程线连接点注释框 图 3.1 传统流程图表示法 下面对其中一些主要符号作简要说明: (1)起止框是用来标识程序的开始和结束位置的。规定流程图以起止框开始,以起止框结束。 (2)输入输出框也叫数据框,其中可以注明数据名称、来源、用途或其它的文字说明。 (3)菱形框的作用是对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的操作。 (4)处理框用矩形表示各种处理功能。例如,执行一个或一组特定的操作,从而使信息的值、信息的形式或所在位置发生变化。另外在矩形框内可注明特定处理名称或其简要功能。 (5)流程线用带箭头的直线表示程序的执行顺序。当流程自左向右或自上向下时流程线可以不带箭头,其它情况应加箭头表示流程。 (6)连接点用小圆圈表示将画在不同地方的流程线连接起来。下图中有两个以①为标志的连接点,它表示这两个点是互联在一起的,实际它们是同一个点。这种连接通常用在图形画不下而需要分开画时。

源程序清单流程图(1)

1、程序说明 输入两个8位数据A和B,求|A-B|,结果放在内存中,并输出结果。 2、调试说明 ①在进行循环程序设计时,要注意循环初始化、内外层循环的控制、循环结束条件等的设置对整个程序的执行逻辑要非常清楚。这样可以避免死循环等意外情况的出现。 ②分支程序的控制很重要,编写代码时,要注意注释重要的分支控制部分。这样思路才不会乱。同时要对照流程图,随时观察代码的逻辑思路是否正确。 3、源程序清单和流程图,附执行结果截图。 源程序清单 DA TA SEGMENT DB 'X:$','H',0AH,0DH,'Y:$','H',0AH,0DH,'|X-Y|:$' X DB 0 Y DB 0 Z DB 0 DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START: MOV AX,DA TA MOV DS,AX MOV DX,0 MOV AH,09H INT 21H CALL INPUT MOV X,BL ADD DX,3 MOV AH,09H INT 21H CALL INPUT MOV Y,BL MOV AL,X MOV BL,Y SUB AL,BL MOV Z,AL JC _OUT JMP NEXT _OUT: SUB BL,X MOV Z,BL NEXT: ADD DX,6 MOV AH,09H INT 21H MOV CH,02H LOP: MOV BL,Z CMP CH,02H JB LOP1 ACII码转化为数据 ACII码转化为数据 X-Y>0? Z=Y-X Z=X-Y 数据转化为ACII码 输出Z 结束 存入Y 存入X 开始 否 是 调用子程序 调用子程序 返回 返回 主程序流程图

51单片机矩阵键盘扫描程序

/*----------------------------------------------- 名称:矩阵键盘依次输入控制使用行列逐级扫描 论坛:https://www.sodocs.net/doc/978606590.html, 编写:shifang 日期:2009.5 修改:无 内容:如计算器输入数据形式相同从右至左使用行列扫描方法 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 #define KeyPort P1 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 unsigned char KeyPro(void); void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num,i,j; unsigned char temp[8]; Init_Timer0(); while (1) //主循环 { num=KeyPro();

程序文件流程图

目录 8.2.3.4 a. 质量手册编号 (3) 8.2.3.4 b. 程序文件编号 (3) 8.2.3.4 d. 质量记录编号 (3) 8.2 附图1:组织(及所属部门)制订、发放的文件受控流程图 (4) 8.2 附图2:外来受控文件受控流程图 (5) 8.3.2 质量记录控制流程图 (6) 8.4.2 内部质量审核工作流程图 (7) 8.5.2 6.10 进货检验的不合格品控制程序 (8) 8.5.2 6.10 产品已交付和使用时发现的不合格品控制程序 (9) 8.5.2 产品最终检验的不合格品控制程序流程图 (11) 8.5.2 产品实现过程中不合格品控制程序流程图 (12) 8.6.2 A 类纠正措施流程图 (13) 8.6.2 B 类纠正措施 (15) 8.6.2 C 类纠正措施 (16) 8.7.2 《质量情况通报》的编制、发放、回收、处理 (17) 8.7.2 财务状况预警系统 (18) 8.7.2 预防措施的制订、实施和评价 (19) 8.8.2 管理评审控制程序流程图 (20) 8.9.2 人员招聘录用程序流程图 (21)

8.9.2 培训程序流程图 (22) 8.9.2 考核程序流程图 (23) 8.11.2 产品实现过程策划程序流程图 (24) 8.11.2 策划依据 (25) 8.12.2 产品要求的识别与评审过程 (27) 8.12.2 产品合同修改过程 (28) 8.12.2 市场信息控制过程 (29) 8.13.2 设计和开发控制程序 (30) 8.14.2 采购控制程序流程图 (32) 8.15.2 生产运作程序流程图 (33) 8.17.2 测量和监控策划程序 (34) 8.18.2 体系业绩的测量和监控过程程序 (35) 8.19.2 过程的测量、监控和分析程序流程图 (36) 8.20.2 产品测量和监控程序流程图 (37) 8.21.2 持续改进过程控制程序 (38)

电梯控制程序源代码(带流程图-功能分解、源代码)

《综合电子创新训练》研究报告研究题目:CTS1600-1控制技术综合试验 院系名称: 专业名称: 学生姓名: 指导教师: xxxx年 xx月 xx日 xxxxxxxxxx

目录 第一章绪论 (1) 1.1课题背景与目的 (1) 1.2课题研究方法 (1) 第二章电梯模型硬件设备 (2) 2.1 实验单片机模型与接口定义 (2) 2.1.1 实验用单片机 (2) 2.1.2 单片机接口定义 (3) 2.1.3 I/O接口DATA控制命令表 (4) 2.2 电梯控制命令说明 (6) 2.3 实验用电梯模型 (8) 第三章与电梯模型相关的实验程序 (10) 3.1数码管连续显示 (10) 3.1.1 程序流程图 (10) 3.1.2 功能简介 (10) 3.1.3 功能实现过程 (11) 3.1.4 问题的解决及收获 (11) 3.2 外部按键灯连续闪烁 (12) 3.2.1 程序流程图 (12) 3.2.2 功能简介 (12) 3.2.3 功能实现过程 (12) 3.2.4 问题的解决及收获 (13) 3.3 键、灯、数码管 (14)

3.3.2 功能简介 (14) 3.3.3 功能实现过程 (14) 3.3.4 问题的解决及收获 (15) 3.4 外部按键上下行 (16) 3.4.1 程序流程图 (16) 3.4.2 功能简介 (16) 3.4.3 功能实现过程 (17) 3.4.4 问题的解决及收获 (18) 3.5 计算器 (19) 3.5.1 程序流程图 (19) 3.5.2 功能简介 (21) 3.5.3 功能实现过程 (21) 3.5.4 问题的解决及收获 (22) 3.6 密码锁 (23) 3.6.1程序流程图 (23) 3.6.2功能简介 (23) 3.6.3实现功能过程 (24) 3.6.4问题的解决及收获 (24) 3.7逐层停自动开关门循环 (25) 3.7.1程序流程图 (25) 3.7.2功能简介 (27) 3.7.3实现功能过程 (27) 3.7.4问题的解决及收获 (27) 3.8 可记录顺序逐层停自动开关门 (28)

单片机流程图

单片机总流程图

主函数程序 #include #include #define uchar unsigned char #define uint unsigned int #define OSC_FREQ 12000000 #define __10ms (65536 - OSC_FREQ/(12000000/9970)) #define COM8255 XBYTE[0XFFF3] #define PA8255 XBYTE[0XFFF0] #define PB8255 XBYTE[0XFFF1] #define PC8255 XBYTE[0XFFF2] uchar code tab[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; uchar code dis_HELLO[]={0x89,0x86,0xc7,0xc7}; uchar code dis_op51[]={0xc0,0x8c,0x92,0xf9}; uchar code dis_code[]={0xcf,0xa4,0xcf,0xa4}; uchar ucCnt_10ms=99; uchar i=0; uchar J=0; uchar n=0; uchar led1; uchar led2; sbit P2_4=P2^4; sbit P3_7=P3^7; sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; void Disp_op51 (); void Disp_HELLO(); void Set_Init_Xint(); void Set_Init_Timer(); void Disp_t(); void DelayX1ms(uint count); void Disp_8255(); void main() { for(;;) { Set_Init_Xint(); Set_Init_Timer(); Disp_8255(); //ucCnt_10ms =99; //ucLed1 = 6; //ucLed2 = 8;

实验七 单片机键盘LED显示实验

实验七单片机键盘LED显示实验 一、实验目的 1、掌握键盘和LED显示器的接口方法和编程方法。 2、掌握键盘扫描和LED八段码显示器的工作原理。 3、学习并口扩展的程序编写方法。 二、实验说明 利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。 实验程序可分成三个模块。 ①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。 ②显示模块:将显示单元的内容在显示器上动态显示。 ③主程序:调用键输入模块和显示模块。 三、实验仪器 计算机 伟福实验箱(lab2000P ) 四、实验内容 1、本实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。地址中的X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如将KEY/LED CS信号接CS0上,则列扫描地址为08002H,行码地址为08001H。列扫描码还可以分时用作LED的位选通信号。 2、本实验仪提供了6 位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码、6位位码是由两片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相应显示位。 3、本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。此处X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如,将KEY/LED CS 接到CS0上,则段码地址为08004H,位码地址为08002H。 五、思考题 1、按键接收到的数据加1显示出来; 2、实现第2功能键,即按下A后,再按下0-9键为加1显示; 3、保存前一个接收到的数据,数据向前推动显示。 六、源程序修改原理及其仿真结果 原程序: OUTBIT equ 08002h ; 位控制口 OUTSEG equ 08004h ; 段控制口 IN equ 08001h ; 键盘读入口 LEDBuf equ 60h ; 显示缓冲 ljmp Start

用单片机控制交通灯源程序代码及流程图

用单片机控制交通灯 传统的交通灯控制电路一般由数字电路构成,电路复杂、体积大、成本高。采用单片机控制交通灯不但可以解决上述问题,而且还具有时间显示功能,非常方便。下面介绍一种用单片机控制交通灯的方法。 一、硬件硬件电路如附图。AT89C2051的P1.7~P1.5和P1.3~P1.1直接驱动红、黄、绿灯,利用单片机的串口和二片74LS164串/并转换移位寄存器实现时间显示,七段数码管为共阴管,硬件电路极为简单。 二、软件交通灯有红、黄、绿三种。红灯亮,停止通行;绿灯亮,允许通行;黄灯亮,作过渡。红灯亮60秒,绿灯亮55秒,黄灯亮5秒。每组灯的亮暗状态以2分钟为周期循环,故程序采用主、子程序方式,循环结构。另外,为了简化电路,红、黄、绿灯采用低电平点亮。 源程序清单如下: ORG0000H START:MOVDRTR,#TAB MOVSCON,#00H MOVP1,#6CH;点亮红、绿灯 MOVR0,#0;R0清零 LEFT:INCR0 CJNER0,#55,LP0;R0<55,转LP0 MOVP1,#6AH;R0=55,点亮红、黄灯 LJMPLP1 LP0:CJNER0,#60,LP1;R0<60,转LP1 MOVP1,#0C6H;R0=60,点亮绿、红灯 LJMPRIGHT LP1:LCALLDBDB LCALLDISP LJMPLEFT;20H为1,转LEFT RIGHT:DECR0 CJNER0,#5,LP2;R0>0,转LP2 MOVP1,#0A6H;R0=5,点亮黄、红灯 LJMPLP3 LP2:CJNER0,#0,LP3 MOVP1,#6CH;R0=0,点亮红、绿灯 LJMPLEFT LP3:LCALLDBDB

按键处理程序 C语言 单片机

分享一种按键处理程序(用C) //头文件定义: Ustruct KEY { Uchar Val; #define Key_Model_C 0 //按键1值 #define Key_AddVal_C 1 //按键2值 Uint ScanOnTime; Uchar LongKeyState; Uchar LongKeyRestState; Uchar SetInRn; Uchar Model; //按键状态(模式) #define Off_C 0 //之前未按下 #define On_C 1 //现按下 #define Delay_C 2 //按键处理后标志 }Key; //----------------定义两个IO输入口为按键入口--------------------// #define KeyMo_Bin (GPIOB->IDR.Bit.B5) #define KeyAdd_Bin (GPIOB->IDR.Bit.B6) /*===============================================================*/ GPIO_Init(GPIO_Pin_5|GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); //初始化为上拉输入无中断 /*===============================================================*/ //主程序大循环中每1毫秒扫描1次 void KeyScan(void) { if(Key.LongKeyRestState == 1) //长按键标志(复位处理长按键) { if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1)) //当两按键均抬起 { if(++Key.ScanOnTime >= 130) //延时后复位 { Key.LongKeyRestState=0; Key.Model=Delay_C; } } else Key.ScanOnTime=0; return; } if(Key.Model == Off_C) //如果当前按键状态为未按下“Off_C” { if((KeyMo_Bin == 0) || (KeyAdd_Bin == 0))//按键1或按键2已按下(低有效) { if(++Key.ScanOnTime >= 10) //当按下后自加1,加够10次即1ms*10=10ms去抖动

相关主题