![]() |
![]() |
![]() 初始顯示字母示例程序 #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 } |