作业4:独立按键+数码管操作
文章目录1、测试代码照片2、流水灯3、独立按键点亮4个灯4.独立按键视频点亮8个灯5、数码管显示“111111”6、1234567、11.12.138、HH8800.1、测试代码照片2、流水灯#include reg51.h #define uchar unsigned char void delay(unsigned int time) { unsigned int i, j; for (i 0; i time; i) for (j 0; j 120; j); } uchar code table[] { // 加 code 关键字将数组存储在 ROM 中节省 RAM 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F }; void main() { uchar i; while(1) { for(i 0; i 8; i) { P1 table[i]; // 修正为 P1 delay(200); } } }3、独立按键点亮4个灯独立按键点亮4个灯#include REGX51.H // 定义按键按下为低电平 sbit KEY1 P3^4; sbit KEY2 P3^5; sbit KEY3 P3^6; sbit KEY4 P3^7; // 定义 LED低电平点亮仅保留 D1, D3, D5, D7 sbit LED1 P1^0; // D1 sbit LED3 P1^2; // D3 sbit LED5 P1^4; // D5 sbit LED7 P1^6; // D7 // 延时函数12MHz晶振下约1ms void delay_ms(unsigned int ms) { unsigned int i, j; for(i 0; i ms; i) for(j 0; j 123; j); } void main() { P1 0xFF; // 所有LED初始熄灭低电平点亮写1熄灭 while(1) { // 检测 KEY1 → 控制 D1 if(KEY1 0) { delay_ms(10); // 消抖 if(KEY1 0) { LED1 ~LED1; // 翻转D1 while(!KEY1); // 等待按键松开 } } // 检测 KEY2 → 控制 D3 if(KEY2 0) { delay_ms(10); if(KEY2 0) { LED3 ~LED3; while(!KEY2); } } // 检测 KEY3 → 控制 D5 if(KEY3 0) { delay_ms(10); if(KEY3 0) { LED5 ~LED5; while(!KEY3); } } // 检测 KEY4 → 控制 D7 if(KEY4 0) { delay_ms(10); if(KEY4 0) { LED7 ~LED7; while(!KEY4); } } } }4.独立按键视频点亮8个灯独立按键点亮8个灯5、数码管显示“111111”6、1234567、11.12.138、HH8800.HH8800.#include reg52.h #define uchar unsigned char sbit dula P2^6; // 段选锁存 sbit wela P2^7; // 位选锁存 // 段码表共阴极0-9 及字母 H // 段码顺序dp g f e d c b a 高位到低位 uchar code TableDula[] { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x76 // H (b c e f g 段亮: 0111 0110 0x76) }; // 位码表低电平选中第1-6位 uchar code TableWela[] { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF }; // 每位显示的数字/字母索引0-9对应数字10对应H uchar code DisplayNum[] { 10, // 第1位H 10, // 第2位H 8, // 第3位8 8, // 第4位8 0, // 第5位0 0 // 第6位0将带小数点 }; // 各位是否需要小数点1表示需要0表示不需要 uchar code DisplayDot[] { 0, // 第1位无小数点 0, // 第2位无小数点 0, // 第3位无小数点 0, // 第4位无小数点 0, // 第5位无小数点 1 // 第6位显示小数点 }; void delay(uchar x) { uchar j; while(x--) { for(j 0; j 125; j); } } void main() { uchar i; while(1) { for(i 0; i 6; i) { P0 0x00; // 清空数据总线 dula 0; wela 0; // 1. 送位码选择当前位 P0 TableWela[i]; wela 1; wela 0; // 2. 送段码数字 可选小数点 P0 TableDula[DisplayNum[i]]; if(DisplayDot[i]) { P0 | 0x80; // 点亮小数点共阴极小数点段为最高位 } dula 1; dula 0; delay(2); // 延时保持亮度 } } }