/*
为自已写的独立键盘扫描+蜂鸣器响+数码管
犯的错:unsigned密写成了unsigner一直提示找不到a,b
PORTD0=1;不行,要写成PORTD=0x01;才可以,经实验证得没有PORTD0没这个东西,应为RD0=1;
PORTD=0x03;不是第三个灯亮,而是0000 0011是两个灯亮
PORTD=0x8则是0000 1000是第4个灯亮。。。。。出错因原进制转化,刚开始写程序进制转化混掉了。
*/
#include #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管数组 uchar key_num; void delay(uint x) //延时函数 { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void scan(); //扫描键盘函数 声明 void didi(uchar num); //蜂鸣器响 函数 声明 void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6,uchar num7); //数码管显示 声明 //----------------------------------------------------------------------------------- void init() //初始化函数 { TRISA=0x00; TRISB=0xff; TRISC=0X00; TRISD=0x00; TRISE=0x00; PORTC=0Xff; PORTD=0x00; } //-------------------主函数----------------------------------------------------------- void main() { init (); while(1) { scan(); //扫描键盘 disp(key_num,2,3,4,5,6,7,8); //后面的直接传给数码管而第一个是几,我们要用键盘来检测,则第一个变量由key_num } } //------------------------------------------------------------------------------------- void didi(uchar num) //蜂鸣器函数,num响几声 { uchar di_num; //di_num响几声 for(di_num=num;di_num>0;di_num--) { RE0=1; delay(100); RE0=0; delay(50); } } void scan() { if(RB0==0) { delay(10); if(RB0==0) { didi(1); while(!RB0); // PORTD=0x01; //若写成RD0=1;也可,不过呢,会出现灯亮了之后不会灭掉,还得加清零(灭灯) key_num=1; } } if(RB1==0) { delay(10); if(RB1==0) { didi(2); while(!RB1); // PORTD=0x02; key_num=2; } } if(RB2==0) { delay(10); if(RB2==0) { didi(3); while(!RB2); // PORTD=0x04; key_num=3; } } if(RB3==0) { delay(10); if(RB3==0) { didi(4); while(!RB3); // PORTD=0x08; key_num=4; } } } //---------------------------数码管显示函数,数组------------------------------------------------ void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6,uchar num7) { PORTD=table[num0]; PORTA=0x00; //第一个数码管选通 delay(2); //延时,显示2ms PORTD=table[num1]; PORTA=0x02; //第二个数码管选通 delay(2); //延时,显示2ms PORTD=table[num2]; PORTA=0x04; //第三个数码管选通 delay(2); //延时,显示2ms PORTD=table[num3]; PORTA=0x06; //第四个数码管选通 delay(2); //延时,显示2ms PORTD=table[num4]; PORTA=0x08; //第五个数码管选通 delay(2); //延时,显示2ms PORTD=table[num5]; PORTA=0x0A; //第六个数码管选通 delay(2); //延时,显示2ms PORTD=table[num6]; PORTA=0x0c; //第七个数码管选通 delay(2); //延时,显示2ms PORTD=table[num7]; PORTA=0x0e; //第八个数码管选通 delay(2); //延时,显示2ms }
上一篇:PIC单片机温感器DS18B20 C语言程序代码
下一篇:PIC单片机开发板:数码管动态扫描程序,显示静态效果
推荐阅读最新更新时间:2024-11-13 14:10
设计资源 培训 开发板 精华推荐
- 使用 Richtek Technology Corporation 的 RT7279 的参考设计
- LTC3603IMSE 1.8V、2.5A 降压稳压器(1MHz、突发模式操作)的典型应用电路
- 【ART-Pi】直流无刷电机FOC驱动
- 使用 Asahi Kasei Microdevices Corporation 的 AK4551VT 的参考设计
- ZR431FTA 可调精密齐纳并联稳压器的典型应用
- 【ART-Pi】电压电流表
- LTC1773 的典型应用 - 同步降压型 DC/DC 控制器
- 【航顺训练营】航顺hk32开发板
- AD8350AR20-EVAL,评估板经过精心布局和测试,以展示器件 AD8350 的指定高速性能
- LT3992A 演示板、单片双通道跟踪 3A 降压型开关稳压器