招工做哪个网站,如何看网站做没做推广,wordpress 婚庆,商丘网红打卡地以下通过8051实现密码锁的简单程序#xff0c;并无实用价值#xff0c;重在记录8051单片机编程的一些重要算法。led数码管#xff1a;8位共阳型数码管#xff1b;段码锁存器采用74HC245#xff1a;8051与74HC245、LED的连接电路图如下#xff1a;位码锁存器采用74HC138并无实用价值重在记录8051单片机编程的一些重要算法。led数码管8位共阳型数码管段码锁存器采用74HC2458051与74HC245、LED的连接电路图如下位码锁存器采用74HC1388051与74HC138、LED的连接电路图如下8051与矩阵键盘的连接电路图如下74HC138芯片的真值表如下根据以上电路图和74HC138芯片的真值表可以确定出sec_table、pos_table、key_table、err_table、open_table的取值。#include reg51.h #include string.h #define SEC P0 #define KEY P1 #define POS P2 #define TIMER0_RELOAD_HIGH 0xFC #define TIMER0_RELOAD_LOW 0x18 #define POS_SIZE 8 unsigned char code sec_table[] {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; unsigned char code pos_table[] {0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C}; // 注意看74HC138与8051之间的连接电路图。 unsigned char data pos_num[POS_SIZE] {0}; unsigned char code key_table[] {0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}; unsigned char code err_table[] {0x72, 0x72, 0x79}; unsigned char code open_table[] {0x37, 0x79, 0x73, 0x3F}; void delay_10us(unsigned char us) { while (--us); /* 12M晶振--us等于10微秒。 */ } void delay_ms(unsigned char ms) { while (ms--) { delay_10us(100); } } void t0int_s(void) { TMOD 0x01; /* TMOD寄存器定时器位数为16位。 */ TH0 TIMER0_RELOAD_HIGH; /* TH0寄存器。 */ TL0 TIMER0_RELOAD_LOW; /* TL0寄存器。 */ EA 1; /* IE寄存器允许所有中断。 */ ET0 1; /* IE寄存器允许定时器0中断。 */ TR0 1; /* TCON寄存器开始触发定时器0中断。 */ } void t0int_z(void) interrupt 1 { static unsigned int i 0; TH0 TIMER0_RELOAD_HIGH; TL0 TIMER0_RELOAD_LOW; SEC 0; POS pos_table[i]; SEC pos_num[i]; i; if (i POS_SIZE) { i 0; } } unsigned char keys(void) { unsigned char keyz 0xFF; KEY 0x0F; if (KEY ! 0x0F) { delay_ms(10); KEY 0x0F; switch (KEY) // 确定列。 { case 0x07: keyz 1; break; case 0x0B: keyz 2; break; case 0x0D: keyz 3; break; case 0x0E: keyz 4; break; } KEY 0xF0; switch (KEY) // 确定行。 { case 0x70: break; case 0xB0: keyz 4; break; case 0xD0: keyz 8; break; case 0xE0: keyz 12; break; } while (KEY ! 0xF0); } return keyz; } void main(void) { static signed char i POS_SIZE - 1; unsigned char num 0; t0int_s(); while (1) { num keys(); if (num 0x0A) { num % 0x0A; pos_num[i--] sec_table[num]; if (i 0) { i POS_SIZE - 1; } } else if (num 0x10 ) { if ( memcmp(pos_num, key_table, sizeof(pos_num) ) 0 ) { memset( pos_num, 0, sizeof(pos_num) ); memcpy( pos_num, open_table, sizeof(open_table) ); } else { memset( pos_num, 0, sizeof(pos_num) ); memcpy( pos_num, err_table, sizeof(err_table) ); } i POS_SIZE - 1; } } }程序功能按下是s1~s10输入8位0~9的任意数字当按下s11~s16的任何键时将校验密码是否正确如果正确则在数码管输出OPEN字样如果失败则在数码管输出Err字样。重要函数说明1、led数码管显示采用定时器中断程序实现输出段码参见t0int_z函数2、矩阵键盘使用线翻转扫描方法参见keys函数