|
1、Proteus原理图:
2、C程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define GPIO_KEY P1
- #define weixuan P2
- //0~F的共阳数码管段码,最后一个是黑屏
- const uchar SEG_CODE[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
- sbit wei1=P2^0;
- sbit wei2=P2^1;
- uchar ge,shi,KeyValue,j,b;
- uchar temp,temp1;
- uchar flag=0;
- /*****延时函数*****/
- void delay1ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=112;y>0;y--); //12M晶振下,延时1MS
- }
- /*****初始化函数*****/
- void InitUART(void)
- {
- TMOD=0x20;
- SCON=0x50;
- TH1=0xFD;
- TL1=TH1;
- PCON=0x00;
- EA=1;
- ES=1;
- TR1=1;
- }
- /*****串口通信中断*****/
- void send(uchar x)
- {
- SBUF=x;
- while(TI==0);
- TI=0;
- }
- /*****显示函数*****/
- void xianshi(uchar k)
- {
- ge=k%10;
- shi=k/10;
- if(k>9)
- {
- weixuan=0x02;
- P0=SEG_CODE[ge];
- send(shi+48);
- delay1ms(10);
- weixuan=0x01;
- P0=SEG_CODE[shi];//十位段码,显示
- send(ge+48);
- delay1ms(10);
- }
- else
- {
- weixuan=0x02;
- P0=SEG_CODE[ge];//个位段选
- send(ge+48);
- delay1ms(10);
- }
- }
- /***键盘扫描函数***/
- uchar keyscan()
- {
- char a=0;
- GPIO_KEY=0x0f; //P1口值准备
- if(GPIO_KEY!=0x0f)
- {
- delay1ms(10); //延时消抖
- if(GPIO_KEY!=0x0f)//再次判断
- {
- GPIO_KEY=0x0f; //再次装值准备
- switch(GPIO_KEY) //测试行
- {
- case(0x07):KeyValue=0;break;
- case(0x0b):KeyValue=1;break;
- case(0x0d):KeyValue=2;break;
- case(0x0e):KeyValue=3;break;
- }
- GPIO_KEY=0xf0; //高四位赋1,判断准备 HIGH FOUR BIT GET VERTICAL
- switch(GPIO_KEY) //测试行
- {
- case(0x70):KeyValue=KeyValue;break;
- case(0xb0):KeyValue=KeyValue+4;break;
- case(0xd0):KeyValue=KeyValue+8;break;
- case(0xe0):KeyValue=KeyValue+12;break;
- }
- while((GPIO_KEY!=0x0f)&&(a<10)) //判断是否松手,假若没有松手
- //一段延时后依旧判断松手完成
- {
- delay1ms(1);
- a++;
- }
- a=0;
- }
- }
- return KeyValue;
- }
- /*****主函数*******/
- void main()
- {
- InitUART();
- while(1)
- {
- b=keyscan();
- xianshi(b);
- }
- }
复制代码
3、Proteus仿真图示例:
4、串口精灵仿真接收数据示例:
单片机参数设置:
串口参数设置:
串口精灵仿真运行:
5、顺便附上案例文件(能正常运行)
4X4按键串口通信.rar
(55.64 KB, 下载次数: 88)
|
评分
-
查看全部评分
|