/*
为自已写的独立键盘扫描+蜂鸣器响+数码管
犯的错: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单片机开发板:数码管动态扫描程序,显示静态效果
推荐阅读
史海拾趣
使用MC34063设计DC-DC变换器 参数要求如下; 1 交流输入15V 2 直流输出3~12V可调3 效率70%以上 4 输出纹波小于200mV 5 最大输出电流 500mA 且带过流保护。。 请把懂得的发上来,谢谢拉!!… 查看全部问答∨ |
|
就是我的wince设备在被别的蓝牙设备(如蓝牙手机)搜索到的时候会有一个名称, 我现在想再本地去修改这个名称,该怎么做啊? 看了 MSDN 关于蓝牙这块的东西,始终没有找到,google也没有相关的介绍,求大家帮忙, 给个提示也行啊!… 查看全部问答∨ |
|
大家好,第一次发帖。 最近在编写WinCE6.0下的驱动程序,想要在驱动程序中直接对文件进行操作,而不想在用户程序中读文件再用WriteFile或DeviceIOControl将数据传到驱动程序中,但没找到对应的API,求高手指导。谢谢了… 查看全部问答∨ |
软件平台:wince6.0 硬件平台:UT-S3C6410开发板 我做了个控制音量的系统托盘程序,但是我向往窗口风格像XP下的那样,有立体的感觉 可是我的风格却只能这样,扁平的窗口 http://i3.6.cn/cvbnm/be/fb/90/8de0ce4c7163006c7feb4f5526a0ffc6.j ...… 查看全部问答∨ |
请教2440的camera 驱动中Display_Cam_Image中用memcpy将P模式DMA buffer中拷到LCD 显示buffer中 memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2); 1,2参数都是物理地址--WHY??? 为什么 ...… 查看全部问答∨ |
|
设计资源 培训 开发板 精华推荐
- 新突破!超高速内存,为英特尔至强6性能核处理器加速
- 将vRAN站点整合至单服务器,助力运营商降低总体拥有成本
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?