![]() |
![]() 初始显示字母示例程序 #include <reg52.h> #define uint unsigned int //宏定义无符号整型数据 #define uchar unsigned char //宏定义无符号字符型数据 sbit P_HC595_SER = P2^0; sbit P_HC595_SRCLK = P2^1; sbit P_HC595_RCLK = P2^2; uchar code table[]={//共阴数码管段码"0~H" 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, // A B C D E F G H 0x77,0x7C,0x39,0x5E,0x79,0x71,0x3d,0x76}; uchar code dis_buf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码 uchar buf[8]; uchar key=0; //定义键值全局变量 void keyscan() //按键扫描程序 { static bit sign=0; //按键有效标志 static uint count=0; //消抖计数变量 uchar num=0; //临时变量 P3=0xf0; //赋值P3 1111 0000 if(P3!=0xf0) //检测有按键按下 { count++; //消抖计数 if((count>=500)&&(sign==0))//100~1000,根据主循环周期调整约10~20ms { sign=1; //按键有效标志置1 num=P3; //保存P3值xxxx 0000,x为0或1 num|=0x0f; //保存num按位或0x0f值xxxx 1111 P3=num; //赋值P3 xxxx 1111 num=P3; //保存P3值xxxx xxxx switch(num) { case 0xee: key= 1; break; case 0xde: key= 2; break; case 0xbe: key= 3; break; case 0x7e: key= 4; break; case 0xed: key= 5; break; case 0xdd: key= 6; break; case 0xbd: key= 7; break; case 0x7d: key= 8; break; case 0xeb: key= 9; break; case 0xdb: key=10; break; case 0xbb: key=11; break; case 0x7b: key=12; break; case 0xe7: key=13; break; case 0xd7: key=14; break; case 0xb7: key=15; break; case 0x77: key=16; break; } } } else //键抬起 { sign=0; //按键有效标志清0 count=0; //消抖计数清0 } } /**************** 向HC595发送一个字节函数 ******************/ void Send_595(uchar dat) { uchar i; for(i=0;i<8;i++) { dat <<= 1; P_HC595_SER = CY; //溢出位赋值数据输出端 P_HC595_SRCLK = 1; //移位时钟 P_HC595_SRCLK = 0; } } /**************** 向HC595发送2个字节函数 ******************/ void DisplayScan() { static uchar j; Send_595(dis_buf[j]);//向HC595发送位码 Send_595(table[buf[j]]);//向HC595发送段码 P_HC595_RCLK = 1;//锁存输出数据 P_HC595_RCLK = 0; if(++j==8) j=0; } void main() //主函数 { uchar i; P_HC595_SRCLK = 0;//初始化移位时钟端 P_HC595_RCLK = 0;//初始化锁存输出端 while(1) { keyscan(); //按键扫描程序 if(key==0) { buf[0]=10; buf[1]=11; buf[2]=12; buf[3]=13; buf[4]=14; buf[5]=15; buf[6]=16; buf[7]=17; } else { buf[0]=0; buf[1]=0; buf[2]=0; buf[3]=0; buf[4]=0; buf[5]=0; buf[6]=key/10; buf[7]=key%10; } if(++i>=100) { i=0; DisplayScan(); //发送2个字节 } } } |
无标题1.jpg (228.24 KB, 下载次数: 45)
/************* IO口定义 **************/ sbit P_HC595_SER = P2^5; //SER data input sbit P_HC595_RCLK = P2^6; //RCLk store (latch) clock sbit P_HC595_SRCLK = P2^7; //SRCLK Shift data clock unsigned char code t_display[]={ //段码标准字库 // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, // 不显 - H J K L N o P U t G Q r M y 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e, // 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码 /**************** 向HC595发送一个字节函数 ******************/ void Send_595(u8 dat) { u8 i; for(i=0; i<8; i++) { dat <<= 1; P_HC595_SER = CY; P_HC595_SRCLK = 1; P_HC595_SRCLK = 0; } } /********************** 显示扫描函数 ************************/ void DisplayScan(void) { Send_595(~LED_TYPE ^ T_COM[display_index]); //输出位码 Send_595( LED_TYPE ^ t_display[LED8[display_index]]); //输出段码 P_HC595_RCLK = 1; P_HC595_RCLK = 0; //锁存输出数据 if(++display_index >= 8) display_index = 0; //8位结束回0 } |