刷卡機顯示應答碼lk
網上關于刷卡機顯示應答碼lk的刷卡知識比較多,也有關于刷卡機顯示應答碼lk的問題,今天第一pos網(yadikedp.com)為大家整理刷卡常見知識,未來的我們終成一代卡神。
本文目錄一覽:
刷卡機顯示應答碼lk
學習目的了解數碼管分類、工作原理及驅動電路的設計。掌握STC8A8K64D4系列單片機驅動8位共陰數碼管的動態顯示的軟件設計。數碼管概述數碼管是一種常用的顯示設備,他有著價格便宜、使用簡單的特點,在各個領域被廣泛的應用,如空調、電子萬年歷、冰箱等等。學習數碼管相關的編程之前,我們有必要了解一下數碼管的一些概念和操作方式。
數碼管也稱LED數碼管(led Segment Displays),其是由多個發光二極管封裝在一起組成。
數碼管的“段”常用的數碼管有七段數碼管和八段數碼管,如下圖所示。7段數碼管由七個條狀發光二極管組成,8段數碼管由七個條狀和一個點狀發光二極管,即8段數碼管比7段數碼管多一個發光二極管單元(多一個小數點)。如果需要顯示帶小數的數據,應選用8段數碼管。開發板上使用的是8段數碼管。
圖1:8段數碼管比7段數碼管
數碼管的“位”數碼管按能顯示多少個“8”可分為1位、2位、4位等數碼管,如下圖所示。開發板上使用的是8位數碼管。
圖2:數碼管
共陰極和共陽極數碼管數碼管按發光二極管單元連接方式分為共陰極數碼管和共陽極數碼管,如下圖所示。
圖3:共陽極和共陰極數碼管
共陽極:正極連接在一起,作為公共端。負極單獨控制,施加低電平(邏輯0),對應的“段”點亮,施加高電平(邏輯1),對應的“段”熄滅。共陰極:負極連接在一起,作為公共端。正極單獨控制,施加低電平(邏輯0),對應的“段”熄滅,施加高電平(邏輯1),對應的“段”點亮。位選和段選一般地,操作數碼管時,先執行段選再執行位選。位選是選擇待操作的數碼管,如開發板上的是8位數碼管,位選就是選擇8位數碼管中的某一個。段選是選擇數碼管里面的LED燈,即通過選擇點亮響應的LED燈以達到顯示需要的數據的目的。
段碼數碼管的段碼指的是數碼管在顯示不同的數據時,段選信號對應的二進制數據。下圖是以8段共陰極數碼管顯示數字7為例來描述段碼。
圖4:共陰極數碼管顯示數字7時的段碼
對于共陰極數碼管來說,段的正極為高電平“邏輯1”時,段點亮,段的正極為低電平“邏輯0”時,段熄滅。如要顯示數字“7”,需要點亮段A、段B和段C,8個段的負極對應的二進制數據為11100000,換算成16進制即為0xE0。如果是共陽極數碼管,正好和共陰極數碼管相反,8個段的正極對應的二進制數據為00000111,換算成16進制即為0x07。
由此,我們即可得出共陰極數碼管顯示的段碼表,如下表所示。
表1:共陰極數碼管顯示的段碼表
字形
A
B
C
D
E
F
G
DP
段碼(共陰)
0
1
1
1
1
1
1
0
0
FC H
1
0
1
1
0
0
0
0
0
60 H
2
1
1
0
1
1
0
1
0
DA H
3
1
1
1
1
0
0
1
0
F2 H
4
0
1
1
0
0
1
1
0
66 H
5
1
0
1
1
0
1
1
0
B6 H
6
1
0
1
1
1
1
1
0
BE H
7
1
1
1
0
0
0
0
0
E0 H
8
1
1
1
1
1
1
1
0
FE H
9
1
1
1
1
0
1
1
0
F6 H
A
1
1
1
0
1
1
1
0
EE H
B
0
0
1
1
1
1
1
0
3E H
C
1
0
0
1
1
1
0
0
9C H
D
0
1
1
1
1
0
1
0
7A H
E
1
0
0
1
1
1
1
0
9E H
F
1
0
0
0
1
1
1
0
8E H
小數點
0
0
0
0
0
0
0
1
01 H
不顯示
0
0
0
0
0
0
0
0
00 H
動態顯示和靜態顯示數碼管的驅動顯示方式有多種,大致可分為動態顯示和靜態顯示。
動態顯示其實就是利用LED的余輝效應和人眼的視覺暫留效應來實現的。動態顯示方式外圍驅動電路相對簡單,占用單片機I/O較少,但是需要不斷刷新數碼管顯示,因此,占用CPU時間較長。
靜態顯示是單片機發送數據之后,數據如何穩定有效的顯示由外圍鎖存器件實現,這樣可以大幅降低占用CPU的時間,但他會占用更多的I/O,并且外圍驅動電路也相對復雜。
硬件設計IK-64D4開發板上設計了8位共陰極數碼管顯示電路,該顯示電路中使用74HC138譯碼器實現數碼管的位選,74HC595芯片實現數碼管的段選,電圖原理圖如下。
圖5:數碼管顯示電路
數碼管顯示電路占用的STC8A8K64D4的引腳如下表:
表2:引腳分配
名稱
引腳
說明
SCK
P3.2
和顯示屏接口共用
SI
P3.4
和顯示屏接口共用
RCK
P3.5
和顯示屏接口共用
A0
P4.0
和顯示屏接口共用
A1
P5.5
和顯示屏接口共用
A2
P4.4
和顯示屏接口共用
數碼管段選的實現數碼管的段選是通過74HC595芯片實現的,74HC595是一個8位串行輸入、并行輸出的位移緩存器。數碼管顯示電路中,為了節省GPIO,74HC595的使能控制端在硬件上設置為恒有效(/OE連接到GND,恒為低電平)。74HC595的Q0~Q7 八位數據并行輸出端并接到8個數碼管的段選信號線上,這樣,使用3個GPIO就可以向數碼管發送段選信號。這3個GPIO各自的作用如下表所示。
表3:74HC595驅動信號
GPIO
連接(74HC595)
描述
P3.4
SI
發送串行數碼管段選數據,經74HC595轉為8位并行數據向數碼管提供段選信號。
P3.2
SCK
產生數據移位時鐘,上升沿時數據寄存器的數據移位,Q0→Q1→Q2→Q3→...→Q7,下降沿移位寄存器數據不變。
P3.5
RCK
產生數據鎖存時鐘,上升沿時將8 位鎖存移位寄存器中的狀態值并行輸出,下降沿時存儲寄存器數據不變。
傳輸段碼時,單片機的P3.4輸出8位串行段碼數據,每傳輸一個數據位,P3.2產生一個上升沿時鐘將數據移位,8個上升沿移位時鐘后,8位段碼數據傳輸完成,之后,P3.5產生一個上升沿,段碼數據并行輸出,由此,完成數碼管的段選。
數碼管位選的實現數碼管顯示電路使用74HC138譯碼器產生位選信號,同樣,為了節省GPIO,74HC138的使能控制端在硬件上均設置為恒有效(E1、E2連接GND,恒為低電平;E3連接VCC,恒為高電平)。因此,程序中操作數碼管時只需控制三個地址數據輸入端(A0、A1、A2)去選中8個數碼管中的待操作的數碼管即可。
三個地址數據輸入端(A0、A1、A2)是如何選中8個數碼管中的一個的,這就要看74HC138譯碼器的真值表了(74HC138譯碼器的真值表如下圖所示)。
H:高電平 L:低電平 X:任意電平
圖6:74HC138真值表
由74HC138譯碼器的真值表可以看出,當74HC138使能后,A0、A1、A2的輸入電平決定了Y0~Y7的輸出(低電平有效),而且從Y0到Y7是和A2、A1、A0的值對應的,因此,當我們需要Y0~Y7中某個輸出端輸出低電平時,輸入端A2、A1、A0輸入對應的數值即可,如需要Y1輸出低電平,則A2、A1、A0輸入為001(16進制:0x01)即可。電路中的8個數碼管是共陰極數碼管,8個數碼管的公共端依次連接到了Y7~Y0,由此,通過A0、A1、A2的“邏輯值”即可完成對待操作的數碼管的位選。
說明:開發板為了布線方便,8個數碼管中的第1位連接到Y7,第2位連接到Y6,以此類推,這一點,在編程程序的時候需要注意一下。軟件設計數碼管動態顯示程序結構對于數碼管動態顯示來說,主要考慮的有兩個方面:數碼管刷新和顯示數據更新。
數碼管刷新:因為是動態顯示,所以要不斷刷新數碼管,利用人眼的視覺暫留效應實現數碼管的顯示,并且刷新的速度不能過慢,否則,顯示會有閃爍。數碼管顯示內容的更新:8位數碼管中每位數碼管都可以單獨更新數據。數碼管動態顯示驅動程序設計的方法很多,下面是一種基于定時器刷新的方法,供讀者借鑒。
數碼管驅動程序原理如下圖所示,定義一個數組,該數組共有8個元素,分別用于保存8位數碼管的段碼,即數組中第1個元素用于保存8位數碼管中第1位數碼管的段碼,第2個元素用于保存第2位數碼管的段碼,以此類推。
使用一個定時器用于刷新數碼管顯示,在定時器中斷服務函數中從數組中取數碼管的段碼,完成對數碼管顯示的刷新。這樣,當我們需要修改數碼管顯示內容時,只需要修改數組中的段碼即可。
圖7:數碼管軟件驅動原理
定時器刷新數碼管顯示的流程圖如下,每次進入定時器中斷服務函數后刷新8位數碼管中的一位。這里,定義一個變量“ledseg_nod”用于記錄數碼管的位,每次刷新后“ledseg_nod”加1,到達8時,表示8位數碼管全部刷新,“ledseg_nod”的值設置為0,開始新一輪刷新。
圖8:定時器刷新數碼管流程
數碼管顯示實驗注:本節的實驗是在“實驗2-6-1:串口1數據收發實驗”的基礎上修改,本節對應的實驗源碼是:“實驗2-12-1:數碼管顯示實驗”。實驗內容通過4個輕觸按鍵KEY1~KEY4控制數碼管顯示內容,KEY1控制第1個和第2個數碼管,KEY2控制第3個和第4個數碼管,KEY3控制第5個和第6個數碼管,KEY4控制第7個和第8個數碼管。
程序復位運行后,8個數碼管全部顯示數字0,每按動一次按鍵,該按鍵控制的數碼管顯示內容加1,加到F后再次按動按鍵返回數字0,如此反復。
代碼編寫新建一個名稱為“ledseg.c”的文件及其頭文件“ledseg.h”并保存到工程的“Source”文件夾,并將“ledseg.c”加入到Keil工程中的“SOURCE”組。引用頭文件因為在“main.c”文件中使用了“ledseg.c”文件中的函數,所以需要引用下面的頭文件“ledseg.h”。
代碼清單:引用頭文件
//引用數碼管的頭文件 #include " ledseg.h" 定義段碼表和8個數碼管的段碼數組數碼管常用來顯示數字“0~9”和字符“A~F”,他們的段碼定義如下:
代碼清單:段碼表
//數碼管段碼 u8 SEG8_Code[] ={ 0xFC, // 0 0x60, // 1 0xDA, // 2 0xF2, // 3 0x66, // 4 0xB6, // 5 0xBE, // 6 0xE0, // 7 0xFE, // 8 0xF6, // 9 0xEE, // A 0x3E, // b 0x9C, // C 0x7A, // d 0x9E, // E 0x8E, // F };定義一個名稱為“SEG8_DispArray”的數組,用于存放8個數碼管顯示的段碼,初始化值均設置為數字“0”的段碼“0xFC”,數碼管刷新時從該數組讀取段碼,代碼清單如下。
代碼清單: 8位數碼管段碼存放數組
//存放8個數碼管顯示的段碼,初始值都為數字0的段碼。更新數碼管顯示內容時,只需更新該數組中的段碼即可 u8 SEG8_DispArray[8] ={0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}; 數碼管初始化數碼管初始化主要包括引腳配置和數碼管初始顯示狀態的設置,代碼清單如下。這里要注意的是,如果需要改動數碼管初始顯示內容,修改數組SEG8_DispArray中的值即可,默認值是顯示數字“0”。
代碼清單:數碼管初始化
/********************************************************************************** 功能描述:始化數碼管驅動電路所用的GPIO 參 數:無 返 回 值:無 ***********************************************************************************/ void LEDseg_init(void) { P3M1 &= 0xCB; P3M0 |= 0x34; //設置P3.2,P3.4,P3.5為強推挽輸出 P4M1 &= 0xEE; P4M0 &= 0xEE; //設置P4.0,P4.4為準雙向口 P5M1 &= 0xDF; P5M0 &= 0xDF; //設置P5.5為準雙向口 SEG_A0=1; //74HC138第1引腳A0置高電平 SEG_A1=1; //74HC138第2引腳A1置高電平 SEG_A2=1; //74HC138第3引腳A2置高電平 SEG_LCLK=1; //74HC595第12引腳LCLK置高電平 SEG_SCK=0; //74HC595第11引腳SLK置低電平 SEG_DATA=0; //74HC595第14引腳DATA置低電平 } 發送段選和位選信號為了程序中操作方便,我們先用宏定義對8位數碼管中的各個位進行編號,讓數碼管和數組“SEG8_DispArray”關聯。這里要注意一下,開發板為了布線方便,8位數碼管是反序連接到74HC138的輸出“Y0~Y7”的。
代碼清單:數碼管位定義
#define LEDSEG_1 7 #define LEDSEG_2 6 #define LEDSEG_3 5 #define LEDSEG_4 4 #define LEDSEG_5 3 #define LEDSEG_6 2 #define LEDSEG_7 1 #define LEDSEG_8 0程序中先發送段碼信號,8位串行段碼經過74HC595后并行輸出完成數碼管的段選,之后發送位選信號,點亮數碼管,代碼清單如下。
代碼清單:發送段選和位選信號
/********************************************************************************** 功能描述:向指定的數碼管發送段選和位選信號 參 數:nod[in]:數碼管,取值范圍:0~7 返 回 值:無 ***********************************************************************************/ void LEDseg_write_data(u8 nod) { u8 dat,i; dat = SEG8_DispArray[nod]; //獲取段碼 for(i=0;i<8;i++) //循環發送8位段碼 { SEG_DATA=(dat>>i)&0x01; SEG_SCK=0; Delay10us(); SEG_SCK=1; } LEDseg_nodeSelect(nod); //發送數碼管位選信號}發送位選信號的函數代碼清單如下。
代碼清單:發送位選信號函數
/********************************************************************************** 功能描述:發送位選信號,選擇指定的數碼管 參 數:nod[in]:數碼管,取值范圍:0~7 返 回 值:無 ***********************************************************************************/ void LEDseg_nodeSelect(u8 nod) { SEG_A0= nod&0x01; SEG_A1= (nod&0x02)>>1; SEG_A2= (nod&0x04)>>2; } 數碼管刷新本例中使用Timer2刷新數碼管,Timer2定時時間配置為2ms,每次中斷刷新一位數碼管。程序中使用變量“ledseg_nod”記錄數碼管的位,8位數碼管一輪刷新完成后,“ledseg_nod”復位(值設置為0),進入新一輪的刷新,代碼清單如下。
代碼清單:定時器2中斷服務函數中刷新數碼管
/********************************************************************************** * 描 述 : 定時器2中斷服務函數 * 入 參 : 無 * 返回值 : 無 **********************************************************************************/ void timer2_isr() interrupt 12 { LEDseg_write_data(ledseg_nod); //發送段碼 LEDseg_Refresh(); //發送 ledseg_nod++; if(ledseg_nod == 8)ledseg_nod = 0; //8位數碼管刷新完成,ledseg_nod復位 } 主函數主函數中完成相關的初始化之后,在主循環里面調用按鍵掃描函數buttons_scan()查詢是否有按鍵按下,如果有按鍵按下則更新數碼管顯示內容,代碼清單如下。
代碼清單:主函數
/************************************************************************** 功能描述:主函數 入口參數:無 返 回 值:int類型 **************************************************************************/ int main(void) { u8 temp; u8 disp_dat1 = 0,disp_dat2 = 0,disp_dat3 = 0,disp_dat4 = 0; //省略了初始化相關的代碼 while(1) { temp = buttons_scan(0); //獲取開發板用戶按鍵檢測值,不支持連按 if(temp == BUTTON1_PRESSED) //按鍵KEY1按下 { led_toggle(LED_1); //用戶指示燈D1狀態翻轉 disp_dat1++; if(disp_dat1 >0x0F)disp_dat1 = 0; LEDseg_DispUpdata(LEDSEG_1,disp_dat1,LEDSEG_DP_OFF);//更新第1個數碼管顯示內容 LEDseg_DispUpdata(LEDSEG_2,disp_dat1,LEDSEG_DP_OFF);//更新第2個數碼管顯示內容 } else if(temp == BUTTON2_PRESSED) //按鍵KEY2按下 { led_toggle(LED_2); //用戶指示燈D2狀態翻轉 disp_dat2++; if(disp_dat2 >0x0F)disp_dat2 = 0; LEDseg_DispUpdata(LEDSEG_3,disp_dat2,LEDSEG_DP_ON);//更新第3個數碼管顯示內容 LEDseg_DispUpdata(LEDSEG_4,disp_dat2,LEDSEG_DP_ON);//更新第4個數碼管顯示內容 } else if(temp == BUTTON3_PRESSED) //按鍵KEY3按下 { led_toggle(LED_3); //用戶指示燈D3狀態翻轉 disp_dat3++; if(disp_dat3 >0x0F)disp_dat3 = 0; LEDseg_DispUpdata(LEDSEG_5,disp_dat3,LEDSEG_DP_OFF);//更新第5個數碼管顯示內容 LEDseg_DispUpdata(LEDSEG_6,disp_dat3,LEDSEG_DP_OFF);//更新第6個數碼管顯示內容 } else if(temp == BUTTON4_PRESSED) //按鍵KEY4按下 { led_toggle(LED_4); //用戶指示燈D3狀態翻轉 disp_dat4++; if(disp_dat4 >0x0F)disp_dat4 = 0; LEDseg_DispUpdata(LEDSEG_7,disp_dat4,LEDSEG_DP_OFF);//更新第7個數碼管顯示內容 LEDseg_DispUpdata(LEDSEG_8,disp_dat4,LEDSEG_DP_OFF);//更新第8個數碼管顯示內容 } } } 硬件連接按照下圖所示短接跳線帽,因為數碼管和顯示屏復用了GPIO,因此,使用數碼管時不能安裝顯示屏。
圖9:跳線帽短接
實驗步驟解壓“…\\第3部分:配套例程源碼”目錄下的壓縮文件“實驗2-12-1:數碼管顯示實驗”,將解壓后得到的文件夾拷貝到合適的目錄,如“D\\STC8”(這樣做的目的是為了防止中文路徑或者工程存放的路徑過深導致打開工程出現問題)。雙擊“…\\ledseg_disp\\Project”目錄下的工程文件“ledseg_disp.uvproj”。點擊編譯按鈕編譯工程,編譯成功后生成的HEX文件“ledseg_disp.hex”位于工程的“…\\ledseg_disp\\project\\Objects”目錄下。打開STC-ISP軟件下載程序,下載使用內部IRC時鐘,IRC頻率選擇:24MHz。程序運行后,依次按下用戶按鍵KEY1、KEY2、KEY3和KEY4,可以觀察到每按一次按鍵,對應的數碼管顯示內容從“0~F”依次遞增。按下KEY1按鍵:第1、2位數碼管顯示內容遞增。按下KEY2按鍵:第3、4位數碼管顯示內容遞增。按下KEY3按鍵:第5、6位數碼管顯示內容遞增。按下KEY4按鍵:第7、8位數碼管顯示內容遞增。以上就是關于刷卡機顯示應答碼lk的知識,后面我們會繼續為大家整理關于刷卡機顯示應答碼lk的知識,希望能夠幫助到大家!
轉載請帶上網址:http://yadikedp.com/shuaka/146864.html
- 上一篇:刷卡機如何選擇一款適合自己的
- 下一篇:刷卡機12點后可以秒到賬嗎